Skip to content

Commit

Permalink
Merge pull request #67 from HyperInspire/dev/ios_demo
Browse files Browse the repository at this point in the history
Dev/ios demo
  • Loading branch information
tunmx authored Jun 27, 2024
2 parents 9ae5dbb + f05d9d0 commit 52ca8c9
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 90 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
# Current version
set(INSPIRE_FACE_VERSION_MAJOR 1)
set(INSPIRE_FACE_VERSION_MINOR 1)
set(INSPIRE_FACE_VERSION_PATCH 0)
set(INSPIRE_FACE_VERSION_PATCH 1)

# Converts the version number to a string
string(CONCAT INSPIRE_FACE_VERSION_MAJOR_STR ${INSPIRE_FACE_VERSION_MAJOR})
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ If you require further information on tracking development branches, CI/CD proce

Please contact [contact@insightface.ai](mailto:contact@insightface.ai?subject=InspireFace) for commercial support, including obtaining and integrating higher accuracy models, as well as custom development.

## Top News
## ChangeLogs

**`2024-06-18`** Added face detection feature with tracking-by-detection mode.

Expand Down Expand Up @@ -71,7 +71,7 @@ The '3rdparty' directory already includes the MNN library and specifies a partic
- Adjust and select versions currently supported for specific requirements.

## 2. Compilation
CMake option are used to control the various details of the compilation phase. Please select according to your actual requirements. [Parameter table](doc/CMake-Option.md).
CMake option are used to control the various details of the compilation phase. Please select according to your actual requirements. [CMake Option](doc/CMake-Option.md).

### 2.1. Local Compilation
Make sure OpenCV is installed, you can begin the compilation process. If you are using macOS or Linux, you can quickly compile using the shell scripts provided in the `command` folder at the project root:
Expand Down Expand Up @@ -114,7 +114,7 @@ We have completed the adaptation and testing of the software across various oper
| 5 | | x86/x86_64 | CUDA | ![build](https://img.shields.io/badge/OFFLINE-PASSING-green?style=for-the-badge) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) |
| 6 | **macOS** | Intel x86 | - | ![build](https://img.shields.io/badge/OFFLINE-PASSING-green?style=for-the-badge) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) |
| 7 | | Apple Silicon | - | ![build](https://img.shields.io/badge/OFFLINE-PASSING-green?style=for-the-badge) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) |
| 8 | **iOS** | ARM | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | |
| 8 | **iOS** | ARM | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) |
| 9 | **Android** | ARMv7 | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | |
| 10 | | ARMv8 | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | |

Expand Down
21 changes: 21 additions & 0 deletions cpp/inspireface/c_api/inspireface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,27 @@ void HFDeBugImageStreamImShow(HFImageStream streamHandle) {
#endif
}

HResult HFDeBugImageStreamDecodeSave(HFImageStream streamHandle, HPath savePath) {
if (streamHandle == nullptr) {
INSPIRE_LOGE("Handle error");
return HERR_INVALID_IMAGE_STREAM_HANDLE;
}
HF_CameraStream *stream = (HF_CameraStream* ) streamHandle;
if (stream == nullptr) {
INSPIRE_LOGE("Image error");
return HERR_INVALID_IMAGE_STREAM_HANDLE;
}
auto image = stream->impl.GetScaledImage(1.0f, true);
auto ret = cv::imwrite(savePath, image);
if (ret) {
INSPIRE_LOGE("Image saved successfully to %s", savePath);
return HSUCCEED;
} else {
INSPIRE_LOGE("Failed to save image to %s", savePath);
return -1;
}
}


HResult HFReleaseInspireFaceSession(HFSession handle) {
if (handle == nullptr) {
Expand Down
13 changes: 13 additions & 0 deletions cpp/inspireface/c_api/inspireface.h
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,19 @@ HYPER_CAPI_EXPORT extern HResult HFLogDisable();
*/
HYPER_CAPI_EXPORT extern void HFDeBugImageStreamImShow(HFImageStream streamHandle);

/**
* @brief Decode the image from ImageStream and store it to a disk path.
*
* It is used to verify whether there is a problem with image codec, and can quickly perform bug analysis.
*
* @param streamHandle Handle to the data buffer representing the camera stream component.
* @param savePath The path to which the image is written.
* @return HResult indicating the success or failure of the operation.
*/
HYPER_CAPI_EXPORT extern HResult HFDeBugImageStreamDecodeSave(HFImageStream streamHandle, HPath savePath);




#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion cpp/inspireface/information.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@

#define INSPIRE_FACE_VERSION_MAJOR_STR "1"
#define INSPIRE_FACE_VERSION_MINOR_STR "1"
#define INSPIRE_FACE_VERSION_PATCH_STR "0"
#define INSPIRE_FACE_VERSION_PATCH_STR "1"

#endif //HYPERFACEREPO_INFORMATION_H
2 changes: 1 addition & 1 deletion cpp/inspireface/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
InspireFace Version: 1.1.0
InspireFace Version: 1.1.1
99 changes: 50 additions & 49 deletions doc/Error-Feedback-Codes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,52 +2,53 @@

During the use of InspireFace, some error feedback codes may be generated. Here is a table of error feedback codes.

| **Index** | **Name** | **Code** | **Description** |
| --- | --- | --- | --- |
| 1 | HSUCCEED | 0 | Success |
| 2 | HERR_BASIC_BASE | 1 | Basic error types |
| 3 | HERR_UNKNOWN | 1 | Unknown error |
| 4 | HERR_INVALID_PARAM | 2 | Invalid parameter |
| 5 | HERR_INVALID_IMAGE_STREAM_HANDLE | 25 | Invalid image stream handle |
| 6 | HERR_INVALID_CONTEXT_HANDLE | 26 | Invalid context handle |
| 7 | HERR_INVALID_FACE_TOKEN | 31 | Invalid face token |
| 8 | HERR_INVALID_FACE_FEATURE | 32 | Invalid face feature |
| 9 | HERR_INVALID_FACE_LIST | 33 | Invalid face feature list |
| 10 | HERR_INVALID_BUFFER_SIZE | 34 | Invalid copy token |
| 11 | HERR_INVALID_IMAGE_STREAM_PARAM | 35 | Invalid image param |
| 12 | HERR_INVALID_SERIALIZATION_FAILED | 36 | Invalid face serialization failed |
| 13 | HERR_SESS_BASE | 1280 | Session error types |
| 14 | HERR_SESS_FUNCTION_UNUSABLE | 1282 | Function not usable |
| 15 | HERR_SESS_TRACKER_FAILURE | 1283 | Tracker module not initialized |
| 16 | HERR_SESS_INVALID_RESOURCE | 1290 | Invalid static resource |
| 17 | HERR_SESS_NUM_OF_MODELS_NOT_MATCH | 1291 | Number of models does not match |
| 18 | HERR_SESS_PIPELINE_FAILURE | 1288 | Pipeline module not initialized |
| 19 | HERR_SESS_REC_EXTRACT_FAILURE | 1295 | Face feature extraction not registered |
| 20 | HERR_SESS_REC_DEL_FAILURE | 1296 | Face feature deletion failed due to out of range index |
| 21 | HERR_SESS_REC_UPDATE_FAILURE | 1297 | Face feature update failed due to out of range index |
| 22 | HERR_SESS_REC_ADD_FEAT_EMPTY | 1298 | Feature vector for registration cannot be empty |
| 23 | HERR_SESS_REC_FEAT_SIZE_ERR | 1299 | Incorrect length of feature vector for registration |
| 24 | HERR_SESS_REC_INVALID_INDEX | 1300 | Invalid index number |
| 25 | HERR_SESS_REC_CONTRAST_FEAT_ERR | 1303 | Incorrect length of feature vector for comparison |
| 26 | HERR_SESS_REC_BLOCK_FULL | 1304 | Feature vector block full |
| 27 | HERR_SESS_REC_BLOCK_DEL_FAILURE | 1305 | Deletion failed |
| 28 | HERR_SESS_REC_BLOCK_UPDATE_FAILURE | 1306 | Update failed |
| 29 | HERR_SESS_REC_ID_ALREADY_EXIST | 1307 | ID already exists |
| 30 | HERR_SESS_FACE_DATA_ERROR | 1310 | Face data parsing |
| 31 | HERR_SESS_FACE_REC_OPTION_ERROR | 1320 | An optional parameter is incorrect |
| 32 | HERR_FT_HUB_DISABLE | 1329 | FeatureHub is disabled |
| 33 | HERR_FT_HUB_OPEN_ERROR | 1330 | Database open error |
| 34 | HERR_FT_HUB_NOT_OPENED | 1331 | Database not opened |
| 35 | HERR_FT_HUB_NO_RECORD_FOUND | 1332 | No record found |
| 36 | HERR_FT_HUB_CHECK_TABLE_ERROR | 1333 | Data table check error |
| 37 | HERR_FT_HUB_INSERT_FAILURE | 1334 | Data insertion error |
| 38 | HERR_FT_HUB_PREPARING_FAILURE | 1335 | Data preparation error |
| 39 | HERR_FT_HUB_EXECUTING_FAILURE | 1336 | SQL execution error |
| 40 | HERR_FT_HUB_NOT_VALID_FOLDER_PATH | 1337 | Invalid folder path |
| 41 | HERR_FT_HUB_ENABLE_REPETITION | 1338 | Enable db function repeatedly |
| 42 | HERR_FT_HUB_DISABLE_REPETITION | 1339 | Disable db function repeatedly |
| 43 | HERR_ARCHIVE_LOAD_FAILURE | 1360 | Archive load failure |
| 44 | HERR_ARCHIVE_LOAD_MODEL_FAILURE | 1361 | Model load failure |
| 45 | HERR_ARCHIVE_FILE_FORMAT_ERROR | 1362 | The archive format is incorrect |
| 46 | HERR_ARCHIVE_REPETITION_LOAD | 1363 | Do not reload the model |
| 47 | HERR_ARCHIVE_NOT_LOAD | 1364 | Model not loaded |
| Index | Name | Code | Comment |
| --- | --- | --- | --- |
| 1 | HSUCCEED | 0 | Success |
| 2 | HERR_BASIC_BASE | 1 | Basic error types |
| 3 | HERR_UNKNOWN | 1 | Unknown error |
| 4 | HERR_INVALID_PARAM | 2 | Invalid parameter |
| 5 | HERR_INVALID_IMAGE_STREAM_HANDLE | 25 | Invalid image stream handle |
| 6 | HERR_INVALID_CONTEXT_HANDLE | 26 | Invalid context handle |
| 7 | HERR_INVALID_FACE_TOKEN | 31 | Invalid face token |
| 8 | HERR_INVALID_FACE_FEATURE | 32 | Invalid face feature |
| 9 | HERR_INVALID_FACE_LIST | 33 | Invalid face feature list |
| 10 | HERR_INVALID_BUFFER_SIZE | 34 | Invalid copy token |
| 11 | HERR_INVALID_IMAGE_STREAM_PARAM | 35 | Invalid image param |
| 12 | HERR_INVALID_SERIALIZATION_FAILED | 36 | Invalid face serialization failed |
| 13 | HERR_INVALID_DETECTION_INPUT | 37 | Failed to modify detector input size |
| 14 | HERR_SESS_BASE | 1280 | Session error types |
| 15 | HERR_SESS_FUNCTION_UNUSABLE | 1282 | Function not usable |
| 16 | HERR_SESS_TRACKER_FAILURE | 1283 | Tracker module not initialized |
| 17 | HERR_SESS_INVALID_RESOURCE | 1290 | Invalid static resource |
| 18 | HERR_SESS_NUM_OF_MODELS_NOT_MATCH | 1291 | Number of models does not match |
| 19 | HERR_SESS_PIPELINE_FAILURE | 1288 | Pipeline module not initialized |
| 20 | HERR_SESS_REC_EXTRACT_FAILURE | 1295 | Face feature extraction not registered |
| 21 | HERR_SESS_REC_DEL_FAILURE | 1296 | Face feature deletion failed due to out of range index |
| 22 | HERR_SESS_REC_UPDATE_FAILURE | 1297 | Face feature update failed due to out of range index |
| 23 | HERR_SESS_REC_ADD_FEAT_EMPTY | 1298 | Feature vector for registration cannot be empty |
| 24 | HERR_SESS_REC_FEAT_SIZE_ERR | 1299 | Incorrect length of feature vector for registration |
| 25 | HERR_SESS_REC_INVALID_INDEX | 1300 | Invalid index number |
| 26 | HERR_SESS_REC_CONTRAST_FEAT_ERR | 1303 | Incorrect length of feature vector for comparison |
| 27 | HERR_SESS_REC_BLOCK_FULL | 1304 | Feature vector block full |
| 28 | HERR_SESS_REC_BLOCK_DEL_FAILURE | 1305 | Deletion failed |
| 29 | HERR_SESS_REC_BLOCK_UPDATE_FAILURE | 1306 | Update failed |
| 30 | HERR_SESS_REC_ID_ALREADY_EXIST | 1307 | ID already exists |
| 31 | HERR_SESS_FACE_DATA_ERROR | 1310 | Face data parsing |
| 32 | HERR_SESS_FACE_REC_OPTION_ERROR | 1320 | An optional parameter is incorrect |
| 33 | HERR_FT_HUB_DISABLE | 1329 | FeatureHub is disabled |
| 34 | HERR_FT_HUB_OPEN_ERROR | 1330 | Database open error |
| 35 | HERR_FT_HUB_NOT_OPENED | 1331 | Database not opened |
| 36 | HERR_FT_HUB_NO_RECORD_FOUND | 1332 | No record found |
| 37 | HERR_FT_HUB_CHECK_TABLE_ERROR | 1333 | Data table check error |
| 38 | HERR_FT_HUB_INSERT_FAILURE | 1334 | Data insertion error |
| 39 | HERR_FT_HUB_PREPARING_FAILURE | 1335 | Data preparation error |
| 40 | HERR_FT_HUB_EXECUTING_FAILURE | 1336 | SQL execution error |
| 41 | HERR_FT_HUB_NOT_VALID_FOLDER_PATH | 1337 | Invalid folder path |
| 42 | HERR_FT_HUB_ENABLE_REPETITION | 1338 | Enable db function repeatedly |
| 43 | HERR_FT_HUB_DISABLE_REPETITION | 1339 | Disable db function repeatedly |
| 44 | HERR_ARCHIVE_LOAD_FAILURE | 1360 | Archive load failure |
| 45 | HERR_ARCHIVE_LOAD_MODEL_FAILURE | 1361 | Model load failure |
| 46 | HERR_ARCHIVE_FILE_FORMAT_ERROR | 1362 | The archive format is incorrect |
| 47 | HERR_ARCHIVE_REPETITION_LOAD | 1363 | Do not reload the model |
| 48 | HERR_ARCHIVE_NOT_LOAD | 1364 | Model not loaded |
71 changes: 36 additions & 35 deletions tools/error_table.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,39 @@
| 10 | HERR_INVALID_BUFFER_SIZE | 34 | Invalid copy token |
| 11 | HERR_INVALID_IMAGE_STREAM_PARAM | 35 | Invalid image param |
| 12 | HERR_INVALID_SERIALIZATION_FAILED | 36 | Invalid face serialization failed |
| 13 | HERR_SESS_BASE | 1280 | Session error types |
| 14 | HERR_SESS_FUNCTION_UNUSABLE | 1282 | Function not usable |
| 15 | HERR_SESS_TRACKER_FAILURE | 1283 | Tracker module not initialized |
| 16 | HERR_SESS_INVALID_RESOURCE | 1290 | Invalid static resource |
| 17 | HERR_SESS_NUM_OF_MODELS_NOT_MATCH | 1291 | Number of models does not match |
| 18 | HERR_SESS_PIPELINE_FAILURE | 1288 | Pipeline module not initialized |
| 19 | HERR_SESS_REC_EXTRACT_FAILURE | 1295 | Face feature extraction not registered |
| 20 | HERR_SESS_REC_DEL_FAILURE | 1296 | Face feature deletion failed due to out of range index |
| 21 | HERR_SESS_REC_UPDATE_FAILURE | 1297 | Face feature update failed due to out of range index |
| 22 | HERR_SESS_REC_ADD_FEAT_EMPTY | 1298 | Feature vector for registration cannot be empty |
| 23 | HERR_SESS_REC_FEAT_SIZE_ERR | 1299 | Incorrect length of feature vector for registration |
| 24 | HERR_SESS_REC_INVALID_INDEX | 1300 | Invalid index number |
| 25 | HERR_SESS_REC_CONTRAST_FEAT_ERR | 1303 | Incorrect length of feature vector for comparison |
| 26 | HERR_SESS_REC_BLOCK_FULL | 1304 | Feature vector block full |
| 27 | HERR_SESS_REC_BLOCK_DEL_FAILURE | 1305 | Deletion failed |
| 28 | HERR_SESS_REC_BLOCK_UPDATE_FAILURE | 1306 | Update failed |
| 29 | HERR_SESS_REC_ID_ALREADY_EXIST | 1307 | ID already exists |
| 30 | HERR_SESS_FACE_DATA_ERROR | 1310 | Face data parsing |
| 31 | HERR_SESS_FACE_REC_OPTION_ERROR | 1320 | An optional parameter is incorrect |
| 32 | HERR_FT_HUB_DISABLE | 1329 | FeatureHub is disabled |
| 33 | HERR_FT_HUB_OPEN_ERROR | 1330 | Database open error |
| 34 | HERR_FT_HUB_NOT_OPENED | 1331 | Database not opened |
| 35 | HERR_FT_HUB_NO_RECORD_FOUND | 1332 | No record found |
| 36 | HERR_FT_HUB_CHECK_TABLE_ERROR | 1333 | Data table check error |
| 37 | HERR_FT_HUB_INSERT_FAILURE | 1334 | Data insertion error |
| 38 | HERR_FT_HUB_PREPARING_FAILURE | 1335 | Data preparation error |
| 39 | HERR_FT_HUB_EXECUTING_FAILURE | 1336 | SQL execution error |
| 40 | HERR_FT_HUB_NOT_VALID_FOLDER_PATH | 1337 | Invalid folder path |
| 41 | HERR_FT_HUB_ENABLE_REPETITION | 1338 | Enable db function repeatedly |
| 42 | HERR_FT_HUB_DISABLE_REPETITION | 1339 | Disable db function repeatedly |
| 43 | HERR_ARCHIVE_LOAD_FAILURE | 1360 | Archive load failure |
| 44 | HERR_ARCHIVE_LOAD_MODEL_FAILURE | 1361 | Model load failure |
| 45 | HERR_ARCHIVE_FILE_FORMAT_ERROR | 1362 | The archive format is incorrect |
| 46 | HERR_ARCHIVE_REPETITION_LOAD | 1363 | Do not reload the model |
| 47 | HERR_ARCHIVE_NOT_LOAD | 1364 | Model not loaded |
| 13 | HERR_INVALID_DETECTION_INPUT | 37 | Failed to modify detector input size |
| 14 | HERR_SESS_BASE | 1280 | Session error types |
| 15 | HERR_SESS_FUNCTION_UNUSABLE | 1282 | Function not usable |
| 16 | HERR_SESS_TRACKER_FAILURE | 1283 | Tracker module not initialized |
| 17 | HERR_SESS_INVALID_RESOURCE | 1290 | Invalid static resource |
| 18 | HERR_SESS_NUM_OF_MODELS_NOT_MATCH | 1291 | Number of models does not match |
| 19 | HERR_SESS_PIPELINE_FAILURE | 1288 | Pipeline module not initialized |
| 20 | HERR_SESS_REC_EXTRACT_FAILURE | 1295 | Face feature extraction not registered |
| 21 | HERR_SESS_REC_DEL_FAILURE | 1296 | Face feature deletion failed due to out of range index |
| 22 | HERR_SESS_REC_UPDATE_FAILURE | 1297 | Face feature update failed due to out of range index |
| 23 | HERR_SESS_REC_ADD_FEAT_EMPTY | 1298 | Feature vector for registration cannot be empty |
| 24 | HERR_SESS_REC_FEAT_SIZE_ERR | 1299 | Incorrect length of feature vector for registration |
| 25 | HERR_SESS_REC_INVALID_INDEX | 1300 | Invalid index number |
| 26 | HERR_SESS_REC_CONTRAST_FEAT_ERR | 1303 | Incorrect length of feature vector for comparison |
| 27 | HERR_SESS_REC_BLOCK_FULL | 1304 | Feature vector block full |
| 28 | HERR_SESS_REC_BLOCK_DEL_FAILURE | 1305 | Deletion failed |
| 29 | HERR_SESS_REC_BLOCK_UPDATE_FAILURE | 1306 | Update failed |
| 30 | HERR_SESS_REC_ID_ALREADY_EXIST | 1307 | ID already exists |
| 31 | HERR_SESS_FACE_DATA_ERROR | 1310 | Face data parsing |
| 32 | HERR_SESS_FACE_REC_OPTION_ERROR | 1320 | An optional parameter is incorrect |
| 33 | HERR_FT_HUB_DISABLE | 1329 | FeatureHub is disabled |
| 34 | HERR_FT_HUB_OPEN_ERROR | 1330 | Database open error |
| 35 | HERR_FT_HUB_NOT_OPENED | 1331 | Database not opened |
| 36 | HERR_FT_HUB_NO_RECORD_FOUND | 1332 | No record found |
| 37 | HERR_FT_HUB_CHECK_TABLE_ERROR | 1333 | Data table check error |
| 38 | HERR_FT_HUB_INSERT_FAILURE | 1334 | Data insertion error |
| 39 | HERR_FT_HUB_PREPARING_FAILURE | 1335 | Data preparation error |
| 40 | HERR_FT_HUB_EXECUTING_FAILURE | 1336 | SQL execution error |
| 41 | HERR_FT_HUB_NOT_VALID_FOLDER_PATH | 1337 | Invalid folder path |
| 42 | HERR_FT_HUB_ENABLE_REPETITION | 1338 | Enable db function repeatedly |
| 43 | HERR_FT_HUB_DISABLE_REPETITION | 1339 | Disable db function repeatedly |
| 44 | HERR_ARCHIVE_LOAD_FAILURE | 1360 | Archive load failure |
| 45 | HERR_ARCHIVE_LOAD_MODEL_FAILURE | 1361 | Model load failure |
| 46 | HERR_ARCHIVE_FILE_FORMAT_ERROR | 1362 | The archive format is incorrect |
| 47 | HERR_ARCHIVE_REPETITION_LOAD | 1363 | Do not reload the model |
| 48 | HERR_ARCHIVE_NOT_LOAD | 1364 | Model not loaded |

0 comments on commit 52ca8c9

Please sign in to comment.