Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
8e5ca47
Merge pull request #349 from getyoti/development
mehmet-yoti Feb 19, 2024
1e23877
Merge pull request #351 from getyoti/development
mehmet-yoti Feb 21, 2024
c9a2b35
Merge pull request #347 from getyoti/release/4.2.2
mehmet-yoti Feb 21, 2024
f752956
Release/4.3.0 (#364)
mehmet-yoti Jul 31, 2024
df0a9ee
Release 4.3.0 - Update (#366)
mehmet-yoti Aug 1, 2024
4af4eca
Master merge (#370)
mehmet-yoti Sep 10, 2024
7c52d7a
Merge Master Into Development (#368)
mehmet-yoti Sep 10, 2024
9f9b977
Release/4.3.1 (#372)
mehmet-yoti Sep 12, 2024
ce3fd6d
SDK-2472-added-php-idv-support-brand-id-in-session-config (#373)
mehmet-yoti Mar 14, 2025
530285f
Php sdk 2361 add optional attribute flag to sdk (#374)
mehmet-yoti Mar 14, 2025
4bf3fad
Sdk 2535 php sdk issue when retrieving session when a watchlist advan…
mehmet-yoti Mar 14, 2025
22c4a07
Sdk 2487 php support dark mode in idv sdk (#375)
mehmet-yoti Mar 14, 2025
046b040
Release/4.4.0 (#377)
mehmet-yoti Mar 19, 2025
17e9d91
SDK-2265 Retrieve Receipt (#323)
LuborRod Jun 21, 2024
805f520
SDK-2377 added failure reasons to idv (#356)
mehmet-yoti Jun 24, 2024
9a2f1c3
Sdk 2420 php add support for advanced identity profiles to share v 2 …
mehmet-yoti Jul 4, 2024
772a047
Added example for dbs and updated failure details (#362)
mehmet-yoti Jul 30, 2024
b90871f
Merge Master Into Development (#368)
mehmet-yoti Sep 10, 2024
3816902
SDK-2472-added-php-idv-support-brand-id-in-session-config (#373)
mehmet-yoti Mar 14, 2025
c8bda85
Php sdk 2361 add optional attribute flag to sdk (#374)
mehmet-yoti Mar 14, 2025
675a1a1
php 8.4 changes
mehmet-yoti Jun 5, 2025
4057c7e
php 8.4 changes
mehmet-yoti Jun 5, 2025
391cc5f
Merge pull request #380 from getyoti/master
mehmet-yoti Jun 10, 2025
6c7347e
updated env.template file
mehmet-yoti Jun 10, 2025
2abcbde
Merge pull request #381 from getyoti/php-8.4-dev
mehmet-yoti Jun 10, 2025
b927af2
Merge pull request #382 from getyoti/Release/4.4.1
mehmet-yoti Jun 16, 2025
7885700
Update composer.json
mehmet-yoti Jun 16, 2025
c4ff1bf
Update Constants.php
mehmet-yoti Jun 16, 2025
9ade037
Update README.md
mehmet-yoti Jun 16, 2025
3584c1d
Merge pull request #383 from getyoti/update-version-info
mehmet-yoti Jun 16, 2025
a32cc33
docs: add implementation plan for SDK-2767
mehmet-yoti Nov 27, 2025
b2014c9
SDK-2767 added support central auth tokens
mehmet-yoti Feb 19, 2026
478fbbd
SDK-2767 added support central auth tokens
mehmet-yoti Feb 19, 2026
f9f55eb
Upgrade firebase/php-jwt to ^7.0 to resolve security advisory PKSA-y2…
mehmet-yoti Feb 19, 2026
6b8dffb
SDK-2767 fixed for php 7.4 firebase/php-jwt
mehmet-yoti Feb 19, 2026
9de4322
Refactor AuthTokenGenerator to use Guzzle PSR-18, fix trailing query …
mehmet-yoti Feb 19, 2026
4b75de5
SDK-2767 organized for unneccessary files
mehmet-yoti Feb 19, 2026
388eccf
Add support for requesting and retrieving SHARE_CODE resources and tasks
mehmet-yoti Feb 23, 2026
ecde9a9
Replace firebase/php-jwt with phpseclib3 for PS384 signing, fix geten…
mehmet-yoti Feb 23, 2026
10836d5
refactor: parse date fields as DateTime objects and add @throws annot…
mehmet-yoti Feb 23, 2026
499954e
Add advanced identity profile support to DocScan session create/retri…
mehmet-yoti Feb 25, 2026
cae25cb
Merge pull request #400 from getyoti/SDK-2757-php-add-support-for-req…
mehmet-yoti Feb 25, 2026
a2433ef
Merge pull request #399 from getyoti/SDK-2767-support-central-auth-to…
mehmet-yoti Feb 25, 2026
c0cef0a
Sdk 2795 php upgrade to protobuf 4 33 6 and phpseclib 3 0 50 (#408)
mehmet-yoti Apr 8, 2026
6acbf1c
Sdk 2791 php add support for retrieving the extraction image ids fiel…
mehmet-yoti Apr 8, 2026
9ba67c8
Sdk 2742 php expose idv breakdown process property (#410)
mehmet-yoti Apr 8, 2026
648c999
SDK-2793-php-task-response-recommandation added (#404)
mehmet-yoti Apr 8, 2026
83c62fe
SDK-2215 allow rb to supply an applicant profile for identity profile…
mehmet-yoti Apr 8, 2026
56d53ca
Sdk 2296 php allow rb to fetch applicant profile from get sessions (#…
mehmet-yoti Apr 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 43 additions & 18 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ jobs:
# always run on push events
# only run on pull_request_target event when pull request pulls from fork repository
if: >
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
strategy:
fail-fast: false
matrix:
Expand All @@ -31,18 +31,16 @@ jobs:

- run: composer test

php7-4:
name: Unit Tests php7.4 (php ${{ matrix.php-version }})
php8-2:
name: Unit Tests php8.2 (php ${{ matrix.php-version }})
runs-on: ubuntu-latest
# always run on push events
# only run on pull_request_target event when pull request pulls from fork repository
if: >
github.event_name == 'push' ||
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
strategy:
fail-fast: false
matrix:
php-version: [ 7.4 ]
php-version: [ 8.2 ]

steps:
- uses: actions/checkout@v2
Expand All @@ -51,24 +49,24 @@ jobs:
with:
php-version: ${{ matrix.php-version }}

- run: composer remove --dev --no-update --no-interaction friendsofphp/php-cs-fixer

- run: composer self-update

- run: composer install --no-interaction --prefer-source --dev

- run: composer test

php8-0:
name: Unit Tests php8.0 (php ${{ matrix.php-version }})
php8-3:
name: Unit Tests php8.3 (php ${{ matrix.php-version }})
runs-on: ubuntu-latest
# always run on push events
# only run on pull_request_target event when pull request pulls from fork repository
if: >
github.event_name == 'push' ||
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
strategy:
fail-fast: false
matrix:
php-version: [ 8.0 ]
php-version: [ 8.3 ]

steps:
- uses: actions/checkout@v2
Expand All @@ -77,20 +75,48 @@ jobs:
with:
php-version: ${{ matrix.php-version }}

- run: composer remove --dev --no-update --no-interaction friendsofphp/php-cs-fixer

- run: composer self-update

- run: composer install --no-interaction --prefer-source --dev

- run: composer test

php8-4:
name: Unit Tests php8.4 (php ${{ matrix.php-version }})
runs-on: ubuntu-latest
if: >
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
strategy:
fail-fast: false
matrix:
php-version: [ 8.4 ]

steps:
- uses: actions/checkout@v2

- uses: shivammathur/setup-php@2.9.0
with:
php-version: ${{ matrix.php-version }}

- run: composer remove --dev --no-update --no-interaction friendsofphp/php-cs-fixer

- run: composer self-update

- run: composer install --no-interaction --prefer-source --dev

- run: composer test

protobuf:
name: Unit Tests With Protobuf C Extension 3.13 (php ${{ matrix.php-version }})
name: Unit Tests With Protobuf C Extension (php ${{ matrix.php-version }})
runs-on: ubuntu-latest
# always run on push events
# only run on pull_request_target event when pull request pulls from fork repository
if: >
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
github.event_name == 'push' ||
github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != github.repository
strategy:
fail-fast: false
matrix:
Expand All @@ -109,4 +135,3 @@ jobs:
- run: composer install --no-interaction --prefer-source --dev

- run: composer test

1 change: 1 addition & 0 deletions .php-cs-fixer.cache
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"php":"8.1.27","version":"3.22.0:v3.22.0#92b019f6c8d79aa26349d0db7671d37440dc0ff3","indent":" ","lineEnding":"\n","rules":{"array_syntax":{"syntax":"short"},"no_unused_imports":true,"ordered_imports":{"imports_order":["const","class","function"]},"php_unit_fqcn_annotation":true,"phpdoc_return_self_reference":true,"phpdoc_scalar":true},"hashes":{"\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder2419\/examples\/digitalidentity\/app\/Http\/Controllers\/IdentityController.php":"369515522c3efd6cd55a8363d4e97c05","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4308\/src\/Identity\/Policy\/Policy.php":"e1bca74eaafe5271dd1a38769fe1c3b2","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder3692\/src\/Identity\/Policy\/PolicyBuilder.php":"88302b88aba33563661d4b989b5dc429","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder2054\/tests\/Identity\/Policy\/PolicyBuilderTest.php":"a262a261102744a1acf6d5d0b421dc44","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder5221\/src\/Identity\/ReceiptBuilder.php":"2e6ef33d3401f7cbd36145ad66b3b2ef","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder289\/examples\/digitalidentity\/app\/Http\/Controllers\/ReceiptController.php":"e79ec7e1511895c954f77c713d435ad2","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder2348\/tests\/Identity\/ReceiptTest.php":"b602e6828020fef411df597e17fa7c88","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4139\/examples\/digitalidentity\/routes\/web.php":"dcdc77843f3e59dd61467a324edf0c77","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder5396\/src\/Identity\/Receipt.php":"4744c8887009fd9ffbf084f99021eb1c","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder5193\/src\/Identity\/WrappedReceipt.php":"3a77a22be093a1da75438ea2bb9fcb20","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4416\/examples\/digitalidentity\/app\/Http\/Controllers\/AdvancedIdentityController.php":"6b5c23f2ce8da246bc41d136d87ecdb6","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder5544\/examples\/digitalidentity\/app\/Http\/Controllers\/AdvancedIdentityController.php":"6b5c23f2ce8da246bc41d136d87ecdb6","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4533\/src\/Identity\/Policy\/Policy.php":"bea4b7ebb268fca1ad719f933ec82cbd","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder3559\/tests\/Identity\/Policy\/PolicyBuilderTest.php":"f6d7380ae2db4eca426bb39ccfb3a900","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder2922\/examples\/digitalidentity\/routes\/web.php":"fdf260e4dfd18c8ba12078943564875a","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder3947\/src\/Constants.php":"4bb1127c9665c5d0496b90ea3211951d","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4440\/src\/Constants.php":"99a3224f6e3fcae067362798bbab64f0","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder4745\/src\/Constants.php":"afc40e02bdc3a87ff7a874826447c604","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder1311\/src\/Constants.php":"77a8a39eac3e973495b7719ebd41509e","\/private\/var\/folders\/b6\/tqq9d7y54ll62fjfysz50ry80000gn\/T\/PHP CS Fixertemp_folder1635\/examples\/digitalidentity\/app\/Http\/Controllers\/ReceiptController.php":"10f70ffe111a0030b29762494cc5de7d"}}
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,12 @@ Please feel free to reach out

## Requirements

* PHP ^7.4 || ^8.0 || ^8.1
* PHP ^8.1
* CURL PHP extension (must support TLSv1.2)

> **Breaking change:** this SDK release supports PHP 8.1 and above only.
> Support for PHP 7.4 and PHP 8.0 has been removed.
> If you are still running on PHP 7.4/8.0, please remain on an earlier SDK version until you can upgrade your runtime.
### Recommended (optional)
- [Protobuf C extension](https://github.com/protocolbuffers/protobuf/tree/master/php) (PHP package will be used by default)

Expand All @@ -42,13 +45,13 @@ Add the Yoti SDK dependency:

```json
"require": {
"yoti/yoti-php-sdk" : "^4.3.0"
"yoti/yoti-php-sdk" : "^4.5.0"
}
```

Or run this Composer command
```console
$ composer require yoti/yoti-php-sdk "^4.3.0"
$ composer require yoti/yoti-php-sdk "^4.5.0"
```

## Setup
Expand Down
8 changes: 4 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"name": "yoti/yoti-php-sdk",
"description": "Yoti SDK for quickly integrating your PHP backend with Yoti",
"version": "4.3.0",
"version": "4.5.0",
"keywords": [
"yoti",
"sdk"
],
"homepage": "https://yoti.com",
"license": "MIT",
"require": {
"php": "^7.4 || ^8.0 || ^8.1",
"php": "^8.1",
"ext-json": "*",
"google/protobuf": "^3.10",
"phpseclib/phpseclib": "^3.0",
"google/protobuf": "^4.33.6",
"phpseclib/phpseclib": "^3.0.50",
"guzzlehttp/guzzle": "^7.0",
"psr/http-client": "^1.0",
"psr/http-message": "^2.0",
Expand Down
2 changes: 1 addition & 1 deletion examples/digitalidentity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ This example requires [Docker](https://docs.docker.com/)
## Digital Identity(Advanced) Share Example
* Visit [/generate-advanced-identity-share](https://localhost:4002/generate-advanced-identity-share)
* ## Digital Identity DBS Example
* Visit [/generate-dbs-share](https://localhost:4002/generate-dbs-share)
* Visit [/generate-dbs-share](https://localhost:4002/generate-dbs-share)
1 change: 1 addition & 0 deletions examples/digitalidentity/resources/views/dbs.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,5 +85,6 @@ function onErrorListener(...data) {
await onReadyToStart()
}</script>
<script src="https://www.yoti.com/share/client/v2" onload="onClientLoaded()"></script>

</body>
</html>
2 changes: 1 addition & 1 deletion examples/digitalidentity/routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@
Route::get('/generate-advanced-identity-share', 'AdvancedIdentityController@show');
Route::get('/generate-advanced-identity-session', 'AdvancedIdentityController@generateSession');
Route::get('/generate-dbs-share', 'DbsController@show');
Route::get('/generate-dbs-session', 'DbsController@generateSession');
Route::get('/generate-dbs-session', 'DbsController@generateSession');
2 changes: 1 addition & 1 deletion examples/doc-scan/app/Console/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ protected function schedule(Schedule $schedule)
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
$this->load(__DIR__ . '/Commands');

require base_path('routes/console.php');
}
Expand Down
13 changes: 10 additions & 3 deletions examples/doc-scan/app/Http/Controllers/HomeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,12 @@ public function show(Request $request, DocScanClient $client)
->withMaxRetries(3)
->build()
)
/*
->withRequestedCheck(
(new RequestedWatchlistAdvancedCaCheckBuilder())
->withConfig($customConfig)
->build()
)
)*/
->withRequestedCheck(
(new RequestedFaceMatchCheckBuilder())
->withManualCheckFallback()
Expand Down Expand Up @@ -150,6 +151,12 @@ public function show(Request $request, DocScanClient $client)
->withErrorUrl(config('app.url') . '/error')
->withPrivacyPolicyUrl(config('app.url') . '/privacy-policy')
->withBiometricConsentFlow('EARLY')
->withBrandId('brand_id')
// Suppress specific screens to shorten the flow
->withSuppressedScreens(['intro_screen', 'document_capture_instruction'])
// Or add screens individually:
// ->withSuppressedScreen('intro_screen')
// ->withSuppressedScreen('document_capture_instruction')
->build()
)
->withRequiredDocument(
Expand All @@ -167,14 +174,14 @@ public function show(Request $request, DocScanClient $client)
->withRequiredDocument(
(new RequiredSupplementaryDocumentBuilder())
->withObjective(
(new ProofOfAddressObjectiveBuilder)
(new ProofOfAddressObjectiveBuilder())
->build()
)
->build()
)
->build();


$session = $client->createSession($sessionSpec);

$request->session()->put('YOTI_SESSION_ID', $session->getSessionId());
Expand Down
2 changes: 1 addition & 1 deletion examples/doc-scan/config/cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,6 @@
|
*/

'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache'),

];
2 changes: 1 addition & 1 deletion examples/doc-scan/config/database.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@

'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
],

'default' => [
Expand Down
2 changes: 1 addition & 1 deletion examples/doc-scan/config/filesystems.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'url' => env('APP_URL') . '/storage',
'visibility' => 'public',
],

Expand Down
2 changes: 1 addition & 1 deletion examples/doc-scan/config/session.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@

'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
Str::slug(env('APP_NAME', 'laravel'), '_') . '_session'
),

/*
Expand Down
2 changes: 1 addition & 1 deletion examples/doc-scan/config/yoti.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
return [
'client.sdk.id' => env('YOTI_SDK_ID'),
'doc.scan.iframe.url' => (env('YOTI_DOC_SCAN_API_URL') ?: Constants::DOC_SCAN_API_URL) . '/web/index.html',
'pem.file.path' => (function($filePath) {
'pem.file.path' => (function ($filePath) {
return strpos($filePath, '/') === 0 ? $filePath : base_path($filePath);
})(env('YOTI_KEY_FILE_PATH')),
];
4 changes: 2 additions & 2 deletions examples/doc-scan/public/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
|
*/

require __DIR__.'/../vendor/autoload.php';
require __DIR__ . '/../vendor/autoload.php';

/*
|--------------------------------------------------------------------------
Expand All @@ -35,7 +35,7 @@
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once __DIR__ . '/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions examples/doc-scan/server.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
if ($uri !== '/' && file_exists(__DIR__ . '/public' . $uri)) {
return false;
}

require_once __DIR__.'/public/index.php';
require_once __DIR__ . '/public/index.php';
2 changes: 1 addition & 1 deletion src/Aml/Profile.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class Profile implements \JsonSerializable
* @param \Yoti\Aml\Address $amlAddress
* @param null|string $ssn
*/
public function __construct($givenNames, $familyName, Address $amlAddress, string $ssn = null)
public function __construct(string $givenNames, string $familyName, Address $amlAddress, ?string $ssn = null)
{
$this->givenNames = $givenNames;
$this->familyName = $familyName;
Expand Down
Loading
Loading