@prosopo/provider 5.15.0 → 5.17.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 (236) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +52 -34
  2. package/.turbo/turbo-build$colon$tsc.log +36 -30
  3. package/.turbo/turbo-build.log +53 -35
  4. package/CHANGELOG.md +94 -0
  5. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +4 -0
  6. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  7. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +63 -3
  8. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  9. package/dist/api/blacklistRequestInspector.js +2 -2
  10. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts +5 -0
  11. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts.map +1 -0
  12. package/dist/api/captcha/getAudioCaptchaChallenge.js +37 -0
  13. package/dist/api/captcha/getAudioCaptchaChallenge.js.map +1 -0
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +1 -0
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
  16. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +7 -2
  17. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
  18. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -1
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +17 -12
  21. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  22. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +7 -2
  23. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -1
  24. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +14 -4
  25. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -1
  26. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +1 -0
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  29. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts +5 -0
  30. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts.map +1 -0
  31. package/dist/api/captcha/getIconOrderCaptchaChallenge.js +37 -0
  32. package/dist/api/captcha/getIconOrderCaptchaChallenge.js.map +1 -0
  33. package/dist/api/captcha/getImageCaptchaChallenge.js +2 -2
  34. package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -4
  35. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +1 -3
  36. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  37. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +55 -170
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  39. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts +42 -0
  40. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -0
  41. package/dist/api/captcha/interactiveCaptchaChallenge.js +154 -0
  42. package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -0
  43. package/dist/api/captcha/interactiveCaptchaSolution.d.ts +14 -0
  44. package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -0
  45. package/dist/api/captcha/interactiveCaptchaSolution.js +77 -0
  46. package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -0
  47. package/dist/api/captcha/maintenanceModeResponses.d.ts +4 -2
  48. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  49. package/dist/api/captcha/maintenanceModeResponses.js +28 -1
  50. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  51. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts +4 -0
  52. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts.map +1 -0
  53. package/dist/api/captcha/submitAudioCaptchaSolution.js +11 -0
  54. package/dist/api/captcha/submitAudioCaptchaSolution.js.map +1 -0
  55. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts +4 -0
  56. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts.map +1 -0
  57. package/dist/api/captcha/submitIconOrderCaptchaSolution.js +11 -0
  58. package/dist/api/captcha/submitIconOrderCaptchaSolution.js.map +1 -0
  59. package/dist/api/captcha/submitPoWCaptchaSolution.js +2 -2
  60. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +1 -3
  61. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  62. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +6 -73
  63. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  64. package/dist/api/captcha/trafficFilterRequestTime.d.ts +4 -1
  65. package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
  66. package/dist/api/captcha/trafficFilterRequestTime.js +3 -0
  67. package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
  68. package/dist/api/captcha.d.ts.map +1 -1
  69. package/dist/api/captcha.js +8 -0
  70. package/dist/api/captcha.js.map +1 -1
  71. package/dist/api/domainMiddleware.js +1 -1
  72. package/dist/api/ja4Middleware.js +1 -1
  73. package/dist/api/startProviderApi.js +1 -1
  74. package/dist/api/verify.d.ts.map +1 -1
  75. package/dist/api/verify.js +153 -96
  76. package/dist/api/verify.js.map +1 -1
  77. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +65 -2
  78. package/dist/cjs/api/blacklistRequestInspector.cjs +2 -2
  79. package/dist/cjs/api/captcha/getAudioCaptchaChallenge.cjs +37 -0
  80. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +6 -0
  81. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +1 -1
  82. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +15 -10
  83. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +14 -3
  84. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +1 -0
  85. package/dist/cjs/api/captcha/getIconOrderCaptchaChallenge.cjs +37 -0
  86. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -2
  87. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -4
  88. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +54 -169
  89. package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +154 -0
  90. package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +77 -0
  91. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +29 -0
  92. package/dist/cjs/api/captcha/submitAudioCaptchaSolution.cjs +11 -0
  93. package/dist/cjs/api/captcha/submitIconOrderCaptchaSolution.cjs +11 -0
  94. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +2 -2
  95. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +6 -73
  96. package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +3 -0
  97. package/dist/cjs/api/captcha.cjs +8 -0
  98. package/dist/cjs/api/domainMiddleware.cjs +1 -1
  99. package/dist/cjs/api/ja4Middleware.cjs +1 -1
  100. package/dist/cjs/api/startProviderApi.cjs +1 -1
  101. package/dist/cjs/api/verify.cjs +152 -95
  102. package/dist/cjs/index.cjs +1 -1
  103. package/dist/cjs/tasks/audio/audioBuffer.cjs +72 -0
  104. package/dist/cjs/tasks/audio/audioRenderer.cjs +32 -0
  105. package/dist/cjs/tasks/audioAlternative.cjs +23 -0
  106. package/dist/cjs/tasks/audioCaptcha/audioTasks.cjs +65 -0
  107. package/dist/cjs/tasks/audioCaptcha/audioTasksUtils.cjs +19 -0
  108. package/dist/cjs/tasks/captchaManager.cjs +14 -2
  109. package/dist/cjs/tasks/captchaTypeSelection.cjs +20 -3
  110. package/dist/cjs/tasks/client/clientTasks.cjs +2 -2
  111. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +40 -9
  112. package/dist/cjs/tasks/iconOrder/iconOrderRenderer.cjs +42 -0
  113. package/dist/cjs/tasks/iconOrderCaptcha/iconOrderTasks.cjs +69 -0
  114. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +8 -8
  115. package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +423 -0
  116. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +8 -8
  117. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +1 -1
  118. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +40 -486
  119. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +18 -1
  120. package/dist/cjs/tasks/tasks.cjs +6 -0
  121. package/dist/cjs/util.cjs +1 -1
  122. package/dist/index.js +2 -2
  123. package/dist/tasks/audio/audioBuffer.d.ts +23 -0
  124. package/dist/tasks/audio/audioBuffer.d.ts.map +1 -0
  125. package/dist/tasks/audio/audioBuffer.js +70 -0
  126. package/dist/tasks/audio/audioBuffer.js.map +1 -0
  127. package/dist/tasks/audio/audioRenderer.d.ts +11 -0
  128. package/dist/tasks/audio/audioRenderer.d.ts.map +1 -0
  129. package/dist/tasks/audio/audioRenderer.js +31 -0
  130. package/dist/tasks/audio/audioRenderer.js.map +1 -0
  131. package/dist/tasks/audioAlternative.d.ts +8 -0
  132. package/dist/tasks/audioAlternative.d.ts.map +1 -0
  133. package/dist/tasks/audioAlternative.js +20 -0
  134. package/dist/tasks/audioAlternative.js.map +1 -0
  135. package/dist/tasks/audioCaptcha/audioTasks.d.ts +19 -0
  136. package/dist/tasks/audioCaptcha/audioTasks.d.ts.map +1 -0
  137. package/dist/tasks/audioCaptcha/audioTasks.js +65 -0
  138. package/dist/tasks/audioCaptcha/audioTasks.js.map +1 -0
  139. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts +3 -0
  140. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts.map +1 -0
  141. package/dist/tasks/audioCaptcha/audioTasksUtils.js +18 -0
  142. package/dist/tasks/audioCaptcha/audioTasksUtils.js.map +1 -0
  143. package/dist/tasks/captchaManager.d.ts +9 -3
  144. package/dist/tasks/captchaManager.d.ts.map +1 -1
  145. package/dist/tasks/captchaManager.js +15 -3
  146. package/dist/tasks/captchaManager.js.map +1 -1
  147. package/dist/tasks/captchaTypeSelection.d.ts +2 -1
  148. package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
  149. package/dist/tasks/captchaTypeSelection.js +21 -5
  150. package/dist/tasks/captchaTypeSelection.js.map +1 -1
  151. package/dist/tasks/client/clientTasks.js +2 -2
  152. package/dist/tasks/frictionless/frictionlessTasks.d.ts +5 -0
  153. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  154. package/dist/tasks/frictionless/frictionlessTasks.js +41 -10
  155. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  156. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts +12 -0
  157. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts.map +1 -0
  158. package/dist/tasks/iconOrder/iconOrderRenderer.js +40 -0
  159. package/dist/tasks/iconOrder/iconOrderRenderer.js.map +1 -0
  160. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts +22 -0
  161. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts.map +1 -0
  162. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js +69 -0
  163. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js.map +1 -0
  164. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +8 -8
  165. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts +52 -0
  166. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -0
  167. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +423 -0
  168. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -0
  169. package/dist/tasks/powCaptcha/powTasks.js +8 -8
  170. package/dist/tasks/powCaptcha/powTasksUtils.js +1 -1
  171. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +14 -16
  172. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  173. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +41 -487
  174. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  175. package/dist/tasks/spam/checkTrafficFilter.d.ts +4 -1
  176. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  177. package/dist/tasks/spam/checkTrafficFilter.js +18 -1
  178. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  179. package/dist/tasks/tasks.d.ts +4 -0
  180. package/dist/tasks/tasks.d.ts.map +1 -1
  181. package/dist/tasks/tasks.js +6 -0
  182. package/dist/tasks/tasks.js.map +1 -1
  183. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +7 -3
  184. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  185. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +45 -3
  186. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  187. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +4 -2
  188. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  189. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +76 -1
  190. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  191. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +27 -8
  192. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  193. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +29 -3
  194. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -1
  195. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +20 -0
  196. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  197. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +81 -2
  198. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  199. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts +2 -0
  200. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts.map +1 -0
  201. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js +105 -0
  202. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js.map +1 -0
  203. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts +2 -0
  204. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts.map +1 -0
  205. package/dist/tests/unit/tasks/audioAlternative.unit.test.js +76 -0
  206. package/dist/tests/unit/tasks/audioAlternative.unit.test.js.map +1 -0
  207. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts +2 -0
  208. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts.map +1 -0
  209. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js +259 -0
  210. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js.map +1 -0
  211. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts +2 -0
  212. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts.map +1 -0
  213. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js +52 -0
  214. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js.map +1 -0
  215. package/dist/tests/unit/tasks/captchaManager.unit.test.js +120 -2
  216. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  217. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +65 -6
  218. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
  219. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +29 -0
  220. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -1
  221. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +31 -0
  222. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  223. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +27 -2
  224. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -1
  225. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +28 -0
  226. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
  227. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts +2 -0
  228. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts.map +1 -0
  229. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js +60 -0
  230. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js.map +1 -0
  231. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts +2 -0
  232. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts.map +1 -0
  233. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js +225 -0
  234. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js.map +1 -0
  235. package/dist/util.js +1 -1
  236. package/package.json +19 -17
@@ -0,0 +1,423 @@
1
+ import { buildAllWindowIncrements } from "../../util/usageCounters.js";
2
+ import { rawTlsSignalsFromRecord } from "../../api/rawTlsSignalsMiddleware.js";
3
+ import { getCompositeIpAddress, getIpAddressFromComposite } from "../../compositeIpAddress.js";
4
+ import { deepValidateIpAddress } from "../../util.js";
5
+ import { isClientSessionMismatch, toStoredClientMetaData } from "../../utils/clientMetaData.js";
6
+ import { deriveTrafficPolicies } from "../../utils/devicePlatform.js";
7
+ import { computeDnsAsymmetry, enrichDnsEvent, getIpInfoAsn } from "../dnsEvent/enrichDnsEvent.js";
8
+ import { CaptchaManager } from "../captchaManager.js";
9
+ import { DecisionMachineRunner } from "../decisionMachine/decisionMachineRunner.js";
10
+ import { computeFrictionlessScore } from "../frictionless/frictionlessTasksUtils.js";
11
+ import { checkPowSignature } from "../powCaptcha/powTasksUtils.js";
12
+ import { normaliseEmailForMatching } from "../spam/evaluateEmailSpamRules.js";
13
+ import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
14
+ import { ApiParams, CaptchaStatus, DecisionMachineDecision, POW_SEPARATOR, ResultReason, SimdReadingsStage, isBlockingCaptchaResult } from "@prosopo/types";
15
+ import { stringToHex, u8aToHex } from "@polkadot/util";
16
+ import { describeMatchedRule } from "@prosopo/user-access-policy";
17
+ import { assertCoordsSafe, at, extractData, verifyRecency } from "@prosopo/util";
18
+ //#region src/tasks/interactiveCaptcha/interactiveCaptchaManager.ts
19
+ /**
20
+ * Shared pipeline for the captcha types a human solves on screen (puzzle,
21
+ * icon-order). Subclasses supply the record accessors and grading; minting,
22
+ * submission bookkeeping and server verification live here.
23
+ */
24
+ var InteractiveCaptchaManager = class extends CaptchaManager {
25
+ constructor(db, pair, config, logger, usageCounters) {
26
+ super(db, pair, config, logger);
27
+ this.POW_SEPARATOR = POW_SEPARATOR;
28
+ this.decisionMachineRunner = new DecisionMachineRunner(db);
29
+ this.usageCounters = usageCounters ?? null;
30
+ }
31
+ mintChallenge(userAccount, dappAccount) {
32
+ const requestedAtTimestamp = Date.now();
33
+ const challenge = `${requestedAtTimestamp}___${userAccount}___${dappAccount}___${Math.floor(Math.random() * 1e6)}`;
34
+ return {
35
+ challenge,
36
+ providerSignature: u8aToHex(this.pair.sign(stringToHex(challenge))),
37
+ requestedAtTimestamp
38
+ };
39
+ }
40
+ /**
41
+ * Grades a user's submission and records the outcome on the captcha and
42
+ * session records. Returns whether the solution was correct.
43
+ */
44
+ async submitInteractiveCaptchaSolution(submission) {
45
+ const { challenge, userTimestampSignature, behavioralData, simdReadings } = submission;
46
+ checkPowSignature(challenge, submission.providerChallengeSignature, this.pair.address, ApiParams.challenge);
47
+ const challengeSplit = challenge.split(this.POW_SEPARATOR);
48
+ const timestamp = Number.parseInt(at(challengeSplit, 0));
49
+ const userAccount = at(challengeSplit, 1);
50
+ checkPowSignature(timestamp.toString(), userTimestampSignature, userAccount, ApiParams.timestamp);
51
+ const challengeRecord = await this.getRecordByChallenge(challenge);
52
+ if (!challengeRecord) {
53
+ this.logger.debug(() => ({ msg: `No record of this challenge: ${challenge}` }));
54
+ return false;
55
+ }
56
+ const { coords, saltDecodeError } = this.decodeSaltCoords(submission.salt);
57
+ if (!await this.claimSubmission(challengeRecord)) {
58
+ this.logger.debug(() => ({ msg: `Challenge already submitted: ${challenge}` }));
59
+ return false;
60
+ }
61
+ if (saltDecodeError) {
62
+ await this.recordSubmissionResult(challengeRecord, {
63
+ status: CaptchaStatus.disapproved,
64
+ reason: ResultReason.CAPTCHA_INVALID_SALT
65
+ }, userTimestampSignature, void 0);
66
+ return false;
67
+ }
68
+ if (!verifyRecency(challenge, submission.timeout)) {
69
+ await this.recordSubmissionResult(challengeRecord, {
70
+ status: CaptchaStatus.disapproved,
71
+ reason: ResultReason.CAPTCHA_INVALID_TIMESTAMP
72
+ }, userTimestampSignature, coords);
73
+ return false;
74
+ }
75
+ const correct = submission.isCorrect(challengeRecord);
76
+ const result = correct ? { status: CaptchaStatus.approved } : {
77
+ status: CaptchaStatus.disapproved,
78
+ reason: ResultReason.CAPTCHA_INVALID_SOLUTION
79
+ };
80
+ if (correct && this.usageCounters) this.usageCounters.incrManyAsync(at(challengeSplit, 2), buildAllWindowIncrements("solved", this.captchaType, submission.ipAddress.address, userAccount));
81
+ await submission.persistInteraction();
82
+ const decodedPayloads = await this.decodeSubmissionPayloads(challengeRecord.sessionId, {
83
+ behavioural: behavioralData,
84
+ simd: simdReadings
85
+ });
86
+ if (behavioralData) try {
87
+ const decryptedData = decodedPayloads.behavioural;
88
+ if (decryptedData) {
89
+ this.logger?.info(() => ({
90
+ msg: "Behavioral analysis completed",
91
+ data: {
92
+ userAccount,
93
+ dappAccount: at(challengeSplit, 2),
94
+ challenge,
95
+ mouseEventsCount: decryptedData.collector1?.length || 0,
96
+ touchEventsCount: decryptedData.collector2?.length || 0,
97
+ clickEventsCount: decryptedData.collector3?.length || 0,
98
+ scrollEventsCount: decryptedData.collector4?.length || 0,
99
+ deviceCapability: decryptedData.deviceCapability,
100
+ captchaResult: correct ? "passed" : "failed"
101
+ }
102
+ }));
103
+ const packedData = {
104
+ c1: decryptedData.collector1 || [],
105
+ c2: decryptedData.collector2 || [],
106
+ c3: decryptedData.collector3 || [],
107
+ c4: decryptedData.collector4 || [],
108
+ d: decryptedData.deviceCapability
109
+ };
110
+ await this.updateRecord(challenge, {
111
+ behavioralDataPacked: packedData,
112
+ deviceCapability: decryptedData.deviceCapability
113
+ });
114
+ }
115
+ } catch (error) {
116
+ this.logger?.error(() => ({
117
+ msg: "Failed to process behavioral data",
118
+ err: error
119
+ }));
120
+ }
121
+ const storedClientMetaData = toStoredClientMetaData(submission.clientMetaData);
122
+ if (storedClientMetaData) await this.updateRecord(challenge, { clientMetaData: storedClientMetaData });
123
+ await this.recordSubmissionResult(challengeRecord, result, userTimestampSignature, coords, storedClientMetaData);
124
+ if (challengeRecord.sessionId && decodedPayloads.simd) await this.recordSessionSimdReadingsIfAbsentWithCache(challengeRecord.sessionId, decodedPayloads.simd, SimdReadingsStage.submit);
125
+ return correct;
126
+ }
127
+ /** Invalid salt disapproves the submission rather than being ignored. */
128
+ decodeSaltCoords(salt) {
129
+ if (!salt) return {};
130
+ try {
131
+ const extractedData = extractData(salt);
132
+ if (extractedData.length < 2) return {};
133
+ const coords = [[[extractedData[0], extractedData[1]]]];
134
+ assertCoordsSafe(coords, "coords");
135
+ return { coords };
136
+ } catch (error) {
137
+ this.logger.warn(() => ({
138
+ msg: "Failed to extract coordinates from salt",
139
+ error,
140
+ salt
141
+ }));
142
+ return { saltDecodeError: error };
143
+ }
144
+ }
145
+ async recordSubmissionResult(challengeRecord, result, userSignature, coords, clientMetaData) {
146
+ await this.updateSubmissionResult(challengeRecord.challenge, result, userSignature, coords);
147
+ if (challengeRecord.sessionId) await this.updateSessionRecordWithCache(challengeRecord.sessionId, {
148
+ userSubmitted: true,
149
+ result,
150
+ ...isBlockingCaptchaResult(this.captchaType, result) && { blocked: true },
151
+ ...clientMetaData && { clientMetaData }
152
+ });
153
+ }
154
+ /**
155
+ * The post-solve gate the site's server calls: decides whether the token
156
+ * the widget was given is honoured.
157
+ *
158
+ * @param dappAccount - the dapp that is requesting the captcha
159
+ * @param challenge - the challenge string
160
+ * @param timeout - milliseconds allowed between submit and verify
161
+ * @param env - provider environment
162
+ * @param ip - optional IP address for validation
163
+ * @param userAccessRulesStorage - storage for querying user access policies
164
+ * @param email
165
+ * @param spamEmailDomainCheckingEnabled
166
+ * @param spamFilter
167
+ * @param trafficFilter
168
+ * @param storeMetadata - when true, persists the dapp-server-provided
169
+ * `email` on the captcha record for spam-rate analysis.
170
+ * @param clientSessionId - the session id the site rendered the widget
171
+ * with. When supplied, the solve must carry the same value in its
172
+ * `clientMetaData` or it is disapproved.
173
+ */
174
+ async serverVerifyInteractiveCaptchaSolution(dappAccount, challenge, timeout, env, ip, userAccessRulesStorage, email, spamEmailDomainCheckingEnabled = false, spamFilter, trafficFilter, storeMetadata = false, clientSessionId) {
175
+ const notVerifiedResponse = { verified: false };
176
+ const logger = this.logger.with({
177
+ challenge,
178
+ dappAccount
179
+ });
180
+ const challengeRecord = await this.getRecordByChallenge(challenge);
181
+ if (!challengeRecord) {
182
+ logger.debug(() => ({ msg: `No record of this challenge: ${challenge}` }));
183
+ return notVerifiedResponse;
184
+ }
185
+ notVerifiedResponse.sessionId = challengeRecord.sessionId;
186
+ if (challengeRecord.result.status !== CaptchaStatus.approved) throw new ProsopoApiError("CAPTCHA.INVALID_SOLUTION", { context: {
187
+ code: 400,
188
+ failedFuncName: this.serverVerifyInteractiveCaptchaSolution.name,
189
+ challenge
190
+ } });
191
+ if (challengeRecord.serverChecked) return notVerifiedResponse;
192
+ const challengeDappAccount = challengeRecord.dappAccount;
193
+ if (dappAccount !== challengeDappAccount) throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", { context: {
194
+ failedFuncName: this.serverVerifyInteractiveCaptchaSolution.name,
195
+ dappAccount,
196
+ challengeDappAccount
197
+ } });
198
+ if (!await this.markRecordChecked(challengeRecord.challenge)) return notVerifiedResponse;
199
+ const submittedAt = challengeRecord.submittedAtTimestamp;
200
+ if ((submittedAt instanceof Date ? Date.now() - submittedAt.getTime() : Number.POSITIVE_INFINITY) > timeout) {
201
+ await this.disapproveVerification(challengeRecord, ResultReason.TIMESTAMP_TOO_OLD);
202
+ return notVerifiedResponse;
203
+ }
204
+ if (isClientSessionMismatch(clientSessionId, challengeRecord.clientMetaData?.clientSessionId)) {
205
+ logger.info(() => ({
206
+ msg: `Client session mismatch in server ${this.logLabel} verification`,
207
+ data: { hasRecordedClientSessionId: Boolean(challengeRecord.clientMetaData?.clientSessionId) }
208
+ }));
209
+ await this.disapproveVerification(challengeRecord, ResultReason.CLIENT_SESSION_MISMATCH);
210
+ return notVerifiedResponse;
211
+ }
212
+ if (userAccessRulesStorage) try {
213
+ const blockPolicy = await this.checkForHardBlock(userAccessRulesStorage, challengeRecord, challengeRecord.userAccount, challengeRecord.headers, challengeRecord.coords, challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0, challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.asnNumber : void 0);
214
+ if (blockPolicy) {
215
+ logger.info(() => ({
216
+ msg: `User blocked by access policy in server ${this.logLabel} verification`,
217
+ data: {
218
+ userAccount: challengeRecord.userAccount,
219
+ policy: blockPolicy
220
+ }
221
+ }));
222
+ await this.disapproveVerification(challengeRecord, ResultReason.ACCESS_POLICY_BLOCK, { matchedRule: describeMatchedRule(blockPolicy) });
223
+ return notVerifiedResponse;
224
+ }
225
+ } catch (error) {
226
+ logger.warn(() => ({
227
+ msg: `Failed to check user access policies in server ${this.logLabel} verification`,
228
+ error
229
+ }));
230
+ }
231
+ if (email && spamEmailDomainCheckingEnabled) try {
232
+ if (await this.checkSpamEmail(email)) {
233
+ const emailDomain = email.split("@")[1] || "unknown";
234
+ logger.info(() => ({
235
+ msg: `Spam email domain detected in server ${this.logLabel} verification`,
236
+ data: { emailDomain }
237
+ }));
238
+ await this.disapproveVerification(challengeRecord, ResultReason.SPAM_EMAIL_DOMAIN, null);
239
+ return notVerifiedResponse;
240
+ }
241
+ } catch (error) {
242
+ logger.warn(() => ({
243
+ msg: `Failed to check spam email domain in server ${this.logLabel} verification`,
244
+ error
245
+ }));
246
+ }
247
+ const maxEmailSubmissionCount = spamFilter?.enabled && spamFilter.emailRules?.enabled ? spamFilter.emailRules.maxEmailSubmissionCount : void 0;
248
+ let emailNormalised;
249
+ if (maxEmailSubmissionCount !== void 0 && email && storeMetadata) {
250
+ emailNormalised = normaliseEmailForMatching(email);
251
+ if (emailNormalised) try {
252
+ const priorCount = await this.db.countCommitmentsByNormalisedEmail(dappAccount, emailNormalised);
253
+ if (priorCount >= maxEmailSubmissionCount) {
254
+ logger.info(() => ({
255
+ msg: `Email submission count exceeded in server ${this.logLabel} verification`,
256
+ data: {
257
+ priorCount,
258
+ maxEmailSubmissionCount
259
+ }
260
+ }));
261
+ await this.disapproveVerification(challengeRecord, ResultReason.SPAM_EMAIL_COUNT_EXCEEDED, null);
262
+ return notVerifiedResponse;
263
+ }
264
+ } catch (error) {
265
+ logger.warn(() => ({
266
+ msg: `Failed to check email submission count in server ${this.logLabel} verification`,
267
+ error
268
+ }));
269
+ }
270
+ }
271
+ const sessionRecord = challengeRecord.sessionId ? await this.getSessionRecordWithOriginFallback(challengeRecord.sessionId) : void 0;
272
+ const enrichedDnsEvent = await enrichDnsEvent(sessionRecord?.dnsEvent, env.ipInfoService, ip ?? challengeRecord.ipInfo?.ip);
273
+ {
274
+ const check = await this.resolveTrafficFilterCheck(env, challengeRecord.ipInfo, trafficFilter, ip, enrichedDnsEvent);
275
+ if (check.isBlocked) {
276
+ logger.info(() => ({
277
+ msg: `Traffic filter rejected request in ${this.logLabel} verification`,
278
+ data: {
279
+ ip,
280
+ reason: check.reason,
281
+ dnsPeerIp: enrichedDnsEvent?.peerIp,
282
+ dnsResolverIp: enrichedDnsEvent?.resolverIp,
283
+ dnsPeerAsn: getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
284
+ dnsResolverAsn: getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo),
285
+ dnsPathValid: enrichedDnsEvent?.pathValid
286
+ }
287
+ }));
288
+ await this.disapproveVerification(challengeRecord, check.reason);
289
+ return notVerifiedResponse;
290
+ }
291
+ }
292
+ if (storeMetadata && email) await this.updateRecord(challengeRecord.challenge, { metadata: {
293
+ email,
294
+ emailNormalised: emailNormalised ?? normaliseEmailForMatching(email)
295
+ } });
296
+ if (ip) {
297
+ const challengeIpAddress = getIpAddressFromComposite(challengeRecord.ipAddress);
298
+ const ipValidationRules = (await this.db.getClientRecord(dappAccount))?.settings?.ipValidationRules;
299
+ await this.updateRecord(challengeRecord.challenge, { providedIp: getCompositeIpAddress(ip) });
300
+ if (ipValidationRules?.enabled === true) {
301
+ const ipValidation = await deepValidateIpAddress(ip, challengeIpAddress, logger, env.ipInfoService, ipValidationRules, enrichedDnsEvent?.peerIp);
302
+ if (!ipValidation.isValid) {
303
+ logger.error(() => ({
304
+ msg: `IP validation failed for ${this.logLabel} captcha`,
305
+ data: {
306
+ ip,
307
+ challengeIp: challengeIpAddress.address,
308
+ error: ipValidation.errorMessage,
309
+ distanceKm: ipValidation.distanceKm
310
+ }
311
+ }));
312
+ await this.disapproveVerification(challengeRecord, ResultReason.FAILED_IP_VALIDATION);
313
+ return notVerifiedResponse;
314
+ }
315
+ }
316
+ }
317
+ let score;
318
+ if (sessionRecord) {
319
+ const dnsAsymmetry = computeDnsAsymmetry(enrichedDnsEvent, challengeRecord.ipInfo, trafficFilter);
320
+ if (dnsAsymmetry > 0) sessionRecord.scoreComponents = {
321
+ ...sessionRecord.scoreComponents,
322
+ dnsAsymmetry
323
+ };
324
+ score = computeFrictionlessScore(sessionRecord?.scoreComponents);
325
+ logger.info(() => ({ data: {
326
+ scoreComponents: { ...sessionRecord?.scoreComponents || {} },
327
+ score,
328
+ dnsPeerAsn: getIpInfoAsn(enrichedDnsEvent?.peerIpInfo),
329
+ dnsResolverAsn: getIpInfoAsn(enrichedDnsEvent?.resolverIpInfo)
330
+ } }));
331
+ }
332
+ try {
333
+ const decisionInput = {
334
+ userAccount: challengeRecord.userAccount,
335
+ dappAccount: challengeRecord.dappAccount,
336
+ captchaResult: "passed",
337
+ headers: challengeRecord.headers,
338
+ captchaType: this.captchaType,
339
+ behavioralDataPacked: challengeRecord.behavioralDataPacked,
340
+ deviceCapability: challengeRecord.deviceCapability,
341
+ countryCode: challengeRecord.ipInfo?.isValid ? challengeRecord.ipInfo.countryCode : void 0,
342
+ ipInfo: challengeRecord.ipInfo,
343
+ dnsEvent: enrichedDnsEvent,
344
+ score,
345
+ threshold: sessionRecord?.threshold,
346
+ scoreComponents: sessionRecord?.scoreComponents,
347
+ decryptedHeadHash: sessionRecord?.decryptedHeadHash,
348
+ userSitekeyIpHash: sessionRecord?.userSitekeyIpHash,
349
+ simdReadings: sessionRecord?.simdReadings,
350
+ d: sessionRecord?.d,
351
+ frictionlessReason: sessionRecord?.reason,
352
+ ruleType: sessionRecord?.ruleType,
353
+ webView: sessionRecord?.webView,
354
+ iFrame: sessionRecord?.iFrame,
355
+ currentUrl: sessionRecord?.currentUrl,
356
+ iframeUrl: sessionRecord?.iframeUrl,
357
+ coords: challengeRecord.coords,
358
+ ...this.decisionMachineEventFields(challengeRecord),
359
+ ...rawTlsSignalsFromRecord(sessionRecord),
360
+ trafficPolicies: deriveTrafficPolicies(trafficFilter)
361
+ };
362
+ const decision = await this.decisionMachineRunner.decide(decisionInput, logger);
363
+ if (decision.decision === DecisionMachineDecision.Deny) {
364
+ logger.info(() => ({
365
+ msg: `Decision machine denied ${this.logLabel} captcha in server verification`,
366
+ data: {
367
+ userAccount: challengeRecord.userAccount,
368
+ reason: decision.reason,
369
+ score: decision.score,
370
+ tags: decision.tags
371
+ }
372
+ }));
373
+ await this.disapproveVerification(challengeRecord, decision.reason || ResultReason.CAPTCHA_DECISION_MACHINE_DENIED);
374
+ return notVerifiedResponse;
375
+ }
376
+ logger.debug(() => ({
377
+ msg: `Decision machine allowed ${this.logLabel} captcha`,
378
+ data: {
379
+ reason: decision.reason,
380
+ score: decision.score,
381
+ tags: decision.tags
382
+ }
383
+ }));
384
+ } catch (error) {
385
+ logger.error(() => ({
386
+ msg: `Failed to run decision machine in server ${this.logLabel} verification`,
387
+ err: error
388
+ }));
389
+ }
390
+ if (challengeRecord.sessionId) await this.updateSessionRecordWithCache(challengeRecord.sessionId, {
391
+ serverChecked: true,
392
+ result: { status: CaptchaStatus.approved }
393
+ });
394
+ return {
395
+ verified: true,
396
+ ...score ? { score } : {},
397
+ ...challengeRecord.sessionId && { sessionId: challengeRecord.sessionId }
398
+ };
399
+ }
400
+ /**
401
+ * Records a server-verification rejection on the captcha record and, unless
402
+ * `session` is null, on the linked session.
403
+ */
404
+ async disapproveVerification(challengeRecord, reason, session = {}) {
405
+ const result = {
406
+ status: CaptchaStatus.disapproved,
407
+ reason
408
+ };
409
+ const isBlocked = isBlockingCaptchaResult(this.captchaType, result);
410
+ await this.updateRecord(challengeRecord.challenge, {
411
+ result,
412
+ ...isBlocked && { blocked: true }
413
+ });
414
+ if (session && challengeRecord.sessionId) await this.updateSessionRecordWithCache(challengeRecord.sessionId, {
415
+ serverChecked: true,
416
+ result,
417
+ ...isBlocked && { blocked: true },
418
+ ...session
419
+ });
420
+ }
421
+ };
422
+ //#endregion
423
+ export { InteractiveCaptchaManager };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactiveCaptchaManager.js","sourceRoot":"","sources":["../../../src/tasks/interactiveCaptcha/interactiveCaptchaManager.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EACN,SAAS,EAGT,aAAa,EAGb,uBAAuB,EAOvB,aAAa,EAGb,YAAY,EAEZ,iBAAiB,EACjB,uBAAuB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAEN,mBAAmB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,gBAAgB,EAChB,EAAE,EACF,WAAW,EACX,aAAa,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EACN,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAEN,wBAAwB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EACN,mBAAmB,EACnB,cAAc,EACd,YAAY,GACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AA8C9E,MAAM,OAAgB,yBAEpB,SAAQ,cAAc;IAKvB,YACC,EAAqB,EACrB,IAAiB,EACjB,MAA2B,EAC3B,MAAe,EACf,aAAoC;QAEpC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,IAAI,CAAC;IAC5C,CAAC;IAwCS,aAAa,CACtB,WAAmB,EACnB,WAAmB;QAEnB,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAmB,GAAG,oBAAoB,MAAM,WAAW,MAAM,WAAW,MAAM,KAAK,EAAE,CAAC;QACzG,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;IAC/D,CAAC;IAMS,KAAK,CAAC,gCAAgC,CAC/C,UAA0C;QAE1C,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,YAAY,EAAE,GACxE,UAAU,CAAC;QAEZ,iBAAiB,CAChB,SAAS,EACT,UAAU,CAAC,0BAA0B,EACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EACjB,SAAS,CAAC,SAAS,CACnB,CAAC;QAEF,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAE1C,iBAAiB,CAChB,SAAS,CAAC,QAAQ,EAAE,EACpB,sBAAsB,EACtB,WAAW,EACX,SAAS,CAAC,SAAS,CACnB,CAAC;QAEF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAEnE,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxB,GAAG,EAAE,gCAAgC,SAAS,EAAE;aAChD,CAAC,CAAC,CAAC;YACJ,OAAO,KAAK,CAAC;QACd,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAI3E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxB,GAAG,EAAE,gCAAgC,SAAS,EAAE;aAChD,CAAC,CAAC,CAAC;YACJ,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf;gBACC,MAAM,EAAE,aAAa,CAAC,WAAW;gBACjC,MAAM,EAAE,YAAY,CAAC,oBAAoB;aACzC,EACD,sBAAsB,EACtB,SAAS,CACT,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf;gBACC,MAAM,EAAE,aAAa,CAAC,WAAW;gBACjC,MAAM,EAAE,YAAY,CAAC,yBAAyB;aAC9C,EACD,sBAAsB,EACtB,MAAM,CACN,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,MAAM,GAAkB,OAAO;YACpC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;YACpC,CAAC,CAAC;gBACA,MAAM,EAAE,aAAa,CAAC,WAAW;gBACjC,MAAM,EAAE,YAAY,CAAC,wBAAwB;aAC7C,CAAC;QAIJ,IAAI,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,aAAa,CAC/B,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,EACrB,wBAAwB,CACvB,QAAQ,EACR,IAAI,CAAC,WAAW,EAChB,UAAU,CAAC,SAAS,CAAC,OAAO,EAC5B,WAAW,CACX,CACD,CAAC;QACH,CAAC;QAID,MAAM,UAAU,CAAC,kBAAkB,EAAE,CAAC;QAEtC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAC1D,eAAe,CAAC,SAAS,EACzB,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CACnD,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC;gBACJ,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC;gBAElD,IAAI,aAAa,EAAE,CAAC;oBACnB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBACxB,GAAG,EAAE,+BAA+B;wBACpC,IAAI,EAAE;4BACL,WAAW;4BACX,WAAW,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;4BAClC,SAAS;4BACT,gBAAgB,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;4BACvD,gBAAgB,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;4BACvD,gBAAgB,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;4BACvD,iBAAiB,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;4BACxD,gBAAgB,EAAE,aAAa,CAAC,gBAAgB;4BAChD,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;yBAC5C;qBACD,CAAC,CAAC,CAAC;oBAEJ,MAAM,UAAU,GAAyB;wBACxC,EAAE,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;wBAClC,EAAE,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;wBAClC,EAAE,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;wBAClC,EAAE,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;wBAClC,CAAC,EAAE,aAAa,CAAC,gBAAgB;qBACjC,CAAC;oBAEF,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;wBAClC,oBAAoB,EAAE,UAAU;wBAChC,gBAAgB,EAAE,aAAa,CAAC,gBAAgB;qBAChD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACzB,GAAG,EAAE,mCAAmC;oBACxC,GAAG,EAAE,KAAK;iBACV,CAAC,CAAC,CAAC;YAEL,CAAC;QACF,CAAC;QAED,MAAM,oBAAoB,GAAG,sBAAsB,CAClD,UAAU,CAAC,cAAc,CACzB,CAAC;QACF,IAAI,oBAAoB,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;gBAClC,cAAc,EAAE,oBAAoB;aACpC,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,MAAM,EACN,sBAAsB,EACtB,MAAM,EACN,oBAAoB,CACpB,CAAC;QAEF,IAAI,eAAe,CAAC,SAAS,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,CAAC,0CAA0C,CACpD,eAAe,CAAC,SAAS,EACzB,eAAe,CAAC,IAAI,EACpB,iBAAiB,CAAC,MAAM,CACxB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAGO,gBAAgB,CAAC,IAAwB;QAIhD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAC;YACX,CAAC;YACD,MAAM,MAAM,GAAyB;gBACpC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAqB,CAAC;aAC1D,CAAC;YACF,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnC,OAAO,EAAE,MAAM,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvB,GAAG,EAAE,yCAAyC;gBAC9C,KAAK;gBACL,IAAI;aACJ,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,sBAAsB,CACnC,eAAwB,EACxB,MAAqB,EACrB,aAAqB,EACrB,MAAwC,EACxC,cAA+B;QAE/B,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,CAAC,SAAS,EACzB,MAAM,EACN,aAAa,EACb,MAAM,CACN,CAAC;QACF,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,SAAS,EAAE;gBAClE,aAAa,EAAE,IAAI;gBACnB,MAAM;gBACN,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI;oBACxD,OAAO,EAAE,IAAI;iBACb,CAAC;gBAGF,GAAG,CAAC,cAAc,IAAI,EAAE,cAAc,EAAE,CAAC;aACzC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAsBD,KAAK,CAAC,sCAAsC,CAC3C,WAAmB,EACnB,SAAiB,EACjB,OAAe,EACf,GAAwB,EACxB,EAAW,EACX,sBAA2C,EAC3C,KAAc,EACd,8BAA8B,GAAG,KAAK,EACtC,UAA6B,EAC7B,aAA8B,EAC9B,aAAa,GAAG,KAAK,EACrB,eAAwB;QAIxB,MAAM,mBAAmB,GAGrB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAIxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAE5D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAEnE,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnB,GAAG,EAAE,gCAAgC,SAAS,EAAE;aAChD,CAAC,CAAC,CAAC;YAEJ,OAAO,mBAAmB,CAAC;QAC5B,CAAC;QAED,mBAAmB,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;QAE1D,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,eAAe,CAAC,0BAA0B,EAAE;gBACrD,OAAO,EAAE;oBACR,IAAI,EAAE,GAAG;oBACT,cAAc,EAAE,IAAI,CAAC,sCAAsC,CAAC,IAAI;oBAChE,SAAS;iBACT;aACD,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,eAAe,CAAC,aAAa;YAAE,OAAO,mBAAmB,CAAC;QAE9D,MAAM,oBAAoB,GAAG,eAAe,CAAC,WAAW,CAAC;QAEzD,IAAI,WAAW,KAAK,oBAAoB,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CAAC,sCAAsC,EAAE;gBACjE,OAAO,EAAE;oBACR,cAAc,EAAE,IAAI,CAAC,sCAAsC,CAAC,IAAI;oBAChE,WAAW;oBACX,oBAAoB;iBACpB;aACD,CAAC,CAAC;QACJ,CAAC;QAQD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO;YAAE,OAAO,mBAAmB,CAAC;QAGzC,MAAM,WAAW,GAAG,eAAe,CAAC,oBAAoB,CAAC;QACzD,MAAM,gBAAgB,GACrB,WAAW,YAAY,IAAI;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE;YACpC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC7B,IAAI,gBAAgB,GAAG,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,iBAAiB,CAC9B,CAAC;YACF,OAAO,mBAAmB,CAAC;QAC5B,CAAC;QAMD,IACC,uBAAuB,CACtB,eAAe,EACf,eAAe,CAAC,cAAc,EAAE,eAAe,CAC/C,EACA,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,GAAG,EAAE,qCAAqC,IAAI,CAAC,QAAQ,eAAe;gBACtE,IAAI,EAAE;oBACL,0BAA0B,EAAE,OAAO,CAClC,eAAe,CAAC,cAAc,EAAE,eAAe,CAC/C;iBACD;aACD,CAAC,CAAC,CAAC;YACJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,uBAAuB,CACpC,CAAC;YACF,OAAO,mBAAmB,CAAC;QAC5B,CAAC;QAGD,IAAI,sBAAsB,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAC/C,sBAAsB,EACtB,eAAe,EACf,eAAe,CAAC,WAAW,EAC3B,eAAe,CAAC,OAAO,EACvB,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,MAAM,EAAE,OAAO;oBAC9B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW;oBACpC,CAAC,CAAC,SAAS,EACZ,eAAe,CAAC,MAAM,EAAE,OAAO;oBAC9B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS;oBAClC,CAAC,CAAC,SAAS,CACZ,CAAC;gBAEF,IAAI,WAAW,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBAClB,GAAG,EAAE,2CAA2C,IAAI,CAAC,QAAQ,eAAe;wBAC5E,IAAI,EAAE;4BACL,WAAW,EAAE,eAAe,CAAC,WAAW;4BACxC,MAAM,EAAE,WAAW;yBACnB;qBACD,CAAC,CAAC,CAAC;oBACJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,mBAAmB,EAChC;wBAKC,WAAW,EAAE,mBAAmB,CAAC,WAAW,CAAC;qBAC7C,CACD,CAAC;oBACF,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAClB,GAAG,EAAE,kDAAkD,IAAI,CAAC,QAAQ,eAAe;oBACnF,KAAK;iBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACF,CAAC;QAGD,IAAI,KAAK,IAAI,8BAA8B,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBAClB,GAAG,EAAE,wCAAwC,IAAI,CAAC,QAAQ,eAAe;wBACzE,IAAI,EAAE,EAAE,WAAW,EAAE;qBACrB,CAAC,CAAC,CAAC;oBACJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,iBAAiB,EAC9B,IAAI,CACJ,CAAC;oBACF,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAClB,GAAG,EAAE,+CAA+C,IAAI,CAAC,QAAQ,eAAe;oBAChF,KAAK;iBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACF,CAAC;QAKD,MAAM,uBAAuB,GAC5B,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC,UAAU,EAAE,OAAO;YACpD,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,uBAAuB;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,eAAmC,CAAC;QACxC,IAAI,uBAAuB,KAAK,SAAS,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;YACrE,eAAe,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,eAAe,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACJ,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iCAAiC,CACjE,WAAW,EACX,eAAe,CACf,CAAC;oBACF,IAAI,UAAU,IAAI,uBAAuB,EAAE,CAAC;wBAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;4BAClB,GAAG,EAAE,6CAA6C,IAAI,CAAC,QAAQ,eAAe;4BAC9E,IAAI,EAAE,EAAE,UAAU,EAAE,uBAAuB,EAAE;yBAC7C,CAAC,CAAC,CAAC;wBACJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,yBAAyB,EACtC,IAAI,CACJ,CAAC;wBACF,OAAO,mBAAmB,CAAC;oBAC5B,CAAC;gBACF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBAClB,GAAG,EAAE,oDAAoD,IAAI,CAAC,QAAQ,eAAe;wBACrF,KAAK;qBACL,CAAC,CAAC,CAAC;gBACL,CAAC;YACF,CAAC;QACF,CAAC;QAED,MAAM,aAAa,GAAG,eAAe,CAAC,SAAS;YAC9C,CAAC,CAAC,MAAM,IAAI,CAAC,kCAAkC,CAAC,eAAe,CAAC,SAAS,CAAC;YAC1E,CAAC,CAAC,SAAS,CAAC;QAEb,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAC5C,aAAa,EAAE,QAAQ,EACvB,GAAG,CAAC,aAAa,EACjB,EAAE,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAChC,CAAC;QAEF,CAAC;YACA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,yBAAyB,CACjD,GAAG,EACH,eAAe,CAAC,MAAM,EACtB,aAAa,EACb,EAAE,EACF,gBAAgB,CAChB,CAAC;YACF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAClB,GAAG,EAAE,sCAAsC,IAAI,CAAC,QAAQ,eAAe;oBACvE,IAAI,EAAE;wBACL,EAAE;wBACF,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,SAAS,EAAE,gBAAgB,EAAE,MAAM;wBACnC,aAAa,EAAE,gBAAgB,EAAE,UAAU;wBAC3C,UAAU,EAAE,YAAY,CAAC,gBAAgB,EAAE,UAAU,CAAC;wBACtD,cAAc,EAAE,YAAY,CAAC,gBAAgB,EAAE,cAAc,CAAC;wBAC9D,YAAY,EAAE,gBAAgB,EAAE,SAAS;qBACzC;iBACD,CAAC,CAAC,CAAC;gBACJ,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjE,OAAO,mBAAmB,CAAC;YAC5B,CAAC;QACF,CAAC;QAMD,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,SAAS,EAAE;gBAClD,QAAQ,EAAE;oBACT,KAAK;oBACL,eAAe,EAAE,eAAe,IAAI,yBAAyB,CAAC,KAAK,CAAC;iBACpE;aACD,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,EAAE,CAAC;YACR,MAAM,kBAAkB,GAAG,yBAAyB,CACnD,eAAe,CAAC,SAAS,CACzB,CAAC;YAGF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAChE,MAAM,iBAAiB,GAAG,YAAY,EAAE,QAAQ,EAAE,iBAAiB,CAAC;YAEpE,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,SAAS,EAAE;gBAClD,UAAU,EAAE,qBAAqB,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;YAEH,IAAI,iBAAiB,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACzC,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAC/C,EAAE,EACF,kBAAkB,EAClB,MAAM,EACN,GAAG,CAAC,aAAa,EACjB,iBAAiB,EACjB,gBAAgB,EAAE,MAAM,CACxB,CAAC;gBAEF,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;wBACnB,GAAG,EAAE,4BAA4B,IAAI,CAAC,QAAQ,UAAU;wBACxD,IAAI,EAAE;4BACL,EAAE;4BACF,WAAW,EAAE,kBAAkB,CAAC,OAAO;4BACvC,KAAK,EAAE,YAAY,CAAC,YAAY;4BAChC,UAAU,EAAE,YAAY,CAAC,UAAU;yBACnC;qBACD,CAAC,CAAC,CAAC;oBACJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,YAAY,CAAC,oBAAoB,CACjC,CAAC;oBACF,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,KAAyB,CAAC;QAC9B,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,mBAAmB,CACvC,gBAAgB,EAChB,eAAe,CAAC,MAAM,EACtB,aAAa,CACb,CAAC;YACF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACtB,aAAa,CAAC,eAAe,GAAG;oBAC/B,GAAG,aAAa,CAAC,eAAe;oBAChC,YAAY;iBACZ,CAAC;YACH,CAAC;YACD,KAAK,GAAG,wBAAwB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClB,IAAI,EAAE;oBACL,eAAe,EAAE,EAAE,GAAG,CAAC,aAAa,EAAE,eAAe,IAAI,EAAE,CAAC,EAAE;oBAC9D,KAAK;oBACL,UAAU,EAAE,YAAY,CAAC,gBAAgB,EAAE,UAAU,CAAC;oBACtD,cAAc,EAAE,YAAY,CAAC,gBAAgB,EAAE,cAAc,CAAC;iBAC9D;aACD,CAAC,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC;YACJ,MAAM,aAAa,GAAyB;gBAC3C,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,aAAa,EAAE,QAAQ;gBACvB,OAAO,EAAE,eAAe,CAAC,OAAO;gBAChC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,oBAAoB,EAAE,eAAe,CAAC,oBAAoB;gBAC1D,gBAAgB,EAAE,eAAe,CAAC,gBAAgB;gBAClD,WAAW,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO;oBAC3C,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW;oBACpC,CAAC,CAAC,SAAS;gBACZ,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,QAAQ,EAAE,gBAAgB;gBAC1B,KAAK;gBACL,SAAS,EAAE,aAAa,EAAE,SAAS;gBACnC,eAAe,EAAE,aAAa,EAAE,eAAe;gBAC/C,iBAAiB,EAAE,aAAa,EAAE,iBAAiB;gBACnD,iBAAiB,EAAE,aAAa,EAAE,iBAAiB;gBACnD,YAAY,EAAE,aAAa,EAAE,YAAY;gBAEzC,CAAC,EAAE,aAAa,EAAE,CAAC;gBACnB,kBAAkB,EAAE,aAAa,EAAE,MAAM;gBACzC,QAAQ,EAAE,aAAa,EAAE,QAAQ;gBACjC,OAAO,EAAE,aAAa,EAAE,OAAO;gBAC/B,MAAM,EAAE,aAAa,EAAE,MAAM;gBAC7B,UAAU,EAAE,aAAa,EAAE,UAAU;gBACrC,SAAS,EAAE,aAAa,EAAE,SAAS;gBACnC,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,GAAG,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC;gBAEnD,GAAG,uBAAuB,CAAC,aAAa,CAAC;gBAMzC,eAAe,EAAE,qBAAqB,CAAC,aAAa,CAAC;aACrD,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CACvD,aAAa,EACb,MAAM,CACN,CAAC;YAEF,IAAI,QAAQ,CAAC,QAAQ,KAAK,uBAAuB,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAClB,GAAG,EAAE,2BAA2B,IAAI,CAAC,QAAQ,iCAAiC;oBAC9E,IAAI,EAAE;wBACL,WAAW,EAAE,eAAe,CAAC,WAAW;wBACxC,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;qBACnB;iBACD,CAAC,CAAC,CAAC;gBAKJ,MAAM,IAAI,CAAC,sBAAsB,CAChC,eAAe,EACf,CAAC,QAAQ,CAAC,MAAM;oBACf,YAAY,CAAC,+BAA+B,CAAiB,CAC9D,CAAC;gBACF,OAAO,mBAAmB,CAAC;YAC5B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnB,GAAG,EAAE,4BAA4B,IAAI,CAAC,QAAQ,UAAU;gBACxD,IAAI,EAAE;oBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACnB;aACD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnB,GAAG,EAAE,4CAA4C,IAAI,CAAC,QAAQ,eAAe;gBAC7E,GAAG,EAAE,KAAK;aACV,CAAC,CAAC,CAAC;QAEL,CAAC;QAGD,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,SAAS,EAAE;gBAClE,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC;QAED,OAAO;YACN,QAAQ,EAAE,IAAI;YACd,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,eAAe,CAAC,SAAS,IAAI;gBAChC,SAAS,EAAE,eAAe,CAAC,SAAS;aACpC,CAAC;SACF,CAAC;IACH,CAAC;IAMO,KAAK,CAAC,sBAAsB,CACnC,eAAwB,EACxB,MAAoB,EACpB,UAA+C,EAAE;QAEjD,MAAM,MAAM,GAAkB,EAAE,MAAM,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC5E,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,SAAS,EAAE;YAClD,MAAM;YACN,GAAG,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,SAAS,EAAE;gBAClE,aAAa,EAAE,IAAI;gBACnB,MAAM;gBACN,GAAG,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACnC,GAAG,OAAO;aACV,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;CACD"}
@@ -1,21 +1,21 @@
1
1
  import { buildAllWindowIncrements } from "../../util/usageCounters.js";
2
- import { DecisionMachineRunner } from "../decisionMachine/decisionMachineRunner.js";
3
2
  import { rawTlsSignalsFromRecord } from "../../api/rawTlsSignalsMiddleware.js";
4
- import { isClientSessionMismatch, toStoredClientMetaData } from "../../utils/clientMetaData.js";
5
3
  import { getCompositeIpAddress, getIpAddressFromComposite, isSameIpOrigin } from "../../compositeIpAddress.js";
6
- import { computeDnsAsymmetry, enrichDnsEvent, getIpInfoAsn } from "../dnsEvent/enrichDnsEvent.js";
7
- import { CaptchaManager } from "../captchaManager.js";
8
- import { applyRouter } from "../frictionless/routingMachine.js";
9
4
  import { deepValidateIpAddress } from "../../util.js";
5
+ import { isClientSessionMismatch, toStoredClientMetaData } from "../../utils/clientMetaData.js";
10
6
  import { deriveTrafficPolicies } from "../../utils/devicePlatform.js";
7
+ import { computeDnsAsymmetry, enrichDnsEvent, getIpInfoAsn } from "../dnsEvent/enrichDnsEvent.js";
8
+ import { CaptchaManager } from "../captchaManager.js";
9
+ import { DecisionMachineRunner } from "../decisionMachine/decisionMachineRunner.js";
11
10
  import { computeFrictionlessScore } from "../frictionless/frictionlessTasksUtils.js";
12
- import { evaluateEmailSpamRules, normaliseEmailForMatching } from "../spam/evaluateEmailSpamRules.js";
13
11
  import { checkPowSignature, isCoordsAllZero, validateSolution } from "./powTasksUtils.js";
12
+ import { evaluateEmailSpamRules, normaliseEmailForMatching } from "../spam/evaluateEmailSpamRules.js";
13
+ import { applyRouter } from "../frictionless/routingMachine.js";
14
14
  import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
15
15
  import { ApiParams, CaptchaStatus, CaptchaType, DecisionMachineDecision, FrictionlessReason, POW_SEPARATOR, ResultReason, SimdReadingsStage, isBlockingCaptchaResult } from "@prosopo/types";
16
- import { assertCoordsSafe, at, extractData, verifyRecency } from "@prosopo/util";
17
- import { describeMatchedRule } from "@prosopo/user-access-policy";
18
16
  import { stringToHex, u8aToHex } from "@polkadot/util";
17
+ import { describeMatchedRule } from "@prosopo/user-access-policy";
18
+ import { assertCoordsSafe, at, extractData, verifyRecency } from "@prosopo/util";
19
19
  //#region src/tasks/powCaptcha/powTasks.ts
20
20
  var DEFAULT_POW_DIFFICULTY = 4;
21
21
  var PowCaptchaManager = class extends CaptchaManager {
@@ -1,7 +1,7 @@
1
1
  import { ProsopoApiError } from "@prosopo/common";
2
+ import { stringToHex } from "@polkadot/util";
2
3
  import { hashMeetsDifficulty } from "@prosopo/util";
3
4
  import { signatureVerify } from "@prosopo/util-crypto";
4
- import { stringToHex } from "@polkadot/util";
5
5
  import { sha256 } from "@noble/hashes/sha2.js";
6
6
  //#region src/tasks/powCaptcha/powTasksUtils.ts
7
7
  var validateSolution = (nonce, challenge, difficulty) => hashMeetsDifficulty(sha256(new TextEncoder().encode(nonce + challenge)), difficulty);
@@ -1,26 +1,24 @@
1
- import type { Logger } from "@prosopo/logger";
2
- import type { KeyringPair, ProsopoConfigOutput } from "@prosopo/types";
3
- import { type ClientMetaData, type IPAddress, type ISpamFilterRules, type ITrafficFilter, type PoWChallengeId, type PuzzleEvent, type RequestHeaders } from "@prosopo/types";
4
- import type { IProviderDatabase } from "@prosopo/types-database";
1
+ import { type CaptchaResult, CaptchaType, type ClientMetaData, type DecisionMachineInput, type IPAddress, type ISpamFilterRules, type ITrafficFilter, type PoWChallengeId, type PuzzleEvent, type RequestHeaders } from "@prosopo/types";
2
+ import type { PuzzleCaptchaRecord } from "@prosopo/types-database";
5
3
  import type { ProviderEnvironment } from "@prosopo/types-env";
6
- import { type AccessRulesStorage } from "@prosopo/user-access-policy";
7
- import { type UsageCounters } from "../../util/usageCounters.js";
8
- import { CaptchaManager } from "../captchaManager.js";
9
- interface PuzzleCaptchaChallenge {
10
- challenge: PoWChallengeId;
4
+ import type { AccessRulesStorage } from "@prosopo/user-access-policy";
5
+ import { InteractiveCaptchaManager, type InteractiveCaptchaRecordUpdate, type MintedChallenge } from "../interactiveCaptcha/interactiveCaptchaManager.js";
6
+ interface PuzzleCaptchaChallenge extends MintedChallenge {
11
7
  targetX: number;
12
8
  targetY: number;
13
9
  originX: number;
14
10
  originY: number;
15
11
  tolerance: number;
16
- providerSignature: string;
17
- requestedAtTimestamp: number;
18
12
  }
19
- export declare class PuzzleCaptchaManager extends CaptchaManager {
20
- POW_SEPARATOR: string;
21
- private decisionMachineRunner;
22
- private readonly usageCounters;
23
- constructor(db: IProviderDatabase, pair: KeyringPair, config: ProsopoConfigOutput, logger?: Logger, usageCounters?: UsageCounters | null);
13
+ export declare class PuzzleCaptchaManager extends InteractiveCaptchaManager<PuzzleCaptchaRecord> {
14
+ protected readonly captchaType = CaptchaType.puzzle;
15
+ protected readonly logLabel = "puzzle";
16
+ protected getRecordByChallenge(challenge: string): Promise<PuzzleCaptchaRecord | null>;
17
+ protected updateRecord(challenge: PoWChallengeId, updates: InteractiveCaptchaRecordUpdate): Promise<void>;
18
+ protected updateSubmissionResult(challenge: PoWChallengeId, result: CaptchaResult, userSignature: string, coords: [number, number][][] | undefined): Promise<void>;
19
+ protected claimSubmission(record: PuzzleCaptchaRecord): Promise<boolean>;
20
+ protected markRecordChecked(challenge: PoWChallengeId): Promise<boolean>;
21
+ protected decisionMachineEventFields(record: PuzzleCaptchaRecord): Partial<DecisionMachineInput>;
24
22
  getPuzzleCaptchaChallenge(userAccount: string, dappAccount: string, origin: string, tolerance?: number): Promise<PuzzleCaptchaChallenge>;
25
23
  verifyPuzzleCaptchaSolution(challenge: PoWChallengeId, providerChallengeSignature: string, finalX: number, finalY: number, puzzleEvents: PuzzleEvent[], timeout: number, userTimestampSignature: string, ipAddress: IPAddress, headers: RequestHeaders, behavioralData?: string, salt?: string, simdReadings?: string, clientMetaData?: ClientMetaData): Promise<boolean>;
26
24
  serverVerifyPuzzleCaptchaSolution(dappAccount: string, challenge: string, timeout: number, env: ProviderEnvironment, ip?: string, userAccessRulesStorage?: AccessRulesStorage, email?: string, spamEmailDomainCheckingEnabled?: boolean, spamFilter?: ISpamFilterRules, trafficFilter?: ITrafficFilter, storeMetadata?: boolean, clientSessionId?: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"puzzleTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/puzzleCaptcha/puzzleTasks.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAMvE,OAAO,EAKN,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EAKnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACN,KAAK,kBAAkB,EAEvB,MAAM,6BAA6B,CAAC;AAarC,OAAO,EACN,KAAK,aAAa,EAElB,MAAM,6BAA6B,CAAC;AAMrC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYtD,UAAU,sBAAsB;IAC/B,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,oBAAqB,SAAQ,cAAc;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;gBAGpD,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI;IAgB/B,yBAAyB,CAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IA6C5B,2BAA2B,CAChC,SAAS,EAAE,cAAc,EACzB,0BAA0B,EAAE,MAAM,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,cAAc,GAC7B,OAAO,CAAC,OAAO,CAAC;IAqRb,iCAAiC,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,mBAAmB,EACxB,EAAE,CAAC,EAAE,MAAM,EACX,sBAAsB,CAAC,EAAE,kBAAkB,EAC3C,KAAK,CAAC,EAAE,MAAM,EACd,8BAA8B,UAAQ,EACtC,UAAU,CAAC,EAAE,gBAAgB,EAC7B,aAAa,CAAC,EAAE,cAAc,EAC9B,aAAa,UAAQ,EACrB,eAAe,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAygBrE"}
1
+ {"version":3,"file":"puzzleTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/puzzleCaptcha/puzzleTasks.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,aAAa,EAClB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EACN,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACpB,MAAM,oDAAoD,CAAC;AAG5D,UAAU,sBAAuB,SAAQ,eAAe;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,yBAAyB,CAAC,mBAAmB,CAAC;IACvF,SAAS,CAAC,QAAQ,CAAC,WAAW,sBAAsB;IACpD,SAAS,CAAC,QAAQ,CAAC,QAAQ,YAAY;IAEvC,SAAS,CAAC,oBAAoB,CAC7B,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAItC,SAAS,CAAC,YAAY,CACrB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,8BAA8B,GACrC,OAAO,CAAC,IAAI,CAAC;IAIhB,SAAS,CAAC,sBAAsB,CAC/B,SAAS,EAAE,cAAc,EACzB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC;cAWA,eAAe,CAC9B,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,OAAO,CAAC;IAInB,SAAS,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxE,SAAS,CAAC,0BAA0B,CACnC,MAAM,EAAE,mBAAmB,GACzB,OAAO,CAAC,oBAAoB,CAAC;IAY1B,yBAAyB,CAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IAsC5B,2BAA2B,CAChC,SAAS,EAAE,cAAc,EACzB,0BAA0B,EAAE,MAAM,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,cAAc,GAC7B,OAAO,CAAC,OAAO,CAAC;IAwBb,iCAAiC,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,mBAAmB,EACxB,EAAE,CAAC,EAAE,MAAM,EACX,sBAAsB,CAAC,EAAE,kBAAkB,EAC3C,KAAK,CAAC,EAAE,MAAM,EACd,8BAA8B,UAAQ,EACtC,UAAU,CAAC,EAAE,gBAAgB,EAC7B,aAAa,CAAC,EAAE,cAAc,EAC9B,aAAa,UAAQ,EACrB,eAAe,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAgBrE"}