@trustchex/react-native-sdk 1.381.0 → 1.464.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
  2. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +60 -13
  3. package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +1 -1
  4. package/ios/Camera/TrustchexCameraView.swift +10 -13
  5. package/ios/MLKit/MLKitModule.swift +1 -1
  6. package/lib/module/Screens/Debug/BarcodeTestScreen.js +308 -0
  7. package/lib/module/Screens/Debug/MRZTestScreen.js +105 -13
  8. package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
  9. package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +49 -32
  10. package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +22 -4
  11. package/lib/module/Screens/Dynamic/IdentityDocumentScanningScreen.js +5 -0
  12. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +126 -27
  13. package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
  14. package/lib/module/Screens/Dynamic/VideoCallScreen.js +678 -0
  15. package/lib/module/Screens/Static/OTPVerificationScreen.js +6 -0
  16. package/lib/module/Screens/Static/QrCodeScanningScreen.js +7 -1
  17. package/lib/module/Screens/Static/ResultScreen.js +154 -34
  18. package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +59 -51
  19. package/lib/module/Shared/Animations/recording.json +1 -0
  20. package/lib/module/Shared/Animations/video-call.json +1 -0
  21. package/lib/module/Shared/Components/DebugNavigationPanel.js +231 -67
  22. package/lib/module/Shared/Components/EIDScanner.js +213 -112
  23. package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
  24. package/lib/module/Shared/Components/IdentityDocumentCamera.js +77 -39
  25. package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
  26. package/lib/module/Shared/Components/NavigationManager.js +39 -19
  27. package/lib/module/Shared/Contexts/AppContext.js +1 -0
  28. package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
  29. package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
  30. package/lib/module/Shared/EIDReader/bacKey.js +16 -2
  31. package/lib/module/Shared/EIDReader/eidReader.js +354 -13
  32. package/lib/module/Shared/EIDReader/eidService.js +25 -1
  33. package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
  34. package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
  35. package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
  36. package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
  37. package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
  38. package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
  39. package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
  40. package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
  41. package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
  42. package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
  43. package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
  44. package/lib/module/Shared/Libs/SignalingClient.js +128 -0
  45. package/lib/module/Shared/Libs/analytics.utils.js +8 -0
  46. package/lib/module/Shared/Libs/contains.js +1 -40
  47. package/lib/module/Shared/Libs/country-display.utils.js +34 -0
  48. package/lib/module/Shared/Libs/deeplink.utils.js +9 -1
  49. package/lib/module/Shared/Libs/demo.utils.js +8 -0
  50. package/lib/module/Shared/Libs/http-client.js +9 -0
  51. package/lib/module/Shared/Libs/mrz.utils.js +3 -2
  52. package/lib/module/Shared/Libs/promise.utils.js +16 -2
  53. package/lib/module/Shared/Libs/status-bar.utils.js +23 -0
  54. package/lib/module/Shared/Services/DataUploadService.js +294 -0
  55. package/lib/module/Shared/Services/VideoSessionService.js +156 -0
  56. package/lib/module/Shared/Services/WebRTCService.js +510 -0
  57. package/lib/module/Shared/Types/analytics.types.js +4 -0
  58. package/lib/module/Translation/Resources/en.js +61 -2
  59. package/lib/module/Translation/Resources/tr.js +61 -2
  60. package/lib/module/Trustchex.js +64 -20
  61. package/lib/module/version.js +1 -1
  62. package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts +3 -0
  63. package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts.map +1 -0
  64. package/lib/typescript/src/Screens/Debug/MRZTestScreen.d.ts.map +1 -1
  65. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
  66. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
  67. package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
  68. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
  69. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentScanningScreen.d.ts.map +1 -1
  70. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  71. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
  72. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
  73. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts +3 -0
  74. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -0
  75. package/lib/typescript/src/Screens/Static/OTPVerificationScreen.d.ts.map +1 -1
  76. package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
  77. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  78. package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
  79. package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
  80. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  81. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  82. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
  83. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
  84. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
  85. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
  86. package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
  87. package/lib/typescript/src/Shared/Contexts/AppContext.d.ts +1 -0
  88. package/lib/typescript/src/Shared/Contexts/AppContext.d.ts.map +1 -1
  89. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
  90. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
  91. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
  92. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
  93. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
  94. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
  95. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  96. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
  97. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
  98. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
  99. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
  100. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
  101. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
  102. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
  103. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
  104. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
  105. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
  106. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
  107. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
  108. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
  109. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
  110. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
  111. package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
  112. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
  113. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
  114. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
  115. package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts +24 -0
  116. package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts.map +1 -0
  117. package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
  118. package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
  119. package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
  120. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
  121. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
  122. package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
  123. package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
  124. package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
  125. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  126. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  127. package/lib/typescript/src/Shared/Libs/promise.utils.d.ts.map +1 -1
  128. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts +9 -0
  129. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -0
  130. package/lib/typescript/src/Shared/Services/DataUploadService.d.ts +25 -0
  131. package/lib/typescript/src/Shared/Services/DataUploadService.d.ts.map +1 -0
  132. package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts +33 -0
  133. package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts.map +1 -0
  134. package/lib/typescript/src/Shared/Services/WebRTCService.d.ts +58 -0
  135. package/lib/typescript/src/Shared/Services/WebRTCService.d.ts.map +1 -0
  136. package/lib/typescript/src/Shared/Types/analytics.types.d.ts +4 -0
  137. package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
  138. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +13 -1
  139. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
  140. package/lib/typescript/src/Translation/Resources/en.d.ts +60 -1
  141. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  142. package/lib/typescript/src/Translation/Resources/tr.d.ts +60 -1
  143. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  144. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  145. package/lib/typescript/src/version.d.ts +1 -1
  146. package/package.json +35 -5
  147. package/src/Screens/Debug/BarcodeTestScreen.tsx +317 -0
  148. package/src/Screens/Debug/MRZTestScreen.tsx +107 -13
  149. package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
  150. package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +58 -35
  151. package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +27 -4
  152. package/src/Screens/Dynamic/IdentityDocumentScanningScreen.tsx +6 -0
  153. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +156 -27
  154. package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
  155. package/src/Screens/Dynamic/VideoCallScreen.tsx +766 -0
  156. package/src/Screens/Static/OTPVerificationScreen.tsx +6 -0
  157. package/src/Screens/Static/QrCodeScanningScreen.tsx +7 -1
  158. package/src/Screens/Static/ResultScreen.tsx +235 -48
  159. package/src/Screens/Static/VerificationSessionCheckScreen.tsx +67 -72
  160. package/src/Shared/Animations/recording.json +1 -0
  161. package/src/Shared/Animations/video-call.json +1 -0
  162. package/src/Shared/Components/DebugNavigationPanel.tsx +252 -51
  163. package/src/Shared/Components/EIDScanner.tsx +223 -116
  164. package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
  165. package/src/Shared/Components/IdentityDocumentCamera.tsx +224 -188
  166. package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
  167. package/src/Shared/Components/NavigationManager.tsx +41 -19
  168. package/src/Shared/Contexts/AppContext.ts +2 -0
  169. package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
  170. package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
  171. package/src/Shared/EIDReader/bacKey.ts +24 -8
  172. package/src/Shared/EIDReader/eidReader.ts +398 -12
  173. package/src/Shared/EIDReader/eidService.ts +49 -1
  174. package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
  175. package/src/Shared/EIDReader/paceInfo.ts +159 -0
  176. package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
  177. package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
  178. package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
  179. package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
  180. package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
  181. package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
  182. package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
  183. package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
  184. package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
  185. package/src/Shared/Libs/SignalingClient.ts +189 -0
  186. package/src/Shared/Libs/analytics.utils.ts +8 -0
  187. package/src/Shared/Libs/contains.ts +0 -53
  188. package/src/Shared/Libs/country-display.utils.ts +55 -0
  189. package/src/Shared/Libs/crypto.utils.ts +2 -2
  190. package/src/Shared/Libs/deeplink.utils.ts +12 -1
  191. package/src/Shared/Libs/demo.utils.ts +10 -0
  192. package/src/Shared/Libs/http-client.ts +19 -1
  193. package/src/Shared/Libs/mrz.utils.ts +3 -2
  194. package/src/Shared/Libs/promise.utils.ts +16 -2
  195. package/src/Shared/Libs/status-bar.utils.ts +21 -0
  196. package/src/Shared/Services/DataUploadService.ts +395 -0
  197. package/src/Shared/Services/VideoSessionService.ts +190 -0
  198. package/src/Shared/Services/WebRTCService.ts +636 -0
  199. package/src/Shared/Types/analytics.types.ts +4 -0
  200. package/src/Shared/Types/identificationInfo.ts +16 -1
  201. package/src/Translation/Resources/en.ts +88 -3
  202. package/src/Translation/Resources/tr.ts +89 -3
  203. package/src/Trustchex.tsx +65 -19
  204. package/src/version.ts +1 -1
@@ -6,10 +6,16 @@ import AppContext from "../../Shared/Contexts/AppContext.js";
6
6
  import QrCodeScannerCamera from "../../Shared/Components/QrCodeScannerCamera.js";
7
7
  import { useNavigation } from '@react-navigation/native';
8
8
  import { handleDeepLink } from "../../Shared/Libs/deeplink.utils.js";
9
+ import { useKeepAwake } from "../../Shared/Libs/native-keep-awake.utils.js";
10
+ import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
9
11
  import { jsx as _jsx } from "react/jsx-runtime";
10
12
  const QrCodeScanningScreen = () => {
13
+ useKeepAwake();
11
14
  const appContext = React.useContext(AppContext);
12
15
  const navigation = useNavigation();
16
+
17
+ // Configure status bar for white background
18
+ useStatusBarWhiteBackground();
13
19
  const onQrCodeScanned = data => {
14
20
  const [bUrl, sId] = handleDeepLink({
15
21
  url: data
@@ -25,7 +31,7 @@ const QrCodeScanningScreen = () => {
25
31
  } else {
26
32
  appContext.identificationInfo.sessionId = sId;
27
33
  }
28
- navigation.navigate('VerificationSessionCheckScreen');
34
+ navigation.goBack();
29
35
  }
30
36
  };
31
37
  const onClose = () => {
@@ -9,7 +9,9 @@ import RNFS from 'react-native-fs';
9
9
  import NativeProgressBar from "../../Shared/Components/NativeProgressBar.js";
10
10
  import LottieView from 'lottie-react-native';
11
11
  import { runWithRetry } from "../../Shared/Libs/promise.utils.js";
12
+ import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
12
13
  import NavigationManager from "../../Shared/Components/NavigationManager.js";
14
+ import { getLocalizedCountryName } from "../../Shared/Libs/country-display.utils.js";
13
15
  import mrzUtils from "../../Shared/Libs/mrz.utils.js";
14
16
  import { useTranslation } from 'react-i18next';
15
17
  import { Video as VideoCompressor } from 'react-native-compressor';
@@ -26,15 +28,20 @@ const ResultScreen = () => {
26
28
  const [isSubmitting, setIsSubmitting] = useState(false);
27
29
  const [progress, setProgress] = useState(0);
28
30
  const navigationManagerRef = React.useRef(null);
31
+ const hasSubmittedRef = React.useRef(false);
29
32
  const [shouldShowDemoData, setShouldShowDemoData] = useState(false);
30
33
  const [deviceIdentifier, setDeviceIdentifier] = useState('');
31
34
  const {
32
- t
35
+ t,
36
+ i18n
33
37
  } = useTranslation();
34
38
  const insets = useSafeAreaInsets();
35
39
 
36
40
  // Track screen view and exit
37
41
  useScreenTracking('result_screen');
42
+
43
+ // Configure status bar for white background
44
+ useStatusBarWhiteBackground();
38
45
  const formatDate = useCallback(dateStr => {
39
46
  if (!dateStr) return '';
40
47
  try {
@@ -45,7 +52,7 @@ const ResultScreen = () => {
45
52
  const dd = dateStr.substring(4, 6);
46
53
 
47
54
  // Assume 19xx if YY >= 50, else 20xx
48
- const year = parseInt(yy) >= 50 ? `19${yy}` : `20${yy}`;
55
+ const year = parseInt(yy, 10) >= 50 ? `19${yy}` : `20${yy}`;
49
56
  return `${dd}/${mm}/${year}`;
50
57
  }
51
58
 
@@ -62,14 +69,36 @@ const ResultScreen = () => {
62
69
  return dateStr;
63
70
  }
64
71
  }, []);
72
+ const formatGender = useCallback(code => {
73
+ switch (code?.toUpperCase()) {
74
+ case 'M':
75
+ return t('eidScannerScreen.genderMale');
76
+ case 'F':
77
+ return t('eidScannerScreen.genderFemale');
78
+ default:
79
+ return t('eidScannerScreen.genderUnspecified');
80
+ }
81
+ }, [t]);
82
+ const formatDocumentType = useCallback(code => {
83
+ if (!code) return '';
84
+ const upper = code.toUpperCase();
85
+ if (upper.startsWith('P')) return t('eidScannerScreen.docTypePassport');
86
+ if (upper.startsWith('I')) return t('eidScannerScreen.docTypeID');
87
+ if (upper.startsWith('A')) return t('eidScannerScreen.docTypeResidence');
88
+ if (upper.startsWith('V')) return t('eidScannerScreen.docTypeVisa');
89
+ return code;
90
+ }, [t]);
91
+ const formatNationality = useCallback(code => {
92
+ return getLocalizedCountryName(code, i18n.language);
93
+ }, [i18n.language]);
65
94
  const apiUrl = useMemo(() => `${appContext.baseUrl}/api/app/mobile`, [appContext.baseUrl]);
66
95
  useEffect(() => {
67
- if (appContext.isDemoSession) {
96
+ if (appContext.isDemoSession || appContext.isTestVideoSession) {
68
97
  setShouldShowDemoData(true);
69
98
  // Generate device identifier for demo
70
99
  NativeDeviceInfo.generateHumanReadableIdentifier().then(setDeviceIdentifier);
71
100
  }
72
- }, [appContext.identificationInfo.identificationId, appContext.isDemoSession]);
101
+ }, [appContext.identificationInfo.identificationId, appContext.isDemoSession, appContext.isTestVideoSession]);
73
102
  const createIdentification = useCallback(async identificationId => {
74
103
  await httpClient.post(`${apiUrl}/identifications/${identificationId}`, null);
75
104
  }, [apiUrl]);
@@ -118,17 +147,21 @@ const ResultScreen = () => {
118
147
  if (!scannedDocument.mrzFields) {
119
148
  throw new Error('MRZ fields not found');
120
149
  }
150
+
151
+ // Backend payload must contain raw MRZ data only.
152
+ // Human-friendly formatting is strictly for UI rendering paths.
153
+ const rawMrzFields = scannedDocument.mrzFields;
121
154
  const identificationDocument = {
122
- type: scannedDocument.mrzFields.documentCode,
123
- name: scannedDocument.mrzFields.firstName,
124
- surname: scannedDocument.mrzFields.lastName,
125
- gender: getGenderEnumType(scannedDocument.mrzFields.sex),
126
- number: scannedDocument.mrzFields.documentNumber,
127
- country: scannedDocument.mrzFields.issuingState,
155
+ type: rawMrzFields.documentCode,
156
+ name: rawMrzFields.firstName,
157
+ surname: rawMrzFields.lastName,
158
+ gender: getGenderEnumType(rawMrzFields.sex),
159
+ number: rawMrzFields.documentNumber,
160
+ country: rawMrzFields.issuingState,
128
161
  barcodeValue: scannedDocument.barcodeValue,
129
- personalNumber: scannedDocument.mrzFields.personalNumber || scannedDocument.mrzFields.optional1,
130
- birthDate: mrzUtils.convertMRZDateToISODate(scannedDocument.mrzFields.birthDate),
131
- expiryDate: mrzUtils.convertMRZDateToISODate(scannedDocument.mrzFields.expirationDate),
162
+ personalNumber: rawMrzFields.personalNumber || rawMrzFields.optional1,
163
+ birthDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.birthDate),
164
+ expiryDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.expirationDate),
132
165
  dataSource: scannedDocument.dataSource,
133
166
  mrzText: scannedDocument.mrzText
134
167
  };
@@ -141,7 +174,12 @@ const ResultScreen = () => {
141
174
  nonce
142
175
  });
143
176
  }, [apiUrl, getGenderEnumType]);
144
- const uploadIdentificationMedia = useCallback(async (identificationId, scannedIdentityDocument, livenessDetection) => {
177
+ const uploadIdentificationMedia = useCallback(async (identificationId, scannedIdentityDocument, livenessDetection, skipIfAlreadyUploaded) => {
178
+ // Skip media upload if already uploaded during video call
179
+ if (skipIfAlreadyUploaded) {
180
+ console.log('[ResultScreen] Media already uploaded during video call, skipping');
181
+ return;
182
+ }
145
183
  const uploadFileOptions = {
146
184
  toUrl: `${apiUrl}/identifications/${identificationId}/media`,
147
185
  method: 'POST',
@@ -176,7 +214,7 @@ const ResultScreen = () => {
176
214
  const faceImage = scannedIdentityDocument?.faceImage;
177
215
  if (faceImage && faceImage !== '') {
178
216
  scannedIdentityDocument.faceImageMimeType ||= 'image/jpeg';
179
- const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : 'jpg';
217
+ const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : scannedIdentityDocument.faceImageMimeType === 'image/png' ? 'png' : 'jpg';
180
218
  await RNFS.writeFile(decodeURIComponent(`${RNFS.TemporaryDirectoryPath}/FACE_IMAGE.${extension}`), faceImage, 'base64');
181
219
  uploadFileOptions.files.push({
182
220
  name: 'files',
@@ -229,8 +267,9 @@ const ResultScreen = () => {
229
267
  if (livenessVideoPath) {
230
268
  let videoFilePath;
231
269
  if (Platform.OS === 'ios') {
232
- await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}`);
233
- videoFilePath = `${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}/LIVENESS_VIDEO.mp4`;
270
+ const tmpTimestamp = new Date().getTime();
271
+ await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
272
+ videoFilePath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/LIVENESS_VIDEO.mp4`;
234
273
  } else {
235
274
  videoFilePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`;
236
275
  }
@@ -259,11 +298,60 @@ const ResultScreen = () => {
259
298
  });
260
299
  }
261
300
  }
301
+ if (uploadFileOptions.files.length === 0) {
302
+ return;
303
+ }
262
304
  const response = await RNFS.uploadFiles(uploadFileOptions).promise;
263
305
  if (![200, 201, 204].includes(response.statusCode)) {
264
306
  throw new Error('Media upload failed');
265
307
  }
266
308
  }, [apiUrl]);
309
+ const uploadVerbalConsentVideos = useCallback(async (identificationId, verbalConsentVideos) => {
310
+ if (!verbalConsentVideos?.length) {
311
+ return;
312
+ }
313
+ for (const consentVideo of verbalConsentVideos) {
314
+ const normalizedPath = consentVideo.videoPath.replace('file://', '');
315
+ let targetPath;
316
+ if (Platform.OS === 'ios') {
317
+ const tmpTimestamp = new Date().getTime();
318
+ await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
319
+ targetPath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/VERBAL_CONSENT_VIDEO.mp4`;
320
+ } else {
321
+ targetPath = `${RNFS.TemporaryDirectoryPath}/VERBAL_CONSENT_VIDEO.mp4`;
322
+ }
323
+ await RNFS.copyFile(normalizedPath, targetPath);
324
+ const compressedVideoPath = await VideoCompressor.compress(targetPath, {
325
+ compressionMethod: 'manual',
326
+ bitrate: 500000,
327
+ // 500 kbps
328
+ maxSize: 1280,
329
+ // HD 720p
330
+ minimumFileSizeForCompress: 0 // Always compress
331
+ });
332
+ const compressedNormalizedPath = compressedVideoPath.replace('file://', '');
333
+ const response = await RNFS.uploadFiles({
334
+ toUrl: `${apiUrl}/identifications/${identificationId}/media`,
335
+ method: 'POST',
336
+ headers: {
337
+ Accept: 'application/json'
338
+ },
339
+ fields: {
340
+ consentTitle: consentVideo.title,
341
+ consentText: consentVideo.text
342
+ },
343
+ files: [{
344
+ name: 'files',
345
+ filename: 'VERBAL_CONSENT_VIDEO.mp4',
346
+ filepath: compressedNormalizedPath,
347
+ filetype: 'video/mp4'
348
+ }]
349
+ }).promise;
350
+ if (![200, 201, 204].includes(response.statusCode)) {
351
+ throw new Error('Verbal consent video upload failed');
352
+ }
353
+ }
354
+ }, [apiUrl]);
267
355
  const submit = useCallback(async identificationInfo => {
268
356
  try {
269
357
  setIsSubmitting(true);
@@ -271,18 +359,24 @@ const ResultScreen = () => {
271
359
  if (!identificationId) {
272
360
  throw new Error('IdentificationId not found');
273
361
  }
362
+ const alreadyUploaded = !!identificationInfo.mediaUploadedDuringVideoCall;
274
363
  const sessionKey = await runWithRetry(() => getSessionKey(apiUrl, appContext.identificationInfo.sessionId));
275
- await runWithRetry(() => createIdentification(identificationId));
364
+ if (!alreadyUploaded) {
365
+ await runWithRetry(() => createIdentification(identificationId));
366
+ }
276
367
  setProgress(20);
277
368
  await runWithRetry(() => submitIdentificationConsent(identificationId, sessionKey));
278
369
  setProgress(30);
279
- const scannedIdentityDocument = identificationInfo.scannedDocument;
280
- if (scannedIdentityDocument && scannedIdentityDocument.documentType !== 'UNKNOWN') {
281
- await runWithRetry(() => submitIdentificationDocument(identificationId, scannedIdentityDocument, sessionKey));
370
+ if (!alreadyUploaded) {
371
+ const scannedIdentityDocument = identificationInfo.scannedDocument;
372
+ if (scannedIdentityDocument && scannedIdentityDocument.documentType !== 'UNKNOWN') {
373
+ await runWithRetry(() => submitIdentificationDocument(identificationId, scannedIdentityDocument, sessionKey));
374
+ }
375
+ setProgress(40);
376
+ const livenessDetection = identificationInfo.livenessDetection;
377
+ await runWithRetry(() => uploadIdentificationMedia(identificationId, scannedIdentityDocument, livenessDetection, false));
282
378
  }
283
- setProgress(40);
284
- const livenessDetection = identificationInfo.livenessDetection;
285
- await runWithRetry(() => uploadIdentificationMedia(identificationId, scannedIdentityDocument, livenessDetection));
379
+ await runWithRetry(() => uploadVerbalConsentVideos(identificationId, identificationInfo.verbalConsentVideos));
286
380
  setProgress(90);
287
381
  await runWithRetry(() => finishIdentification(identificationId, sessionKey));
288
382
  setProgress(100);
@@ -311,14 +405,15 @@ const ResultScreen = () => {
311
405
  appContext.onError?.(t('resultScreen.submissionFailed'));
312
406
  navigationManagerRef.current?.reset();
313
407
  }
314
- }, [createIdentification, apiUrl, uploadIdentificationMedia, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
408
+ }, [createIdentification, apiUrl, uploadIdentificationMedia, uploadVerbalConsentVideos, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
315
409
  useEffect(() => {
316
- if (appContext.identificationInfo && !appContext.isDemoSession) {
410
+ if (appContext.identificationInfo && !appContext.isDemoSession && !appContext.isTestVideoSession && !hasSubmittedRef.current) {
411
+ hasSubmittedRef.current = true;
317
412
  submit(appContext.identificationInfo);
318
413
  }
319
- }, [appContext.identificationInfo, appContext.isDemoSession, submit]);
414
+ }, [appContext.identificationInfo, appContext.isDemoSession, appContext.isTestVideoSession, submit]);
320
415
  useEffect(() => {
321
- if (progress === 100 && !appContext.isDemoSession) {
416
+ if (progress === 100 && !appContext.isDemoSession && !appContext.isTestVideoSession) {
322
417
  setTimeout(() => {
323
418
  appContext.onCompleted?.();
324
419
  navigationManagerRef.current?.reset();
@@ -377,7 +472,7 @@ const ResultScreen = () => {
377
472
  children: [t('eidScannerScreen.documentCode'), ":"]
378
473
  }), /*#__PURE__*/_jsx(Text, {
379
474
  style: styles.mrzInfoText,
380
- children: appContext.identificationInfo.scannedDocument.mrzFields?.documentCode
475
+ children: formatDocumentType(appContext.identificationInfo.scannedDocument.mrzFields?.documentCode)
381
476
  })]
382
477
  }), /*#__PURE__*/_jsxs(View, {
383
478
  style: styles.mrzInfoItem,
@@ -386,7 +481,7 @@ const ResultScreen = () => {
386
481
  children: [t('eidScannerScreen.nationality'), ":"]
387
482
  }), /*#__PURE__*/_jsx(Text, {
388
483
  style: styles.mrzInfoText,
389
- children: appContext.identificationInfo.scannedDocument.mrzFields?.issuingState
484
+ children: formatNationality(appContext.identificationInfo.scannedDocument.mrzFields?.nationality || appContext.identificationInfo.scannedDocument.mrzFields?.issuingState)
390
485
  })]
391
486
  }), /*#__PURE__*/_jsxs(View, {
392
487
  style: styles.mrzInfoItem,
@@ -440,7 +535,7 @@ const ResultScreen = () => {
440
535
  children: [t('eidScannerScreen.gender'), ":"]
441
536
  }), /*#__PURE__*/_jsx(Text, {
442
537
  style: styles.mrzInfoText,
443
- children: appContext.identificationInfo.scannedDocument.mrzFields?.sex
538
+ children: formatGender(appContext.identificationInfo.scannedDocument.mrzFields?.sex)
444
539
  })]
445
540
  }), /*#__PURE__*/_jsxs(View, {
446
541
  style: styles.mrzInfoItem,
@@ -586,6 +681,30 @@ const ResultScreen = () => {
586
681
  }, index))
587
682
  })
588
683
  })]
684
+ }), !!appContext.identificationInfo.verbalConsentVideos?.length && /*#__PURE__*/_jsxs(_Fragment, {
685
+ children: [/*#__PURE__*/_jsx(Text, {
686
+ style: styles.sectionHeader,
687
+ children: t('resultScreen.demoVerbalConsent')
688
+ }), appContext.identificationInfo.verbalConsentVideos.map((consentVideo, index) => /*#__PURE__*/_jsxs(View, {
689
+ children: [/*#__PURE__*/_jsxs(Text, {
690
+ style: styles.sectionText,
691
+ children: [t('resultScreen.demoVerbalConsentTitle'), ":", ' ', consentVideo.title]
692
+ }), /*#__PURE__*/_jsxs(Text, {
693
+ style: styles.sectionText,
694
+ children: [t('resultScreen.demoVerbalConsentText'), ":", ' ', consentVideo.text]
695
+ }), /*#__PURE__*/_jsx(Text, {
696
+ style: styles.sectionText,
697
+ children: t('resultScreen.demoVideo')
698
+ }), /*#__PURE__*/_jsx(Video, {
699
+ source: {
700
+ uri: consentVideo.videoPath
701
+ },
702
+ resizeMode: "contain",
703
+ style: styles.video,
704
+ controls: true,
705
+ muted: false
706
+ })]
707
+ }, `${consentVideo.videoPath}-${index}`))]
589
708
  })]
590
709
  })
591
710
  }), /*#__PURE__*/_jsx(View, {
@@ -674,9 +793,10 @@ const styles = StyleSheet.create({
674
793
  },
675
794
  image: {
676
795
  width: 100,
677
- height: 100,
678
- objectFit: 'contain',
679
- borderRadius: 8
796
+ height: 140,
797
+ objectFit: 'cover',
798
+ borderRadius: 12,
799
+ overflow: 'hidden'
680
800
  },
681
801
  imageItem: {
682
802
  display: 'flex',
@@ -14,27 +14,31 @@ import { analyticsService } from "../../Shared/Services/AnalyticsService.js";
14
14
  import { useTheme } from "../../Shared/Contexts/ThemeContext.js";
15
15
  import LottieView from 'lottie-react-native';
16
16
  import { getSimulatedDemoData, isDemoSession } from "../../Shared/Libs/demo.utils.js";
17
- import { useNavigation, useFocusEffect } from '@react-navigation/native';
17
+ import { useNavigation } from '@react-navigation/native';
18
18
  import { SESSION_CODE_CHARSET_PATTERN, SESSION_CODE_VALIDATION_PATTERN } from "../../Shared/Constants/validation.constants.js";
19
19
  import { trackError, trackFunnelStep, useScreenTracking } from "../../Shared/Libs/analytics.utils.js";
20
+ import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
20
21
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
21
22
  const VerificationSessionCheckScreen = () => {
22
23
  const [sessionCode, setSessionCode] = useState('');
23
24
  const [isCheckingSession, setIsCheckingSession] = useState(false);
24
25
  const isCheckingSessionRef = useRef(false);
26
+ const checkedSessionIdRef = useRef('');
25
27
  const appContext = useContext(AppContext);
26
28
  const {
27
29
  t
28
30
  } = useTranslation();
29
31
  const navigationManagerRef = React.useRef(null);
30
32
  const navigation = useNavigation();
31
- const initialized = useRef(false);
32
33
  const insets = useSafeAreaInsets();
33
34
  const theme = useTheme();
34
35
  const primaryColor = theme.colors.primary;
35
36
 
36
37
  // Track screen view and exit
37
38
  useScreenTracking('verification_session_check');
39
+
40
+ // Configure status bar for white background
41
+ useStatusBarWhiteBackground();
38
42
  const apiUrl = useMemo(() => `${appContext.baseUrl}/api/app/mobile`, [appContext.baseUrl]);
39
43
  const validateSessionCode = useCallback(value => {
40
44
  return SESSION_CODE_VALIDATION_PATTERN.test(value.toUpperCase());
@@ -45,17 +49,15 @@ const VerificationSessionCheckScreen = () => {
45
49
  const response = await httpClient.get(`${apiUrl}/verification-sessions/${id}`, isDemo ? getSimulatedDemoData('GET_SESSION') : undefined);
46
50
  return response;
47
51
  } catch (error) {
48
- if (error instanceof NotFoundError) {
49
- // User entered invalid session ID - expected user behavior, not actionable
50
- Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
51
- } else {
52
+ if (!(error instanceof NotFoundError)) {
52
53
  trackError('SESSION_CHECK_ERROR', error instanceof Error ? error.message : 'Unknown error', 'verification_session_check', 'high', {
53
54
  recoverable: false,
54
55
  userAction: 'check_session'
55
56
  });
56
57
  }
58
+ throw error;
57
59
  }
58
- }, [apiUrl, appContext.isDemoSession, t]);
60
+ }, [apiUrl, appContext.isDemoSession]);
59
61
  const getSessionByCode = useCallback(async inputCode => {
60
62
  try {
61
63
  const isDemoMode = isDemoSession(inputCode);
@@ -86,52 +88,55 @@ const VerificationSessionCheckScreen = () => {
86
88
  sessionId
87
89
  });
88
90
  }, [navigation]);
89
-
90
- // Reset initialized flag when screen is focused and sessionId is empty (after reset)
91
- useFocusEffect(useCallback(() => {
92
- if (!appContext.identificationInfo.sessionId) {
93
- initialized.current = false;
94
- isCheckingSessionRef.current = false;
95
- }
96
- }, [appContext.identificationInfo.sessionId]));
91
+ const getSessionRef = useRef(getSession);
92
+ getSessionRef.current = getSession;
93
+ const navigateToOTPScreenRef = useRef(navigateToOTPScreen);
94
+ navigateToOTPScreenRef.current = navigateToOTPScreen;
95
+ const appContextRef = useRef(appContext);
96
+ appContextRef.current = appContext;
97
97
  useEffect(() => {
98
- // Only run this effect if sessionId exists AND we're not currently checking a session
99
- // This prevents race condition when session code is entered
100
- if (!initialized.current && appContext.identificationInfo.sessionId && !isCheckingSessionRef.current) {
101
- initialized.current = true;
102
- isCheckingSessionRef.current = true;
103
- setIsCheckingSession(true);
104
- getSession(appContext.identificationInfo.sessionId).then(session => {
105
- if (!session) {
106
- // Session not found - clear the sessionId and reset flags to allow retry
107
- Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
108
- appContext.identificationInfo.sessionId = '';
109
- if (appContext.setSessionId) {
110
- appContext.setSessionId('');
111
- }
112
- initialized.current = false;
113
- return;
114
- }
115
- appContext.workflowSteps = session.workflowSteps;
116
- if (session.branding) {
117
- appContext.branding = appContext.branding || session.branding;
118
- }
119
- if (session.sendOTP) {
120
- navigateToOTPScreen(session.id);
121
- } else {
122
- if (session.identificationId) {
123
- appContext.identificationInfo.identificationId = session.identificationId;
124
- }
125
- navigationManagerRef.current?.navigateToNextStep();
126
- }
127
- }).finally(() => {
128
- setTimeout(() => {
129
- isCheckingSessionRef.current = false;
130
- setIsCheckingSession(false);
131
- }, 1000);
132
- });
98
+ // Skip session check when navigated from debug panel the debug panel
99
+ // already set up workflowSteps and currentWorkflowStep directly.
100
+ if (appContext.isDebugNavigated) {
101
+ return;
133
102
  }
134
- }, [appContext, appContext.identificationInfo.sessionId, getSession, navigateToOTPScreen, t]);
103
+ const sid = appContext.identificationInfo.sessionId;
104
+ if (!sid || checkedSessionIdRef.current === sid) {
105
+ return;
106
+ }
107
+ checkedSessionIdRef.current = sid;
108
+ isCheckingSessionRef.current = true;
109
+ setIsCheckingSession(true);
110
+ getSessionRef.current(sid).then(session => {
111
+ const ctx = appContextRef.current;
112
+ ctx.workflowSteps = session.workflowSteps;
113
+ if (session.branding) {
114
+ ctx.branding = ctx.branding || session.branding;
115
+ }
116
+ if (session.sendOTP) {
117
+ navigateToOTPScreenRef.current(session.id);
118
+ } else {
119
+ if (session.identificationId) {
120
+ ctx.identificationInfo.identificationId = session.identificationId;
121
+ }
122
+ navigationManagerRef.current?.navigateToNextStep();
123
+ }
124
+ }).catch(() => {
125
+ Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
126
+ checkedSessionIdRef.current = '';
127
+ const ctx = appContextRef.current;
128
+ if (ctx.setSessionId) {
129
+ ctx.setSessionId('');
130
+ }
131
+ }).finally(() => {
132
+ isCheckingSessionRef.current = false;
133
+ setIsCheckingSession(false);
134
+ });
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
136
+ }, [appContext.identificationInfo.sessionId]);
137
+ if (!appContext || !appContext.baseUrl) {
138
+ return null;
139
+ }
135
140
  return /*#__PURE__*/_jsx(SafeAreaView, {
136
141
  style: styles.safeAreaContainer,
137
142
  children: /*#__PURE__*/_jsx(KeyboardAvoidingView, {
@@ -185,6 +190,9 @@ const VerificationSessionCheckScreen = () => {
185
190
  const isDemoMode = isDemoSession(alphanumericText);
186
191
  const sessionResponse = await getSessionByCode(alphanumericText);
187
192
  if (sessionResponse?.id) {
193
+ // Mark as checked before setting sessionId to prevent
194
+ // the useEffect from triggering a duplicate navigation.
195
+ checkedSessionIdRef.current = sessionResponse.id;
188
196
  if (appContext.setSessionId) {
189
197
  appContext.setSessionId(sessionResponse.id);
190
198
  } else {
@@ -0,0 +1 @@
1
+ {"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":488,"h":488,"nm":"recording spectrum_MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,163]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,37]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,211]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,83]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,155]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,91]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,186]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,256]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,209]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,124]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,211]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,37]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,163]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}
@@ -0,0 +1 @@
1
+ {"v":"5.7.3","fr":30,"ip":0,"op":41,"w":600,"h":600,"nm":"Phone Call","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Call Icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[293.084,310.786,0],"ix":2},"a":{"a":0,"k":[1371.347,-543.458,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[28,28,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[25,25,100]},{"t":40,"s":[28,28,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-22.59,22.938],[0,0],[23.373,23.448],[0,0],[23.186,-22.195],[0,0],[25.1,60.946],[0,0],[22.137,23.256],[0.601,0.601],[23.496,-22.664],[0,0],[-157.804,5.059]],"o":[[0,0],[23.373,-23.448],[-0.601,-0.601],[-23.249,-22.13],[0,0],[-60.902,-25.206],[0,0],[22.213,-23.184],[0,0],[-23.009,-23.158],[0,0],[-131.678,152.765],[32.193,0.187]],"v":[[1568.371,-346.481],[1586.008,-366.813],[1586.008,-451.645],[1538.775,-488.121],[1455.803,-488.005],[1418.862,-456.878],[1284.51,-591.463],[1315.52,-628.288],[1315.656,-711.279],[1279.141,-758.453],[1195.297,-759.345],[1173.008,-739.964],[1482.685,-310.897]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,10.704],[64.224,0],[0,-10.704],[-10.704,0],[0,-42.816],[-10.704,0]],"o":[[0,-64.224],[-10.704,0],[0,10.704],[42.816,0],[0,10.704],[10.704,0]],"v":[[1526.061,-582.237],[1409.772,-698.526],[1390.391,-679.145],[1409.772,-659.763],[1487.298,-582.237],[1506.679,-562.856]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[10.704,0],[0,10.704],[85.597,0.085],[0,10.704],[-10.704,0],[-0.117,-106.992]],"o":[[-10.704,0],[-0.085,-85.597],[-10.704,0],[0,-10.704],[106.992,0.117],[0,10.704]],"v":[[1584.205,-562.856],[1564.824,-582.237],[1409.772,-737.289],[1390.391,-756.67],[1409.772,-776.052],[1603.587,-582.237]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":-8,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Background Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2},"a":{"a":0,"k":[1397.949,-584.944,0],"ix":1},"s":{"a":0,"k":[27,27,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-262.123],[262.123,0],[0,262.123],[-262.123,0]],"o":[[0,262.123],[-262.123,0],[0,-262.123],[262.123,0]],"v":[[1872.564,-584.944],[1397.949,-110.329],[923.334,-584.944],[1397.949,-1059.559]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117700554343,0.127342568192,0.138823505476,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":-8,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Small Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":210,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22.03,"s":[0]},{"t":39.5470890812688,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10.769,"s":[0]},{"t":35.7941593937688,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.7687687687688,"op":45,"st":10.7687687687688,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Medium Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":119,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[85,85,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.02,"s":[0]},{"t":29.5370790712588,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0.759,"s":[0]},{"t":25.7841493837588,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0.75875875875876,"op":45,"st":0.75875875875876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Large Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15.774,"s":[0]},{"t":33.2908328250125,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4.513,"s":[0]},{"t":29.5379031375125,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4.51251251251251,"op":45,"st":4.51251251251251,"bm":0}],"markers":[]}