@sekyro/web 0.1.0-rc.6 → 0.1.0-rc.8

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 (118) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/LICENSE +25 -16
  3. package/README.md +6 -8
  4. package/THIRD-PARTY-NOTICES.txt +154 -0
  5. package/dist/background-monitor-A7FKJOAG.js +1 -0
  6. package/dist/capture-session-doc-YBE3UMJJ.js +1 -0
  7. package/dist/{capture-session-v3-Okq0EQHG.d.ts → capture-session-v3-CQK-G-qX.d.ts} +72 -3
  8. package/dist/{capture-session-v3-UQU_WjO2.d.cts → capture-session-v3-Dvob-uH2.d.cts} +72 -3
  9. package/dist/chunk-4RS2YIL4.js +1 -0
  10. package/dist/chunk-7V2M6Y2W.js +1 -0
  11. package/dist/chunk-7ZCZY3ZP.js +1 -0
  12. package/dist/chunk-A3FUGHAH.js +2 -0
  13. package/dist/chunk-BPE5NSQ2.js +1 -0
  14. package/dist/chunk-CJHMFPL6.js +1 -0
  15. package/dist/chunk-DFTCAWMP.js +1 -0
  16. package/dist/chunk-DK5YPBDQ.js +1 -0
  17. package/dist/chunk-DQWW4OCK.js +1 -0
  18. package/dist/chunk-FHJ7HO3M.js +1 -0
  19. package/dist/chunk-FPXL63KZ.js +1 -0
  20. package/dist/chunk-G6LKLN4U.js +1 -0
  21. package/dist/chunk-GI3UFGRQ.js +1 -0
  22. package/dist/chunk-LQ7C44JG.js +1 -0
  23. package/dist/chunk-M43ET4NJ.js +1 -0
  24. package/dist/chunk-MXWLCDFX.js +1 -0
  25. package/dist/chunk-MY6EXEL2.js +1 -0
  26. package/dist/chunk-O5WKNZ2C.js +1 -0
  27. package/dist/chunk-OKWG3PVH.js +1 -0
  28. package/dist/chunk-POIQGEZM.js +1 -0
  29. package/dist/chunk-RI3E7GBN.js +1 -0
  30. package/dist/chunk-RNRFHUJA.js +1 -0
  31. package/dist/chunk-RVHAKRAI.js +1 -0
  32. package/dist/chunk-SMKCBUJL.js +1 -0
  33. package/dist/chunk-SXZCL5NO.js +1 -0
  34. package/dist/chunk-TDLIXFDT.js +1 -0
  35. package/dist/chunk-XLN5OT25.js +1 -0
  36. package/dist/chunk-YDQBVWXG.js +1 -0
  37. package/dist/chunk-YPG7CB4O.js +1 -0
  38. package/dist/client/index.cjs +1 -357
  39. package/dist/client/index.d.cts +13 -3
  40. package/dist/client/index.d.ts +13 -3
  41. package/dist/client/index.js +1 -15
  42. package/dist/core/index.cjs +1 -1639
  43. package/dist/core/index.d.cts +3 -3
  44. package/dist/core/index.d.ts +3 -3
  45. package/dist/core/index.js +1 -139
  46. package/dist/core/ocr/worker.bundle.js +42 -0
  47. package/dist/core/ocr/worker.cjs +42 -0
  48. package/dist/core/ocr/worker.d.cts +84 -0
  49. package/dist/core/ocr/worker.d.ts +84 -0
  50. package/dist/core/ocr/worker.js +41 -0
  51. package/dist/core/v3/detect-worker.cjs +1 -392
  52. package/dist/core/v3/detect-worker.d.cts +1 -1
  53. package/dist/core/v3/detect-worker.d.ts +1 -1
  54. package/dist/core/v3/detect-worker.js +1 -13
  55. package/dist/create-document-capture-T4APHJMY.js +1 -0
  56. package/dist/create-portrait-capture-B57GE5FU.js +1 -0
  57. package/dist/create-verification-C0AVIcVW.d.ts +2787 -0
  58. package/dist/create-verification-DoFpgzok.d.cts +2787 -0
  59. package/dist/{detect-worker-CKXHlXx9.d.cts → detect-worker-DclNxkZT.d.cts} +6 -0
  60. package/dist/{detect-worker-CKXHlXx9.d.ts → detect-worker-DclNxkZT.d.ts} +6 -0
  61. package/dist/detector-scanic-YCDNLCGV.js +1 -0
  62. package/dist/icao-gate-D8qm1O2t.d.cts +1655 -0
  63. package/dist/icao-gate-D8qm1O2t.d.ts +1655 -0
  64. package/dist/icao-gate-PWBMKRGC.js +1 -0
  65. package/dist/icao-tuning-4GGVX6B4.js +1 -0
  66. package/dist/index.cjs +1 -3030
  67. package/dist/index.d.cts +52 -6
  68. package/dist/index.d.ts +52 -6
  69. package/dist/index.js +1 -85
  70. package/dist/internal/index.cjs +1 -4439
  71. package/dist/internal/index.d.cts +352 -312
  72. package/dist/internal/index.d.ts +352 -312
  73. package/dist/internal/index.js +1 -657
  74. package/dist/keyframe-rank-YAJLYJYF.js +1 -0
  75. package/dist/landmarker-KB7LVXAU.js +1 -0
  76. package/dist/mrz-band-VYHOTDHY.js +1 -0
  77. package/dist/plan-runner-UBK4B4CG.js +1 -0
  78. package/dist/popup/index.cjs +1 -76
  79. package/dist/popup/index.js +1 -11
  80. package/dist/scanic-ml-stub-KW7IZHUT.js +1 -0
  81. package/dist/segmenter-USLNBX65.js +1 -0
  82. package/dist/turnstile-FATNZ4AG.js +1 -0
  83. package/package.json +25 -10
  84. package/sbom.cdx.json +195 -0
  85. package/dist/chunk-MWNFSNMP.js +0 -52
  86. package/dist/chunk-MWNFSNMP.js.map +0 -1
  87. package/dist/chunk-NILNKLK6.js +0 -50
  88. package/dist/chunk-NILNKLK6.js.map +0 -1
  89. package/dist/chunk-NWF46H7K.js +0 -359
  90. package/dist/chunk-NWF46H7K.js.map +0 -1
  91. package/dist/chunk-R3SJQHYU.js +0 -1173
  92. package/dist/chunk-R3SJQHYU.js.map +0 -1
  93. package/dist/chunk-TG5IE552.js +0 -1128
  94. package/dist/chunk-TG5IE552.js.map +0 -1
  95. package/dist/chunk-WY6U7AIK.js +0 -193
  96. package/dist/chunk-WY6U7AIK.js.map +0 -1
  97. package/dist/chunk-YVFF4Q4G.js +0 -327
  98. package/dist/chunk-YVFF4Q4G.js.map +0 -1
  99. package/dist/client/index.cjs.map +0 -1
  100. package/dist/client/index.js.map +0 -1
  101. package/dist/core/index.cjs.map +0 -1
  102. package/dist/core/index.js.map +0 -1
  103. package/dist/core/v3/detect-worker.cjs.map +0 -1
  104. package/dist/core/v3/detect-worker.js.map +0 -1
  105. package/dist/create-verification-BKc9NFQj.d.cts +0 -455
  106. package/dist/create-verification-DjcMZHAQ.d.ts +0 -455
  107. package/dist/detector-scanic-4C6IEW2K.js +0 -787
  108. package/dist/detector-scanic-4C6IEW2K.js.map +0 -1
  109. package/dist/hosted-client-DJXq_CB9.d.cts +0 -449
  110. package/dist/hosted-client-DJXq_CB9.d.ts +0 -449
  111. package/dist/index.cjs.map +0 -1
  112. package/dist/index.js.map +0 -1
  113. package/dist/internal/index.cjs.map +0 -1
  114. package/dist/internal/index.js.map +0 -1
  115. package/dist/popup/index.cjs.map +0 -1
  116. package/dist/popup/index.js.map +0 -1
  117. package/dist/scanic-ml-stub-S2OZ6HEF.js +0 -10
  118. package/dist/scanic-ml-stub-S2OZ6HEF.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,3030 +1 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- DEFAULT_API_ORIGIN: () => DEFAULT_API_ORIGIN,
34
- HostedApiError: () => HostedApiError,
35
- KNOWN_CODES: () => KNOWN_CODES,
36
- SEKYRO_EVENTS: () => SEKYRO_EVENTS,
37
- createLivenessCapture: () => createLivenessCapture,
38
- createVerification: () => createVerification,
39
- getLivenessAssetsStatus: () => getLivenessAssetsStatus,
40
- hasMultipleCameras: () => hasMultipleCameras,
41
- isKnownCode: () => isKnownCode,
42
- openHosted: () => openHosted,
43
- preloadLivenessAssets: () => preloadLivenessAssets,
44
- queryCameraPermission: () => queryCameraPermission,
45
- releaseLivenessAssets: () => releaseLivenessAssets,
46
- subscribeCameraPermission: () => subscribeCameraPermission,
47
- subscribeLivenessAssets: () => subscribeLivenessAssets
48
- });
49
- module.exports = __toCommonJS(src_exports);
50
-
51
- // src/core/capture-constraints.ts
52
- function buildCaptureConstraints(isMobile, facingMode) {
53
- void isMobile;
54
- return {
55
- video: {
56
- width: { ideal: 1280, max: 1280 },
57
- height: { ideal: 720, max: 720 },
58
- facingMode,
59
- frameRate: { ideal: 24, max: 30 }
60
- },
61
- audio: false
62
- };
63
- }
64
- function detectIsMobile() {
65
- if (typeof window === "undefined" || typeof navigator === "undefined") return false;
66
- return window.innerWidth <= 768 || /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
67
- String(navigator.userAgent ?? "")
68
- );
69
- }
70
-
71
- // src/core/media.ts
72
- var MIME_CANDIDATES = [
73
- "video/mp4;codecs=avc1.42E01E,mp4a.40.2",
74
- "video/mp4;codecs=avc1.42E01E",
75
- "video/mp4",
76
- "video/webm;codecs=vp9,opus",
77
- "video/webm;codecs=vp9",
78
- "video/webm;codecs=vp8,opus",
79
- "video/webm;codecs=vp8",
80
- "video/webm"
81
- ];
82
- function pickMimeType() {
83
- const MR = globalThis.MediaRecorder;
84
- if (!MR || typeof MR.isTypeSupported !== "function") return "";
85
- return MIME_CANDIDATES.find((t) => MR.isTypeSupported(t)) ?? "";
86
- }
87
- var DEFAULT_CLIP_MIME = "video/webm";
88
- function mapGetUserMediaError(err) {
89
- if (err instanceof TypeError) return "insecure";
90
- const name = err?.name ?? "";
91
- switch (name) {
92
- case "NotAllowedError":
93
- case "PermissionDeniedError":
94
- return "permission";
95
- case "NotFoundError":
96
- case "DevicesNotFoundError":
97
- return "notfound";
98
- case "NotReadableError":
99
- case "TrackStartError":
100
- return "inuse";
101
- case "OverconstrainedError":
102
- case "ConstraintNotSatisfiedError":
103
- return "overconstrained";
104
- default:
105
- return "generic";
106
- }
107
- }
108
- function cameraPreflight() {
109
- const w = globalThis;
110
- if (typeof w.window !== "undefined" && w.window.isSecureContext === false)
111
- return "INSECURE_CONTEXT";
112
- const md = w.navigator?.mediaDevices;
113
- if (!md || typeof md.getUserMedia !== "function") return "UNSUPPORTED";
114
- return "OK";
115
- }
116
- function isMediaRecorderSupported() {
117
- const MR = globalThis.MediaRecorder;
118
- return typeof MR !== "undefined" && typeof MR.isTypeSupported === "function";
119
- }
120
- var MAX_CLIP_BYTES = 8 * 1024 * 1024;
121
- function isClipTooLarge(blob) {
122
- return blob.size > MAX_CLIP_BYTES;
123
- }
124
-
125
- // src/core/clip-recorder.ts
126
- var CLIP_MS = 2500;
127
- var TIMESLICE_MS = 1e3;
128
- var STOP_GRACE_MS = 1500;
129
- var VIDEO_BPS = 25e5;
130
- var ClipError = class extends Error {
131
- constructor(kind, msg) {
132
- super(msg ?? kind);
133
- this.kind = kind;
134
- }
135
- };
136
- var ClipRecorder = class {
137
- constructor() {
138
- this.recorder = null;
139
- this.stream = null;
140
- // own field so teardown can stop tracks (REVIEW FIX 8)
141
- this.chunks = [];
142
- this.bytes = 0;
143
- this.hardStopTimer = null;
144
- this.graceTimer = null;
145
- this.settled = false;
146
- }
147
- clearTimers() {
148
- if (this.hardStopTimer) clearTimeout(this.hardStopTimer);
149
- if (this.graceTimer) clearTimeout(this.graceTimer);
150
- this.hardStopTimer = null;
151
- this.graceTimer = null;
152
- }
153
- /** Records CLIP_MS of the stream. Resolves with the clip blob + its container mime;
154
- * rejects with ClipError. Behavior contract is the v1 hook's `start`, verbatim
155
- * (iOS workarounds included).
156
- *
157
- * ONE RECORDING AT A TIME: chunk/byte/timer state is shared per instance, so a
158
- * second record() while one is in flight rejects ClipError("generic") instead of
159
- * corrupting the in-flight clip. (v2 guard — v1's hook was gated by its owning
160
- * component; a class API invites reuse. Zero impact on clip bytes.)
161
- *
162
- * `onStopped` (optional) fires ONCE the moment the CLIP_MS recording window
163
- * elapses (the hard-stop), BEFORE finalize — which on iOS can lag up to
164
- * STOP_GRACE_MS while onstop flushes the last chunk. It lets the host freeze
165
- * the display on the already-captured keyframe the instant recording ends,
166
- * instead of waiting for the blob. PURE NOTIFICATION — it does not touch
167
- * timers, chunks, or the finalize path, so it is calibration-neutral (no
168
- * effect on clip bytes). Never fires on a rejected capture (error /
169
- * cliptoolarge settle before the hard-stop and clear the timer). */
170
- record(stream, onStopped) {
171
- if (this.recorder && !this.settled) {
172
- return Promise.reject(
173
- new ClipError(
174
- "generic",
175
- "record() called while a recording is in flight \u2014 ClipRecorder handles one recording at a time"
176
- )
177
- );
178
- }
179
- this.recorder = null;
180
- this.clearTimers();
181
- this.chunks = [];
182
- this.bytes = 0;
183
- this.settled = false;
184
- this.stream = stream;
185
- const picked = pickMimeType();
186
- return new Promise((resolve, reject) => {
187
- let recorder;
188
- try {
189
- recorder = new MediaRecorder(
190
- stream,
191
- picked ? { mimeType: picked, videoBitsPerSecond: VIDEO_BPS } : { videoBitsPerSecond: VIDEO_BPS }
192
- );
193
- } catch {
194
- try {
195
- recorder = new MediaRecorder(stream);
196
- } catch {
197
- reject(new ClipError("unsupported"));
198
- return;
199
- }
200
- }
201
- this.recorder = recorder;
202
- const settle = (fn) => {
203
- if (this.settled) return;
204
- this.settled = true;
205
- this.clearTimers();
206
- fn();
207
- };
208
- const finalize = () => settle(() => {
209
- const type = recorder.mimeType || picked || DEFAULT_CLIP_MIME;
210
- const blob = new Blob(this.chunks, { type });
211
- if (isClipTooLarge(blob)) {
212
- reject(new ClipError("cliptoolarge"));
213
- return;
214
- }
215
- resolve({ blob, mimeType: type });
216
- });
217
- recorder.ondataavailable = (e) => {
218
- if (e.data && e.data.size) {
219
- this.chunks.push(e.data);
220
- this.bytes += e.data.size;
221
- if (this.bytes > MAX_CLIP_BYTES) {
222
- settle(() => {
223
- try {
224
- if (recorder.state !== "inactive") recorder.stop();
225
- } catch {
226
- }
227
- reject(new ClipError("cliptoolarge"));
228
- });
229
- }
230
- }
231
- };
232
- recorder.onstop = finalize;
233
- recorder.onerror = () => settle(() => reject(new ClipError("generic")));
234
- try {
235
- recorder.start(TIMESLICE_MS);
236
- } catch {
237
- settle(() => reject(new ClipError("generic")));
238
- return;
239
- }
240
- this.hardStopTimer = setTimeout(() => {
241
- if (!this.settled) onStopped?.();
242
- if (recorder.state !== "inactive") {
243
- try {
244
- recorder.stop();
245
- } catch {
246
- finalize();
247
- }
248
- this.graceTimer = setTimeout(finalize, STOP_GRACE_MS);
249
- } else {
250
- finalize();
251
- }
252
- }, CLIP_MS);
253
- });
254
- }
255
- /** Idempotent teardown: stop recorder + ALL tracks (v1 `stopAndCleanup` + the unmount
256
- * effect). Optional `stream` override mirrors v1's `stopAndCleanup(stream?)`.
257
- *
258
- * MID-RECORDING SEMANTICS (verbatim v1): calling stop() while a record() is in
259
- * flight may LATER resolve the pending promise with a TRUNCATED clip (recorder.stop()
260
- * fires onstop → finalize from whatever chunks arrived so far), or — because this
261
- * method clears the hard-stop/grace timers — never settle it at all if onstop never
262
- * fires (the iOS grace path has been torn down). Callers MUST NOT treat a resolution
263
- * arriving after stop() as a full CLIP_MS clip, and must not await a record()
264
- * promise past stop() without their own timeout. (Task 4's CaptureSession owns
265
- * sequencing on top of this contract.) */
266
- stop(stream) {
267
- this.clearTimers();
268
- const rec = this.recorder;
269
- if (rec && rec.state !== "inactive") {
270
- try {
271
- rec.stop();
272
- } catch {
273
- }
274
- }
275
- this.recorder = null;
276
- const s = stream ?? this.stream;
277
- s?.getTracks().forEach((t) => t.stop());
278
- this.stream = null;
279
- }
280
- };
281
-
282
- // src/core/keyframe.ts
283
- function captureMirroredKeyframe(video, canvas, quality = 0.92) {
284
- return new Promise((resolve, reject) => {
285
- const w = video.videoWidth;
286
- const h = video.videoHeight;
287
- if (!w || !h) {
288
- reject(new Error("video-not-ready"));
289
- return;
290
- }
291
- const ctx = canvas.getContext("2d");
292
- if (!ctx) {
293
- reject(new Error("no-2d-context"));
294
- return;
295
- }
296
- canvas.width = w;
297
- canvas.height = h;
298
- ctx.scale(-1, 1);
299
- ctx.drawImage(video, -w, 0);
300
- canvas.toBlob(
301
- (blob) => blob ? resolve(blob) : reject(new Error("empty-keyframe")),
302
- "image/jpeg",
303
- quality
304
- );
305
- });
306
- }
307
-
308
- // src/core/v3/detector-blaze.ts
309
- var BLAZE_INIT_TIMEOUT_MS = 1e4;
310
- var BlazeDetector = class _BlazeDetector {
311
- constructor(inner, fallbackReason) {
312
- this.tier = "blaze";
313
- this.inner = inner;
314
- if (fallbackReason !== void 0) this.fallbackReason = fallbackReason;
315
- }
316
- static async create(assetBaseUrl, fallbackReason) {
317
- const vision = await import("@mediapipe/tasks-vision");
318
- const fileset = await vision.FilesetResolver.forVisionTasks(assetBaseUrl);
319
- const inner = await vision.FaceDetector.createFromOptions(fileset, {
320
- baseOptions: {
321
- modelAssetPath: `${assetBaseUrl}/blaze_face_short_range.tflite`,
322
- // CPU delegate — the iOS-Safari-safe path (see header). NEVER 'GPU'.
323
- delegate: "CPU"
324
- },
325
- runningMode: "IMAGE"
326
- });
327
- return new _BlazeDetector(inner, fallbackReason);
328
- }
329
- async detect(source, sourceWidth, sourceHeight) {
330
- let detections;
331
- try {
332
- detections = this.inner.detect(source).detections;
333
- } catch {
334
- return null;
335
- }
336
- const best = pickMostConfident(detections);
337
- if (best?.boundingBox === void 0) return null;
338
- const size = intrinsicSize(source);
339
- const eyes = extractEyes(best.keypoints, size);
340
- const observation = {
341
- box: {
342
- x: best.boundingBox.originX,
343
- y: best.boundingBox.originY,
344
- width: best.boundingBox.width,
345
- height: best.boundingBox.height
346
- },
347
- ...eyes !== void 0 ? { eyes } : {},
348
- score: best.categories[0]?.score ?? 0
349
- };
350
- return toStreamPixels(observation, source, sourceWidth, sourceHeight);
351
- }
352
- destroy() {
353
- try {
354
- this.inner.close();
355
- } catch {
356
- }
357
- }
358
- };
359
- function pickMostConfident(detections) {
360
- let best;
361
- let bestScore = -1;
362
- for (const detection of detections) {
363
- const score = detection.categories[0]?.score ?? 0;
364
- if (score > bestScore) {
365
- best = detection;
366
- bestScore = score;
367
- }
368
- }
369
- return best;
370
- }
371
- function extractEyes(keypoints, size) {
372
- const a = keypoints?.[0];
373
- const b = keypoints?.[1];
374
- if (a === void 0 || b === void 0) return void 0;
375
- const toSource = (p) => ({ x: p.x * size.width, y: p.y * size.height });
376
- const [pa, pb] = [toSource(a), toSource(b)];
377
- return pa.x <= pb.x ? { left: pa, right: pb } : { left: pb, right: pa };
378
- }
379
-
380
- // src/core/v3/detector-native.ts
381
- function smokeSource() {
382
- if (typeof OffscreenCanvas === "function") return new OffscreenCanvas(2, 2);
383
- const canvas = document.createElement("canvas");
384
- canvas.width = 2;
385
- canvas.height = 2;
386
- return canvas;
387
- }
388
- async function probeNativeDetector() {
389
- const ctor = globalThis.FaceDetector;
390
- if (typeof ctor !== "function") return { ok: false, reason: "unsupported" };
391
- try {
392
- const instance = new ctor({ fastMode: true, maxDetectedFaces: 1 });
393
- await instance.detect(smokeSource());
394
- return { ok: true, instance };
395
- } catch (err) {
396
- return { ok: false, reason: `smoke_failed:${err instanceof Error ? err.message : String(err)}` };
397
- }
398
- }
399
- var NativeDetector = class {
400
- constructor(inner, fallbackReason) {
401
- this.tier = "native";
402
- this.inner = inner;
403
- if (fallbackReason !== void 0) this.fallbackReason = fallbackReason;
404
- }
405
- async detect(source, sourceWidth, sourceHeight) {
406
- let faces;
407
- try {
408
- faces = await this.inner.detect(source);
409
- } catch {
410
- return null;
411
- }
412
- const face = faces[0];
413
- if (face === void 0) return null;
414
- const eyes = extractEyes2(face.landmarks);
415
- const observation = {
416
- box: {
417
- x: face.boundingBox.x,
418
- y: face.boundingBox.y,
419
- width: face.boundingBox.width,
420
- height: face.boundingBox.height
421
- },
422
- ...eyes !== void 0 ? { eyes } : {},
423
- // The Shape Detection API exposes no confidence — the smoke-tested
424
- // native tier treats any detection as confident.
425
- score: 1
426
- };
427
- return toStreamPixels(observation, source, sourceWidth, sourceHeight);
428
- }
429
- destroy() {
430
- }
431
- };
432
- function extractEyes2(landmarks) {
433
- if (landmarks === void 0) return void 0;
434
- const eyePoints = landmarks.filter((landmark) => landmark.type === "eye").map((landmark) => landmark.locations[0]).filter((point) => point !== void 0);
435
- const [a, b] = eyePoints;
436
- if (a === void 0 || b === void 0) return void 0;
437
- return a.x <= b.x ? { left: a, right: b } : { left: b, right: a };
438
- }
439
-
440
- // src/core/v3/detector.ts
441
- var DEFAULT_V3_ASSET_BASE_URL = "/models-v3";
442
- var DEFAULT_TIER_ORDER = ["native", "blaze"];
443
- var DetectorLadderError = class extends Error {
444
- constructor(fallbackReason) {
445
- super(`no detector tier available (${fallbackReason})`);
446
- this.name = "DetectorLadderError";
447
- this.fallbackReason = fallbackReason;
448
- }
449
- };
450
- function intrinsicSize(source) {
451
- const candidate = source;
452
- if (typeof candidate.videoWidth === "number" && candidate.videoWidth > 0) {
453
- return { width: candidate.videoWidth, height: candidate.videoHeight ?? 0 };
454
- }
455
- if (typeof candidate.naturalWidth === "number" && candidate.naturalWidth > 0) {
456
- return { width: candidate.naturalWidth, height: candidate.naturalHeight ?? 0 };
457
- }
458
- const width = typeof candidate.width === "number" ? candidate.width : 0;
459
- const height = typeof candidate.height === "number" ? candidate.height : 0;
460
- return { width, height };
461
- }
462
- function toStreamPixels(observation, source, streamWidth, streamHeight) {
463
- const size = intrinsicSize(source);
464
- const scaleX = size.width > 0 ? streamWidth / size.width : 1;
465
- const scaleY = size.height > 0 ? streamHeight / size.height : 1;
466
- const scalePoint = (p) => ({ x: p.x * scaleX, y: p.y * scaleY });
467
- return {
468
- box: {
469
- x: observation.box.x * scaleX,
470
- y: observation.box.y * scaleY,
471
- width: observation.box.width * scaleX,
472
- height: observation.box.height * scaleY
473
- },
474
- ...observation.eyes !== void 0 ? { eyes: { left: scalePoint(observation.eyes.left), right: scalePoint(observation.eyes.right) } } : {},
475
- score: observation.score
476
- };
477
- }
478
- function describeError(err) {
479
- return err instanceof Error ? err.message : String(err);
480
- }
481
- async function createDetector(options) {
482
- const order = options.preferred ?? DEFAULT_TIER_ORDER;
483
- const reasons = [];
484
- for (const tier of order) {
485
- if (tier === "native") {
486
- const probed = await probeNativeDetector();
487
- if (probed.ok) {
488
- return new NativeDetector(probed.instance, reasonOf(reasons));
489
- }
490
- reasons.push(`native:${probed.reason}`);
491
- continue;
492
- }
493
- try {
494
- return await withTimeout(
495
- BlazeDetector.create(
496
- options.v3AssetBaseUrl ?? DEFAULT_V3_ASSET_BASE_URL,
497
- reasonOf(reasons)
498
- ),
499
- options.blazeInitTimeoutMs ?? BLAZE_INIT_TIMEOUT_MS
500
- );
501
- } catch (err) {
502
- reasons.push(
503
- err instanceof InitTimeoutError ? "blaze:blaze_init_timeout" : `blaze:${describeError(err)}`
504
- );
505
- }
506
- }
507
- throw new DetectorLadderError(reasonOf(reasons) ?? "no_tier_available");
508
- }
509
- function reasonOf(reasons) {
510
- return reasons.length > 0 ? reasons.join("; ") : void 0;
511
- }
512
- var InitTimeoutError = class extends Error {
513
- };
514
- function withTimeout(promise, deadlineMs) {
515
- return new Promise((resolvePromise, rejectPromise) => {
516
- const timer = setTimeout(() => {
517
- rejectPromise(new InitTimeoutError(`init exceeded ${deadlineMs}ms`));
518
- promise.then(
519
- (value) => value.destroy(),
520
- () => void 0
521
- );
522
- }, deadlineMs);
523
- promise.then(
524
- (value) => {
525
- clearTimeout(timer);
526
- resolvePromise(value);
527
- },
528
- (err) => {
529
- clearTimeout(timer);
530
- rejectPromise(err);
531
- }
532
- );
533
- });
534
- }
535
-
536
- // src/core/v3/detect-worker.ts
537
- var WORKER_PROTOCOL_VERSION = 1;
538
- function workerOffloadSupported() {
539
- return typeof OffscreenCanvas === "function" && typeof createImageBitmap === "function" && typeof Worker === "function";
540
- }
541
- function installWorkerDetectorHost(scope, deps = {}) {
542
- const create = deps.createDetector ?? createDetector;
543
- let detector = null;
544
- scope.onmessage = (event) => {
545
- const message = event.data;
546
- if (message.v !== WORKER_PROTOCOL_VERSION) {
547
- message.bitmap?.close?.();
548
- return;
549
- }
550
- if (message.type === "init") {
551
- void create(message.options).then((created) => {
552
- detector = created;
553
- const ready = {
554
- v: WORKER_PROTOCOL_VERSION,
555
- type: "ready",
556
- tier: created.tier,
557
- ...created.fallbackReason !== void 0 ? { fallbackReason: created.fallbackReason } : {}
558
- };
559
- scope.postMessage(ready);
560
- });
561
- return;
562
- }
563
- if (message.type === "detect") {
564
- const respond = (observation) => {
565
- const result = {
566
- v: WORKER_PROTOCOL_VERSION,
567
- type: "result",
568
- id: message.id,
569
- observation
570
- };
571
- scope.postMessage(result);
572
- message.bitmap.close?.();
573
- };
574
- if (detector === null) {
575
- respond(null);
576
- return;
577
- }
578
- void detector.detect(message.bitmap, message.streamWidth, message.streamHeight).then(respond, () => respond(null));
579
- }
580
- };
581
- }
582
- if (typeof self !== "undefined" && typeof self.importScripts === "function") {
583
- installWorkerDetectorHost(self);
584
- }
585
- var WorkerDetectorProxy = class _WorkerDetectorProxy {
586
- constructor(worker, ready) {
587
- this.pending = /* @__PURE__ */ new Map();
588
- this.nextId = 1;
589
- this.worker = worker;
590
- this.tier = ready.tier;
591
- if (ready.fallbackReason !== void 0) this.fallbackReason = ready.fallbackReason;
592
- worker.addEventListener("message", (event) => {
593
- const message = event.data;
594
- if (message.v !== WORKER_PROTOCOL_VERSION || message.type !== "result") return;
595
- const resolve = this.pending.get(message.id);
596
- this.pending.delete(message.id);
597
- resolve?.(message.observation);
598
- });
599
- }
600
- static create(worker, options, readyTimeoutMs = 1e4) {
601
- return new Promise((resolve, reject) => {
602
- const timer = setTimeout(() => {
603
- worker.removeEventListener("message", onReady);
604
- worker.terminate();
605
- reject(new Error(`worker detector not ready within ${readyTimeoutMs}ms`));
606
- }, readyTimeoutMs);
607
- const onReady = (event) => {
608
- const message = event.data;
609
- if (message.v !== WORKER_PROTOCOL_VERSION || message.type !== "ready") return;
610
- clearTimeout(timer);
611
- worker.removeEventListener("message", onReady);
612
- resolve(new _WorkerDetectorProxy(worker, message));
613
- };
614
- worker.addEventListener("message", onReady);
615
- const init = { v: WORKER_PROTOCOL_VERSION, type: "init", options };
616
- worker.postMessage(init);
617
- });
618
- }
619
- async detect(source, sourceWidth, sourceHeight) {
620
- let bitmap;
621
- try {
622
- if (typeof ImageBitmap !== "undefined" && source instanceof ImageBitmap) {
623
- bitmap = source;
624
- } else if (typeof createImageBitmap === "function") {
625
- bitmap = await createImageBitmap(source);
626
- } else {
627
- bitmap = source;
628
- }
629
- } catch {
630
- return null;
631
- }
632
- const id = this.nextId;
633
- this.nextId += 1;
634
- return new Promise((resolve) => {
635
- this.pending.set(id, resolve);
636
- const message = {
637
- v: WORKER_PROTOCOL_VERSION,
638
- type: "detect",
639
- id,
640
- bitmap,
641
- streamWidth: sourceWidth,
642
- streamHeight: sourceHeight
643
- };
644
- this.worker.postMessage(message, [bitmap]);
645
- });
646
- }
647
- destroy() {
648
- for (const resolve of this.pending.values()) resolve(null);
649
- this.pending.clear();
650
- this.worker.terminate();
651
- }
652
- };
653
-
654
- // src/core/v3/device-profile.ts
655
- var DEVICE_PROFILES = Object.freeze({
656
- LOW: Object.freeze({ cadenceHz: 5, inputWidth: 128, animations: "reduced" }),
657
- MID: Object.freeze({ cadenceHz: 8, inputWidth: 160, animations: "full" }),
658
- HIGH: Object.freeze({ cadenceHz: 10, inputWidth: 192, animations: "full" })
659
- });
660
- var SIMD_TEST_BYTES = new Uint8Array([
661
- 0,
662
- 97,
663
- 115,
664
- 109,
665
- 1,
666
- 0,
667
- 0,
668
- 0,
669
- 1,
670
- 5,
671
- 1,
672
- 96,
673
- 0,
674
- 1,
675
- 123,
676
- 3,
677
- 2,
678
- 1,
679
- 0,
680
- 10,
681
- 10,
682
- 1,
683
- 8,
684
- 0,
685
- 65,
686
- 0,
687
- 253,
688
- 15,
689
- 253,
690
- 98,
691
- 11
692
- ]);
693
- function probeDevice() {
694
- const nav = typeof navigator === "undefined" ? void 0 : navigator;
695
- let simd = false;
696
- try {
697
- simd = typeof WebAssembly !== "undefined" && WebAssembly.validate(SIMD_TEST_BYTES);
698
- } catch {
699
- simd = false;
700
- }
701
- return {
702
- cores: nav?.hardwareConcurrency ?? 2,
703
- memGB: nav?.deviceMemory ?? null,
704
- simd
705
- };
706
- }
707
- function classifyDevice(probe) {
708
- const memGB = probe.memGB ?? 4;
709
- if (probe.cores < 4 || memGB < 3) return "LOW";
710
- if (probe.cores >= 8 && memGB >= 6) return "HIGH";
711
- return "MID";
712
- }
713
- var ORDER = ["LOW", "MID", "HIGH"];
714
- var DeviceProfiler = class {
715
- constructor(initial) {
716
- this.samples = [];
717
- this.adjusted = false;
718
- this.current = initial;
719
- }
720
- get deviceClass() {
721
- return this.current;
722
- }
723
- get profile() {
724
- return DEVICE_PROFILES[this.current];
725
- }
726
- record(detectMs) {
727
- if (this.adjusted || this.samples.length >= 10) return this.current;
728
- this.samples.push(detectMs);
729
- if (this.samples.length < 10) return this.current;
730
- this.adjusted = true;
731
- const mean = this.samples.reduce((sum, value) => sum + value, 0) / this.samples.length;
732
- if (mean > 70) {
733
- this.current = "LOW";
734
- } else if (mean < 25) {
735
- const index = ORDER.indexOf(this.current);
736
- this.current = ORDER[Math.min(ORDER.length - 1, index + 1)] ?? this.current;
737
- }
738
- return this.current;
739
- }
740
- };
741
-
742
- // src/core/v3/detect-scheduler.ts
743
- var STATS_WINDOW = 20;
744
- var DetectScheduler = class {
745
- constructor(options) {
746
- this.timer = null;
747
- this.frameCallbackId = null;
748
- this.running = false;
749
- this.busy = false;
750
- this.lastRunAt = Number.NEGATIVE_INFINITY;
751
- this.degradeCount = 0;
752
- this.durations = [];
753
- this.options = options;
754
- this.periodMs = 1e3 / options.cadenceHz;
755
- }
756
- start() {
757
- if (this.running) return;
758
- this.running = true;
759
- const video = this.options.video;
760
- if (typeof video?.requestVideoFrameCallback === "function") {
761
- const loop = () => {
762
- if (!this.running) return;
763
- this.frameCallbackId = video.requestVideoFrameCallback?.(() => {
764
- this.frameCallbackId = null;
765
- if (this.now() - this.lastRunAt >= this.periodMs) this.tick();
766
- loop();
767
- });
768
- };
769
- loop();
770
- return;
771
- }
772
- this.timer = setInterval(() => this.tick(), this.periodMs);
773
- }
774
- stop() {
775
- this.running = false;
776
- if (this.timer !== null) {
777
- clearInterval(this.timer);
778
- this.timer = null;
779
- }
780
- if (this.frameCallbackId !== null) {
781
- this.options.video?.cancelVideoFrameCallback?.(
782
- this.frameCallbackId
783
- );
784
- this.frameCallbackId = null;
785
- }
786
- }
787
- stats() {
788
- const meanDetectMs = this.durations.length === 0 ? 0 : this.durations.reduce((sum, value) => sum + value, 0) / this.durations.length;
789
- return { degradeCount: this.degradeCount, meanDetectMs };
790
- }
791
- now() {
792
- return this.options.now?.() ?? performance.now();
793
- }
794
- tick() {
795
- if (!this.running) return;
796
- if (this.busy) {
797
- this.degradeCount += 1;
798
- return;
799
- }
800
- this.busy = true;
801
- this.lastRunAt = this.now();
802
- const startedAt = this.now();
803
- this.options.run().catch(() => void 0).finally(() => {
804
- this.busy = false;
805
- this.durations.push(this.now() - startedAt);
806
- if (this.durations.length > STATS_WINDOW) this.durations.shift();
807
- });
808
- }
809
- };
810
-
811
- // src/core/v3/frame-quality.ts
812
- var SHARP_REF = 180;
813
- var EXPOSURE_BAND = [100, 190];
814
- var EXPOSURE_FALLOFF = 64;
815
- function lumaAt(data, index) {
816
- return 0.299 * (data[index] ?? 0) + 0.587 * (data[index + 1] ?? 0) + 0.114 * (data[index + 2] ?? 0);
817
- }
818
- function meanLuma(image) {
819
- const { data, width, height } = image;
820
- const pixels = width * height;
821
- if (pixels === 0) return 0;
822
- let sum = 0;
823
- for (let i = 0; i < pixels; i += 1) sum += lumaAt(data, i * 4);
824
- return sum / pixels;
825
- }
826
- function sharpness(image) {
827
- const { data, width, height } = image;
828
- if (width < 3 || height < 3) return 0;
829
- const gray = new Float32Array(width * height);
830
- for (let i = 0; i < gray.length; i += 1) gray[i] = lumaAt(data, i * 4);
831
- let sum = 0;
832
- let sumSquares = 0;
833
- let count = 0;
834
- for (let y = 1; y < height - 1; y += 1) {
835
- for (let x = 1; x < width - 1; x += 1) {
836
- const i = y * width + x;
837
- const response = (gray[i - width] ?? 0) + (gray[i - 1] ?? 0) + (gray[i + 1] ?? 0) + (gray[i + width] ?? 0) - 4 * (gray[i] ?? 0);
838
- sum += response;
839
- sumSquares += response * response;
840
- count += 1;
841
- }
842
- }
843
- if (count === 0) return 0;
844
- const mean = sum / count;
845
- const variance = sumSquares / count - mean * mean;
846
- return Math.min(1, Math.max(0, variance) / SHARP_REF);
847
- }
848
- function exposure(image) {
849
- const mean = meanLuma(image);
850
- const [low, high] = EXPOSURE_BAND;
851
- const distance = mean < low ? low - mean : mean > high ? mean - high : 0;
852
- return Math.max(0, 1 - distance / EXPOSURE_FALLOFF);
853
- }
854
-
855
- // src/core/v3/face-gate-v3.ts
856
- var V3_GATE_DEFAULTS = Object.freeze({
857
- Q_GOOD: 0.6,
858
- RISE_PER_S: 0.9,
859
- FALL_PER_S: 0.25,
860
- CENTER_FALLOFF_IOD_MULTIPLE: 1.35,
861
- BOX_EYE_OFFSET_FACTOR: 0.12,
862
- IOD_BOX_PROXY_FACTOR: 0.42,
863
- SIZE_IDEAL_MIN: 0.12,
864
- SIZE_IDEAL_MAX: 0.3,
865
- SIZE_HARD_MIN: 0.08,
866
- SIZE_HARD_MAX: 0.45,
867
- ROLL_MAX_DEG: 25,
868
- MOTION_VELOCITY_IOD_PER_S: 0.5,
869
- MOTION_TAU_S: 0.4,
870
- MOTION_DEADBAND_IOD_PER_S: 0.1,
871
- READY_WINDOW_MS: 500,
872
- // (READY_MEAN_Q, the former 0.75 window MEAN, is gone — 2026-10-17 field
873
- // bug: a steady q anywhere in [Q_GOOD, 0.75) saturated p at 1, passed every
874
- // guide ("hold still") and could never reach the mean, so the ring sat full
875
- // and green with nothing recording. Readiness now checks the window against
876
- // Q_GOOD, which keeps the one-flaky-tick forgiveness and the second-bad-tick
877
- // block without a dead band above the rise threshold.)
878
- GUIDE_SIZE: 0.6,
879
- GUIDE_CENTERING: 0.6,
880
- GUIDE_POSE: 0.6,
881
- GUIDE_EXPOSURE: 0.6,
882
- GUIDE_SHARPNESS: 0.35,
883
- GUIDE_MOTION: 0.5
884
- });
885
- var clamp01 = (value) => Math.min(1, Math.max(0, value));
886
- var FaceGateV3 = class {
887
- constructor(overrides = {}) {
888
- this.p = 0;
889
- this.lastTickAt = null;
890
- this.lastCenter = null;
891
- this.velocityEma = 0;
892
- this.qWindow = [];
893
- /** Which side of the ideal band the last size measurement fell on. */
894
- this.lastSizeDirection = "ideal";
895
- this.t = { ...V3_GATE_DEFAULTS, ...overrides };
896
- }
897
- reset() {
898
- this.p = 0;
899
- this.lastTickAt = null;
900
- this.lastCenter = null;
901
- this.velocityEma = 0;
902
- this.qWindow = [];
903
- this.lastSizeDirection = "ideal";
904
- }
905
- tick(input) {
906
- const { observation, quality, timestampMs } = input;
907
- const dtSeconds = this.lastTickAt === null ? 0 : Math.max(0, (timestampMs - this.lastTickAt) / 1e3);
908
- this.lastTickAt = timestampMs;
909
- const factors = {
910
- presence: 0,
911
- centering: 0,
912
- size: 0,
913
- pose: 0,
914
- sharpness: clamp01(quality.sharpness),
915
- exposure: clamp01(quality.exposure),
916
- motion: 1
917
- };
918
- if (observation !== null) {
919
- factors.presence = 1;
920
- const geometry = this.geometryOf(observation, input);
921
- factors.centering = geometry.centering;
922
- factors.size = geometry.size;
923
- factors.pose = geometry.pose;
924
- factors.motion = this.motionOf(
925
- geometry.center,
926
- geometry.iod,
927
- timestampMs
928
- );
929
- } else {
930
- this.lastCenter = null;
931
- this.velocityEma = 0;
932
- }
933
- const q = Math.min(
934
- factors.presence,
935
- factors.centering,
936
- factors.size,
937
- factors.pose,
938
- factors.sharpness,
939
- factors.exposure,
940
- factors.motion
941
- );
942
- this.p = clamp01(
943
- this.p + (q >= this.t.Q_GOOD ? this.t.RISE_PER_S * q : -this.t.FALL_PER_S * (1 - q)) * dtSeconds
944
- );
945
- this.qWindow.push({ at: timestampMs, q });
946
- this.qWindow = this.qWindow.filter(
947
- (entry) => entry.at >= timestampMs - this.t.READY_WINDOW_MS
948
- );
949
- let windowSamples = this.qWindow.map((entry) => entry.q);
950
- if (windowSamples.length >= 3) {
951
- const worst = Math.min(...windowSamples);
952
- const worstIndex = windowSamples.indexOf(worst);
953
- windowSamples = windowSamples.filter((_, index) => index !== worstIndex);
954
- }
955
- const ready = this.p >= 1 && windowSamples.every((sample) => sample >= this.t.Q_GOOD);
956
- return {
957
- at: timestampMs,
958
- q,
959
- p: this.p,
960
- factors,
961
- guidanceKey: this.guidanceOf(factors, quality, q),
962
- ready,
963
- accepted: q >= this.t.Q_GOOD
964
- };
965
- }
966
- geometryOf(observation, input) {
967
- const { box, eyes } = observation;
968
- const frameCenter = { x: input.frameWidth / 2, y: input.frameHeight / 2 };
969
- const shortSide = Math.min(input.frameWidth, input.frameHeight);
970
- const center = eyes !== void 0 ? {
971
- x: (eyes.left.x + eyes.right.x) / 2,
972
- y: (eyes.left.y + eyes.right.y) / 2
973
- } : {
974
- x: box.x + box.width / 2,
975
- y: box.y + box.height / 2 - this.t.BOX_EYE_OFFSET_FACTOR * box.height
976
- };
977
- const iod = eyes !== void 0 ? Math.hypot(eyes.right.x - eyes.left.x, eyes.right.y - eyes.left.y) : this.t.IOD_BOX_PROXY_FACTOR * box.width;
978
- const distance = Math.hypot(
979
- center.x - frameCenter.x,
980
- center.y - frameCenter.y
981
- );
982
- const centering = iod <= 0 ? 0 : 1 - clamp01(distance / (this.t.CENTER_FALLOFF_IOD_MULTIPLE * iod));
983
- const ratio = shortSide > 0 ? iod / shortSide : 0;
984
- this.lastSizeDirection = ratio < this.t.SIZE_IDEAL_MIN ? "far" : ratio > this.t.SIZE_IDEAL_MAX ? "close" : "ideal";
985
- let size;
986
- if (ratio < this.t.SIZE_HARD_MIN || ratio > this.t.SIZE_HARD_MAX) {
987
- size = 0;
988
- } else if (ratio < this.t.SIZE_IDEAL_MIN) {
989
- size = (ratio - this.t.SIZE_HARD_MIN) / (this.t.SIZE_IDEAL_MIN - this.t.SIZE_HARD_MIN);
990
- } else if (ratio > this.t.SIZE_IDEAL_MAX) {
991
- size = (this.t.SIZE_HARD_MAX - ratio) / (this.t.SIZE_HARD_MAX - this.t.SIZE_IDEAL_MAX);
992
- } else {
993
- size = 1;
994
- }
995
- let pose = 1;
996
- if (eyes !== void 0) {
997
- const rollDeg = Math.abs(
998
- Math.atan2(eyes.right.y - eyes.left.y, eyes.right.x - eyes.left.x)
999
- ) * 180 / Math.PI;
1000
- pose = 1 - clamp01(rollDeg / this.t.ROLL_MAX_DEG);
1001
- }
1002
- return { center, iod, centering, size, pose };
1003
- }
1004
- motionOf(center, iod, at) {
1005
- const previous = this.lastCenter;
1006
- this.lastCenter = { ...center, at };
1007
- if (previous === null || iod <= 0) return 1;
1008
- const dtSeconds = (at - previous.at) / 1e3;
1009
- if (dtSeconds <= 0) return 1;
1010
- let velocityIodPerS = Math.hypot(center.x - previous.x, center.y - previous.y) / iod / dtSeconds;
1011
- if (velocityIodPerS <= this.t.MOTION_DEADBAND_IOD_PER_S)
1012
- velocityIodPerS = 0;
1013
- const alpha = 1 - Math.exp(-dtSeconds / this.t.MOTION_TAU_S);
1014
- this.velocityEma = alpha * velocityIodPerS + (1 - alpha) * this.velocityEma;
1015
- return 1 - clamp01(this.velocityEma / this.t.MOTION_VELOCITY_IOD_PER_S);
1016
- }
1017
- /** Lowest failing factor speaks — fixed priority (diagnostic, incl. light):
1018
- * presence → size → centering → pose → exposure → sharpness → hold.
1019
- *
1020
- * HONESTY FALLBACK (operator ruling 2026-07-12): when every factor clears
1021
- * its guide threshold but q (= min factor) is still below Q_GOOD — i.e.
1022
- * progress is DRAINING — "hold still" would be a lie ("Perfect" while
1023
- * nothing advances; the field symptom was users discovering by accident
1024
- * that only leaning in fires the gate). In that state the WORST factor
1025
- * speaks even though it passed its guide level, so the user always hears
1026
- * the change that actually unblocks recording. */
1027
- guidanceOf(factors, quality, q) {
1028
- if (factors.presence <= 0) return "fcv3.no_face";
1029
- if (factors.size < this.t.GUIDE_SIZE) return this.sizeGuidance();
1030
- if (factors.centering < this.t.GUIDE_CENTERING) return "fcv3.center_face";
1031
- if (factors.pose < this.t.GUIDE_POSE) return "fcv3.straighten";
1032
- if (factors.exposure < this.t.GUIDE_EXPOSURE)
1033
- return this.exposureGuidance(quality);
1034
- if (factors.sharpness < this.t.GUIDE_SHARPNESS) return "fcv3.steady_camera";
1035
- if (factors.motion < this.t.GUIDE_MOTION) return "fcv3.hold_still";
1036
- if (q < this.t.Q_GOOD) {
1037
- const coachable = [
1038
- ["size", this.sizeGuidance()],
1039
- ["centering", "fcv3.center_face"],
1040
- ["pose", "fcv3.straighten"],
1041
- ["exposure", this.exposureGuidance(quality)],
1042
- ["sharpness", "fcv3.steady_camera"],
1043
- ["motion", "fcv3.hold_still"]
1044
- ];
1045
- let worst = coachable[0];
1046
- for (const entry of coachable) {
1047
- if (factors[entry[0]] < factors[worst[0]]) worst = entry;
1048
- }
1049
- return worst[1];
1050
- }
1051
- return "fcv3.hold_still";
1052
- }
1053
- /** Direction from the size band set THIS tick (never inverted at the hard
1054
- * limits: past SIZE_HARD_MAX the direction is 'close' → move_back). */
1055
- sizeGuidance() {
1056
- return this.lastSizeDirection === "far" ? "fcv3.come_closer" : "fcv3.move_back";
1057
- }
1058
- /** Band midpoint — direction only (tracks EXPOSURE_BAND automatically). */
1059
- exposureGuidance(quality) {
1060
- const bandMid = (EXPOSURE_BAND[0] + EXPOSURE_BAND[1]) / 2;
1061
- return quality.meanLuma < bandMid ? "fcv3.more_light" : "fcv3.too_bright";
1062
- }
1063
- };
1064
-
1065
- // src/core/v3/capture-session-v3.ts
1066
- var KEYFRAME_CANDIDATES = 4;
1067
- var KEYFRAME_WINDOW_MS = 600;
1068
- var NEUTRAL_QUALITY = { sharpness: 1, exposure: 1, meanLuma: 128 };
1069
- var CaptureSessionV3 = class {
1070
- constructor(options) {
1071
- this.handlers = /* @__PURE__ */ new Map();
1072
- this.stateValue = "idle";
1073
- this.attempt = 0;
1074
- this.stream = null;
1075
- this.detector = null;
1076
- this.scheduler = null;
1077
- this.gate = null;
1078
- this.profiler = null;
1079
- this.lastGuidanceKey = null;
1080
- this.positioningStartedAt = 0;
1081
- // Face-capture timing marks of the CURRENT attempt (engine clock; reset per run).
1082
- this.cameraRequestedAt = null;
1083
- this.cameraReadyAt = null;
1084
- this.faceAcquiredAt = null;
1085
- this.captureCompleteAt = null;
1086
- this.fired = false;
1087
- this.carriedDegrade = 0;
1088
- this.carriedMeans = [];
1089
- /** Reused downscale canvas — falls back to the raw video where canvas 2D
1090
- * is unavailable (jsdom) so tests and exotic hosts keep detecting. */
1091
- this.snapshotCanvas = null;
1092
- this.options = options;
1093
- this.facing = options.facingMode ?? "user";
1094
- }
1095
- get state() {
1096
- return this.stateValue;
1097
- }
1098
- on(event, handler) {
1099
- let set = this.handlers.get(event);
1100
- if (!set) {
1101
- set = /* @__PURE__ */ new Set();
1102
- this.handlers.set(event, set);
1103
- }
1104
- set.add(handler);
1105
- return () => set?.delete(handler);
1106
- }
1107
- emit(event, payload) {
1108
- for (const handler of [...this.handlers.get(event) ?? []]) {
1109
- handler(payload);
1110
- }
1111
- }
1112
- async start(options = {}) {
1113
- if (options.facingMode !== void 0) this.facing = options.facingMode;
1114
- this.attempt += 1;
1115
- await this.run(this.attempt);
1116
- }
1117
- /** The camera the current/next attempt requests (start option, switchCamera toggles). */
1118
- get facingMode() {
1119
- return this.facing;
1120
- }
1121
- /** Full reset + camera restart — the documented recovery path (v1 parity). */
1122
- retry() {
1123
- this.teardownAttempt();
1124
- void this.start();
1125
- }
1126
- switchCamera() {
1127
- this.facing = this.facing === "user" ? "environment" : "user";
1128
- this.teardownAttempt();
1129
- void this.start();
1130
- }
1131
- destroy() {
1132
- this.attempt += 1;
1133
- this.teardownAttempt();
1134
- this.detector?.destroy();
1135
- this.detector = null;
1136
- this.options.video.srcObject = null;
1137
- }
1138
- // ── attempt lifecycle ──────────────────────────────────────────────────────
1139
- async run(attempt) {
1140
- const { options } = this;
1141
- this.fired = false;
1142
- this.lastGuidanceKey = null;
1143
- this.carriedDegrade = 0;
1144
- this.carriedMeans = [];
1145
- this.cameraRequestedAt = null;
1146
- this.cameraReadyAt = null;
1147
- this.faceAcquiredAt = null;
1148
- this.captureCompleteAt = null;
1149
- this.setState("preflight");
1150
- const preflight = cameraPreflight();
1151
- if (preflight !== "OK") {
1152
- this.fail(preflight === "INSECURE_CONTEXT" ? "insecure" : "unsupported");
1153
- return;
1154
- }
1155
- this.setState("acquiring");
1156
- const getUserMedia = options.getUserMedia ?? ((constraints) => navigator.mediaDevices.getUserMedia(constraints));
1157
- let stream;
1158
- this.cameraRequestedAt = this.now();
1159
- try {
1160
- stream = await getUserMedia(buildCaptureConstraints(detectIsMobile(), this.facing));
1161
- } catch (err) {
1162
- if (attempt !== this.attempt) return;
1163
- this.fail(mapGetUserMediaError(err));
1164
- return;
1165
- }
1166
- if (attempt !== this.attempt) {
1167
- for (const track of stream.getTracks()) track.stop();
1168
- return;
1169
- }
1170
- this.stream = stream;
1171
- options.video.srcObject = stream;
1172
- await options.video.play().catch(() => void 0);
1173
- if (attempt !== this.attempt) return;
1174
- this.cameraReadyAt = this.now();
1175
- if (this.detector === null) {
1176
- const ladderOptions = {
1177
- ...options.v3AssetBaseUrl !== void 0 ? { v3AssetBaseUrl: options.v3AssetBaseUrl } : {}
1178
- };
1179
- const create = options.createDetector ?? (options.createWorker !== void 0 && workerOffloadSupported() ? async () => {
1180
- try {
1181
- return await WorkerDetectorProxy.create(
1182
- options.createWorker(),
1183
- ladderOptions
1184
- );
1185
- } catch {
1186
- return createDetector(ladderOptions);
1187
- }
1188
- } : () => createDetector(ladderOptions));
1189
- let created;
1190
- try {
1191
- created = await create();
1192
- } catch (err) {
1193
- if (attempt === this.attempt) {
1194
- this.fail(
1195
- "models",
1196
- err instanceof DetectorLadderError ? err.fallbackReason : describeError2(err)
1197
- );
1198
- }
1199
- return;
1200
- }
1201
- if (attempt !== this.attempt) {
1202
- created.destroy();
1203
- return;
1204
- }
1205
- this.detector = created;
1206
- this.options.telemetry?.({
1207
- type: "detector",
1208
- tier: created.tier,
1209
- ...created.fallbackReason !== void 0 ? { fallbackReason: created.fallbackReason } : {}
1210
- });
1211
- }
1212
- const probe = probeDevice();
1213
- const staticClass = options.deviceClass ?? classifyDevice(probe);
1214
- this.profiler = new DeviceProfiler(staticClass);
1215
- this.options.telemetry?.({
1216
- type: "profile",
1217
- staticClass,
1218
- activeClass: this.profiler.deviceClass,
1219
- simd: probe.simd
1220
- });
1221
- this.gate = new FaceGateV3(options.thresholds ?? {});
1222
- this.setState("positioning");
1223
- this.positioningStartedAt = this.now();
1224
- this.startScheduler(attempt);
1225
- }
1226
- /** Chrome hint (Task 11): 'reduced' on LOW even without the media query. */
1227
- get animations() {
1228
- return this.profiler?.profile.animations ?? "full";
1229
- }
1230
- startScheduler(attempt) {
1231
- const profiler = this.profiler;
1232
- if (profiler === null) return;
1233
- if (this.scheduler !== null) {
1234
- const stats = this.scheduler.stats();
1235
- this.carriedDegrade += stats.degradeCount;
1236
- if (stats.meanDetectMs > 0) this.carriedMeans.push(stats.meanDetectMs);
1237
- this.scheduler.stop();
1238
- }
1239
- const scheduler = new DetectScheduler({
1240
- cadenceHz: profiler.profile.cadenceHz,
1241
- video: this.options.video,
1242
- ...this.options.now !== void 0 ? { now: this.options.now } : {},
1243
- run: () => this.detectTick(attempt)
1244
- });
1245
- this.scheduler = scheduler;
1246
- scheduler.start();
1247
- }
1248
- async detectTick(attempt) {
1249
- const { detector, gate, profiler } = this;
1250
- const video = this.options.video;
1251
- if (attempt !== this.attempt || detector === null || gate === null || profiler === null)
1252
- return;
1253
- if (this.fired || video.videoWidth === 0) return;
1254
- const before = profiler.deviceClass;
1255
- const t0 = this.now();
1256
- const source = this.options.makeSnapshot?.(video, profiler.profile.inputWidth) ?? this.defaultSnapshot(video, profiler.profile.inputWidth);
1257
- let observation = null;
1258
- try {
1259
- observation = await detector.detect(source, video.videoWidth, video.videoHeight);
1260
- } catch {
1261
- observation = null;
1262
- }
1263
- if (attempt !== this.attempt || this.fired) return;
1264
- profiler.record(this.now() - t0);
1265
- if (profiler.deviceClass !== before) this.startScheduler(attempt);
1266
- const quality = observation === null ? NEUTRAL_QUALITY : this.options.measureQuality?.(video, observation.box) ?? this.defaultQuality(video, observation.box);
1267
- const tick = gate.tick({
1268
- timestampMs: this.now(),
1269
- observation,
1270
- quality,
1271
- frameWidth: video.videoWidth,
1272
- frameHeight: video.videoHeight
1273
- });
1274
- if (tick.accepted && this.faceAcquiredAt === null) this.faceAcquiredAt = tick.at;
1275
- this.emit("checks", {
1276
- engine: "v3",
1277
- progress: tick.p,
1278
- q: tick.q,
1279
- factors: tick.factors,
1280
- attempt
1281
- });
1282
- if (tick.guidanceKey !== this.lastGuidanceKey) {
1283
- this.lastGuidanceKey = tick.guidanceKey;
1284
- this.emit("guidance", { key: tick.guidanceKey });
1285
- }
1286
- if (tick.ready && this.stateValue === "positioning") {
1287
- this.fired = true;
1288
- this.captureCompleteAt = tick.at;
1289
- void this.fire(attempt);
1290
- }
1291
- }
1292
- async fire(attempt) {
1293
- const { options } = this;
1294
- const scheduler = this.scheduler;
1295
- scheduler?.stop();
1296
- const stats = scheduler?.stats() ?? { degradeCount: 0, meanDetectMs: 0 };
1297
- const means = [...this.carriedMeans, ...stats.meanDetectMs > 0 ? [stats.meanDetectMs] : []];
1298
- options.telemetry?.({
1299
- type: "fired",
1300
- timeToGateMs: this.now() - this.positioningStartedAt,
1301
- degradeCount: this.carriedDegrade + stats.degradeCount,
1302
- meanDetectMs: means.length === 0 ? 0 : means.reduce((sum, value) => sum + value, 0) / means.length
1303
- });
1304
- const mode = options.mode ?? "clip";
1305
- const bestOf = this.collectKeyframes(attempt);
1306
- if (mode === "photo") {
1307
- const best2 = await bestOf;
1308
- if (attempt !== this.attempt) return;
1309
- if (best2 === null) {
1310
- this.fail("generic");
1311
- return;
1312
- }
1313
- this.finishCapture({ keyframe: best2.blob, previewDataUrl: best2.previewDataUrl });
1314
- return;
1315
- }
1316
- this.setState("recording");
1317
- const recorder = options.createRecorder?.() ?? new ClipRecorder();
1318
- const stream = this.stream;
1319
- if (stream === null) {
1320
- this.fail("generic");
1321
- return;
1322
- }
1323
- let frozenBest = null;
1324
- void bestOf.then(
1325
- (candidate) => {
1326
- frozenBest = candidate;
1327
- },
1328
- () => {
1329
- }
1330
- );
1331
- const onRecordingStopped = () => {
1332
- if (attempt !== this.attempt) return;
1333
- if (frozenBest !== null) {
1334
- this.emit("frozen", { previewDataUrl: frozenBest.previewDataUrl });
1335
- }
1336
- };
1337
- let clip;
1338
- let best;
1339
- try {
1340
- [clip, best] = await Promise.all([recorder.record(stream, onRecordingStopped), bestOf]);
1341
- } catch (err) {
1342
- if (attempt !== this.attempt) return;
1343
- const kind = err.kind;
1344
- this.fail(kind === "cliptoolarge" ? "cliptoolarge" : "recorder");
1345
- return;
1346
- }
1347
- if (attempt !== this.attempt) return;
1348
- if (isClipTooLarge(clip.blob)) {
1349
- this.fail("cliptoolarge");
1350
- return;
1351
- }
1352
- if (best === null) {
1353
- this.fail("generic");
1354
- return;
1355
- }
1356
- this.finishCapture({
1357
- clip: clip.blob,
1358
- clipMimeType: clip.mimeType,
1359
- keyframe: best.blob,
1360
- previewDataUrl: best.previewDataUrl
1361
- });
1362
- }
1363
- /** Up to KEYFRAME_CANDIDATES mirrored frames over KEYFRAME_WINDOW_MS —
1364
- * sharpest wins (reuses frame-quality.sharpness via the capture seam). */
1365
- async collectKeyframes(attempt) {
1366
- const capture = this.options.captureKeyframe ?? ((video) => this.defaultKeyframe(video));
1367
- const stepMs = KEYFRAME_WINDOW_MS / (KEYFRAME_CANDIDATES - 1);
1368
- let best = null;
1369
- for (let i = 0; i < KEYFRAME_CANDIDATES; i += 1) {
1370
- if (attempt !== this.attempt) return best;
1371
- try {
1372
- const candidate = await capture(this.options.video);
1373
- if (best === null || candidate.sharpness > best.sharpness) best = candidate;
1374
- } catch {
1375
- }
1376
- if (i < KEYFRAME_CANDIDATES - 1) await delay(stepMs);
1377
- }
1378
- return best;
1379
- }
1380
- finishCapture(artifacts) {
1381
- this.stopTracks();
1382
- this.setState("captured");
1383
- const timing = this.captureTiming();
1384
- this.emit("artifacts", timing === void 0 ? artifacts : { ...artifacts, timing });
1385
- }
1386
- /** The attempt's capture-phase timing (whole ms, ≥ 0); undefined when no mark landed. */
1387
- captureTiming() {
1388
- const span = (from, to) => from !== null && to !== null ? Math.max(0, Math.round(to - from)) : void 0;
1389
- const cameraReadyMs = span(this.cameraRequestedAt, this.cameraReadyAt);
1390
- const faceAcquireMs = span(this.cameraReadyAt, this.faceAcquiredAt);
1391
- const captureMs = span(this.faceAcquiredAt, this.captureCompleteAt);
1392
- const timing = {
1393
- ...cameraReadyMs !== void 0 ? { cameraReadyMs } : {},
1394
- ...faceAcquireMs !== void 0 ? { faceAcquireMs } : {},
1395
- ...captureMs !== void 0 ? { captureMs } : {}
1396
- };
1397
- return Object.keys(timing).length > 0 ? timing : void 0;
1398
- }
1399
- // ── defaults for the canvas-bound seams ────────────────────────────────────
1400
- async defaultKeyframe(video) {
1401
- const canvas = document.createElement("canvas");
1402
- const blob = await captureMirroredKeyframe(video, canvas);
1403
- const previewDataUrl = canvas.toDataURL("image/jpeg", 0.92);
1404
- return { blob, previewDataUrl, sharpness: this.centerSharpness(video) };
1405
- }
1406
- defaultSnapshot(video, targetWidth) {
1407
- try {
1408
- const canvas = this.snapshotCanvas ?? document.createElement("canvas");
1409
- const scale = targetWidth / Math.max(1, video.videoWidth);
1410
- const width = Math.max(1, Math.round(video.videoWidth * scale));
1411
- const height = Math.max(1, Math.round(video.videoHeight * scale));
1412
- const ctx = canvas.getContext("2d");
1413
- if (ctx === null) return video;
1414
- if (canvas.width !== width) canvas.width = width;
1415
- if (canvas.height !== height) canvas.height = height;
1416
- ctx.drawImage(video, 0, 0, width, height);
1417
- this.snapshotCanvas = canvas;
1418
- return canvas;
1419
- } catch {
1420
- return video;
1421
- }
1422
- }
1423
- defaultQuality(video, box) {
1424
- const crop = cropImageData(video, box, 96);
1425
- if (crop === null) return NEUTRAL_QUALITY;
1426
- return { sharpness: sharpness(crop), exposure: exposure(crop), meanLuma: meanLuma(crop) };
1427
- }
1428
- centerSharpness(video) {
1429
- const size = intrinsicSize(video);
1430
- const crop = cropImageData(
1431
- video,
1432
- { x: size.width * 0.25, y: size.height * 0.25, width: size.width * 0.5, height: size.height * 0.5 },
1433
- 96
1434
- );
1435
- return crop === null ? 0 : sharpness(crop);
1436
- }
1437
- // ── teardown ──────────────────────────────────────────────────────────────
1438
- teardownAttempt() {
1439
- this.scheduler?.stop();
1440
- this.scheduler = null;
1441
- this.gate = null;
1442
- this.stopTracks();
1443
- }
1444
- stopTracks() {
1445
- if (this.stream === null) return;
1446
- for (const track of this.stream.getTracks()) track.stop();
1447
- this.stream = null;
1448
- }
1449
- fail(kind, fallbackReason) {
1450
- this.scheduler?.stop();
1451
- this.stopTracks();
1452
- this.setState("error");
1453
- this.options.telemetry?.({
1454
- type: "error",
1455
- kind,
1456
- ...fallbackReason !== void 0 ? { fallbackReason } : {}
1457
- });
1458
- this.emit("error", { kind, retryable: kind !== "insecure" && kind !== "unsupported" });
1459
- }
1460
- setState(state) {
1461
- this.stateValue = state;
1462
- this.emit("statechange", { state });
1463
- }
1464
- now() {
1465
- return this.options.now?.() ?? performance.now();
1466
- }
1467
- };
1468
- function delay(ms) {
1469
- return new Promise((resolve) => setTimeout(resolve, ms));
1470
- }
1471
- function describeError2(err) {
1472
- return err instanceof Error ? err.message : String(err);
1473
- }
1474
- function cropImageData(video, box, targetWidth) {
1475
- try {
1476
- const canvas = document.createElement("canvas");
1477
- const scale = targetWidth / Math.max(1, box.width);
1478
- canvas.width = Math.max(1, Math.round(box.width * scale));
1479
- canvas.height = Math.max(1, Math.round(box.height * scale));
1480
- const ctx = canvas.getContext("2d");
1481
- if (ctx === null) return null;
1482
- ctx.drawImage(
1483
- video,
1484
- box.x,
1485
- box.y,
1486
- box.width,
1487
- box.height,
1488
- 0,
1489
- 0,
1490
- canvas.width,
1491
- canvas.height
1492
- );
1493
- return ctx.getImageData(0, 0, canvas.width, canvas.height);
1494
- } catch {
1495
- return null;
1496
- }
1497
- }
1498
-
1499
- // src/verification/emitter.ts
1500
- function createEmitter() {
1501
- const handlers = /* @__PURE__ */ new Map();
1502
- return {
1503
- on(event, handler) {
1504
- let set = handlers.get(event);
1505
- if (set === void 0) {
1506
- set = /* @__PURE__ */ new Set();
1507
- handlers.set(event, set);
1508
- }
1509
- const h = handler;
1510
- set.add(h);
1511
- return () => {
1512
- set?.delete(h);
1513
- };
1514
- },
1515
- emit(event, payload) {
1516
- const set = handlers.get(event);
1517
- if (set === void 0) return;
1518
- for (const handler of [...set]) {
1519
- handler(payload);
1520
- }
1521
- },
1522
- clear() {
1523
- handlers.clear();
1524
- }
1525
- };
1526
- }
1527
-
1528
- // src/capture/preload.ts
1529
- var PRELOAD_BLAZE_INIT_TIMEOUT_MS = 12e4;
1530
- var PRELOAD_BUDGET_MS = 13e4;
1531
- var IDLE_TIMEOUT_MS = 3e3;
1532
- var IDLE_FALLBACK_MS = 1200;
1533
- var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("@sekyro/web.preload.v1");
1534
- function registry() {
1535
- const host = globalThis;
1536
- host[REGISTRY_KEY] ?? (host[REGISTRY_KEY] = /* @__PURE__ */ new Map());
1537
- return host[REGISTRY_KEY];
1538
- }
1539
- function normalizeBase(assetBaseUrl) {
1540
- const base = (assetBaseUrl ?? DEFAULT_V3_ASSET_BASE_URL).replace(/\/+$/, "");
1541
- return base === "" ? "/" : base;
1542
- }
1543
- function entryFor(base) {
1544
- const map = registry();
1545
- let entry = map.get(base);
1546
- if (entry === void 0) {
1547
- entry = { status: "idle", promise: null, scheduled: null, detectorPromise: null, detector: null, listeners: /* @__PURE__ */ new Set() };
1548
- map.set(base, entry);
1549
- }
1550
- return entry;
1551
- }
1552
- function setStatus(entry, next) {
1553
- if (entry.status === next) return;
1554
- entry.status = next;
1555
- for (const listener of [...entry.listeners]) listener(next);
1556
- }
1557
- var defaultLoader = (base) => createDetector({ preferred: ["blaze"], v3AssetBaseUrl: base, blazeInitTimeoutMs: PRELOAD_BLAZE_INIT_TIMEOUT_MS });
1558
- var loader = defaultLoader;
1559
- function canCapture() {
1560
- return typeof window !== "undefined" && typeof navigator !== "undefined" && typeof navigator.mediaDevices?.getUserMedia === "function";
1561
- }
1562
- function saveDataOn() {
1563
- return navigator.connection?.saveData === true;
1564
- }
1565
- function scheduleIdle(run) {
1566
- const w = window;
1567
- if (typeof w.requestIdleCallback === "function") {
1568
- const handle = w.requestIdleCallback(run, { timeout: IDLE_TIMEOUT_MS });
1569
- return () => w.cancelIdleCallback?.(handle);
1570
- }
1571
- const timer = setTimeout(run, IDLE_FALLBACK_MS);
1572
- return () => clearTimeout(timer);
1573
- }
1574
- function schedule(entry, base) {
1575
- let resolve;
1576
- const promise = new Promise((res) => {
1577
- resolve = res;
1578
- });
1579
- let done = false;
1580
- let cancel = () => void 0;
1581
- const scheduled = {
1582
- promise,
1583
- settle: (outcome) => {
1584
- if (done) return;
1585
- done = true;
1586
- cancel();
1587
- if (entry.scheduled === scheduled) entry.scheduled = null;
1588
- resolve(outcome);
1589
- }
1590
- };
1591
- entry.scheduled = scheduled;
1592
- cancel = scheduleIdle(() => {
1593
- if (done) return;
1594
- scheduled.settle(begin(entry, base));
1595
- });
1596
- return promise;
1597
- }
1598
- function begin(entry, base) {
1599
- if ((entry.status === "loading" || entry.status === "ready") && entry.promise !== null) return entry.promise;
1600
- setStatus(entry, "loading");
1601
- const detectorPromise = new Promise((resolve) => resolve(loader(base)));
1602
- entry.detectorPromise = detectorPromise;
1603
- let timer;
1604
- const budget = new Promise((_, reject) => {
1605
- timer = setTimeout(() => {
1606
- detectorPromise.then((late) => late.destroy(), () => void 0);
1607
- reject(new Error(`detector preload exceeded ${PRELOAD_BUDGET_MS} ms`));
1608
- }, PRELOAD_BUDGET_MS);
1609
- });
1610
- const settled = Promise.race([detectorPromise, budget]).then(
1611
- (detector) => {
1612
- if (entry.detectorPromise !== detectorPromise) {
1613
- detector.destroy();
1614
- return entry.status;
1615
- }
1616
- entry.detector = detector;
1617
- setStatus(entry, "ready");
1618
- return "ready";
1619
- },
1620
- (err) => {
1621
- if (entry.detectorPromise === detectorPromise) {
1622
- entry.detectorPromise = null;
1623
- entry.detector = null;
1624
- setStatus(entry, "failed");
1625
- console.warn("[@sekyro/web] face-detector preload failed:", err);
1626
- }
1627
- return entry.status;
1628
- }
1629
- );
1630
- const promise = settled.finally(() => clearTimeout(timer));
1631
- entry.promise = promise;
1632
- entry.scheduled?.settle(promise);
1633
- return promise;
1634
- }
1635
- function preloadLivenessAssets(options = {}) {
1636
- if (!canCapture()) return Promise.resolve("idle");
1637
- const base = normalizeBase(options.assetBaseUrl);
1638
- const entry = entryFor(base);
1639
- if (options.respectSaveData === true && saveDataOn()) return Promise.resolve(entry.status);
1640
- if ((entry.status === "loading" || entry.status === "ready") && entry.promise !== null) return entry.promise;
1641
- if (options.idle === true) return entry.scheduled?.promise ?? schedule(entry, base);
1642
- return begin(entry, base);
1643
- }
1644
- function getLivenessAssetsStatus(assetBaseUrl) {
1645
- return registry().get(normalizeBase(assetBaseUrl))?.status ?? "idle";
1646
- }
1647
- function subscribeLivenessAssets(listener, assetBaseUrl) {
1648
- const entry = entryFor(normalizeBase(assetBaseUrl));
1649
- entry.listeners.add(listener);
1650
- return () => {
1651
- entry.listeners.delete(listener);
1652
- };
1653
- }
1654
- function releaseLivenessAssets(assetBaseUrl) {
1655
- const entry = registry().get(normalizeBase(assetBaseUrl));
1656
- if (entry === void 0) return;
1657
- entry.scheduled?.settle("idle");
1658
- entry.detector?.destroy();
1659
- entry.detector = null;
1660
- entry.detectorPromise = null;
1661
- entry.promise = null;
1662
- setStatus(entry, "idle");
1663
- }
1664
- function nonOwningView(shared) {
1665
- return {
1666
- get tier() {
1667
- return shared.tier;
1668
- },
1669
- get fallbackReason() {
1670
- return shared.fallbackReason;
1671
- },
1672
- detect: (...args) => shared.detect(...args),
1673
- destroy: () => {
1674
- }
1675
- };
1676
- }
1677
- function preloadedDetectorFactory(assetBaseUrl) {
1678
- const base = normalizeBase(assetBaseUrl);
1679
- const entry = registry().get(base);
1680
- if (entry === void 0 || entry.detector === null && entry.detectorPromise === null && entry.scheduled === null) {
1681
- return void 0;
1682
- }
1683
- return async () => {
1684
- if (entry.scheduled !== null) void begin(entry, base);
1685
- let waitingOn = entry.promise;
1686
- while (entry.detector === null && waitingOn !== null) {
1687
- await waitingOn;
1688
- if (entry.promise === waitingOn) break;
1689
- waitingOn = entry.promise;
1690
- }
1691
- return entry.detector !== null ? nonOwningView(entry.detector) : createDetector({ v3AssetBaseUrl: base });
1692
- };
1693
- }
1694
-
1695
- // src/capture/wake-lock.ts
1696
- function wakeLockApi() {
1697
- if (typeof navigator === "undefined" || !("wakeLock" in navigator)) return null;
1698
- const api = navigator.wakeLock;
1699
- return typeof api?.request === "function" ? api : null;
1700
- }
1701
- function isVisible() {
1702
- return typeof document === "undefined" || document.visibilityState === "visible";
1703
- }
1704
- function releaseQuietly(sentinel) {
1705
- try {
1706
- void sentinel.release().catch(() => void 0);
1707
- } catch {
1708
- }
1709
- }
1710
- function createScreenWakeLock(options = {}) {
1711
- if (options.enabled === false) return { setActive: () => void 0 };
1712
- let wanted = false;
1713
- let sentinel = null;
1714
- let inFlight = false;
1715
- let listening = false;
1716
- const acquire = () => {
1717
- if (!wanted || inFlight || sentinel !== null && !sentinel.released) return;
1718
- const api = wakeLockApi();
1719
- if (api === null || !isVisible()) return;
1720
- let request;
1721
- try {
1722
- request = api.request("screen");
1723
- } catch {
1724
- return;
1725
- }
1726
- inFlight = true;
1727
- request.then(
1728
- (granted) => {
1729
- inFlight = false;
1730
- if (!wanted) {
1731
- releaseQuietly(granted);
1732
- return;
1733
- }
1734
- sentinel = granted;
1735
- granted.addEventListener?.("release", () => {
1736
- if (sentinel === granted) sentinel = null;
1737
- });
1738
- },
1739
- () => {
1740
- inFlight = false;
1741
- }
1742
- );
1743
- };
1744
- const onVisibilityChange = () => {
1745
- if (isVisible()) acquire();
1746
- };
1747
- const listen = (on) => {
1748
- if (typeof document === "undefined" || on === listening) return;
1749
- listening = on;
1750
- if (on) document.addEventListener("visibilitychange", onVisibilityChange);
1751
- else document.removeEventListener("visibilitychange", onVisibilityChange);
1752
- };
1753
- return {
1754
- setActive: (active) => {
1755
- wanted = active;
1756
- if (active) {
1757
- if (wakeLockApi() === null) return;
1758
- listen(true);
1759
- acquire();
1760
- return;
1761
- }
1762
- listen(false);
1763
- if (sentinel !== null) {
1764
- const held = sentinel;
1765
- sentinel = null;
1766
- releaseQuietly(held);
1767
- }
1768
- }
1769
- };
1770
- }
1771
-
1772
- // src/capture/create-liveness-capture.ts
1773
- function mapGuidanceHint(key) {
1774
- switch (key) {
1775
- case "fcv3.no_face":
1776
- case "fcv3.center_face":
1777
- case "fcv3.straighten":
1778
- return "center";
1779
- case "fcv3.come_closer":
1780
- return "closer";
1781
- case "fcv3.move_back":
1782
- return "farther";
1783
- case "fcv3.more_light":
1784
- case "fcv3.too_bright":
1785
- return "light";
1786
- case "fcv3.hold_still":
1787
- case "fcv3.steady_camera":
1788
- return "still";
1789
- default:
1790
- return null;
1791
- }
1792
- }
1793
- function mapEngineState(state) {
1794
- switch (state) {
1795
- case "preflight":
1796
- case "acquiring":
1797
- return "starting";
1798
- case "positioning":
1799
- return "gating";
1800
- case "idle":
1801
- case "recording":
1802
- case "captured":
1803
- case "error":
1804
- return state;
1805
- default: {
1806
- const unhandled = state;
1807
- throw new Error(`mapEngineState: unhandled state ${unhandled}`);
1808
- }
1809
- }
1810
- }
1811
- function mapErrorKind(kind) {
1812
- switch (kind) {
1813
- case "permission":
1814
- case "notfound":
1815
- case "inuse":
1816
- case "insecure":
1817
- case "unsupported":
1818
- return kind;
1819
- case "overconstrained":
1820
- case "generic":
1821
- case "models":
1822
- case "cliptoolarge":
1823
- case "recorder":
1824
- return "generic";
1825
- default: {
1826
- const unhandled = kind;
1827
- throw new Error(`mapErrorKind: unhandled kind ${unhandled}`);
1828
- }
1829
- }
1830
- }
1831
- function createLivenessCaptureInternal(options, internals = {}) {
1832
- const now = internals.now ?? (() => performance.now());
1833
- const emitter = createEmitter();
1834
- const degraded = !isMediaRecorderSupported();
1835
- const hostSeams = internals.engineOptions;
1836
- const preloadAware = hostSeams?.createDetector === void 0 && hostSeams?.createWorker === void 0 ? {
1837
- createDetector: () => {
1838
- const warmed = preloadedDetectorFactory(options.assetBaseUrl);
1839
- return warmed !== void 0 ? warmed() : createDetector(
1840
- options.assetBaseUrl !== void 0 ? { v3AssetBaseUrl: options.assetBaseUrl } : {}
1841
- );
1842
- }
1843
- } : {};
1844
- const engineOptions = {
1845
- video: options.video,
1846
- mode: degraded ? "photo" : "clip",
1847
- ...options.facing !== void 0 ? { facingMode: options.facing } : {},
1848
- ...options.assetBaseUrl !== void 0 ? { v3AssetBaseUrl: options.assetBaseUrl } : {},
1849
- ...internals.engineOptions ?? {},
1850
- ...preloadAware
1851
- };
1852
- const engine = internals.createEngine?.(engineOptions) ?? new CaptureSessionV3(engineOptions);
1853
- let state = "idle";
1854
- let hint = null;
1855
- let progress = 0;
1856
- let faceDetected = false;
1857
- let animations = "full";
1858
- let recordingStartedAt = null;
1859
- let frozenAt = null;
1860
- let frameWidth = 0;
1861
- let frameHeight = 0;
1862
- const latchFrameSize = () => {
1863
- if (options.video.videoWidth > 0 && options.video.videoHeight > 0) {
1864
- frameWidth = options.video.videoWidth;
1865
- frameHeight = options.video.videoHeight;
1866
- }
1867
- };
1868
- const wakeLock = createScreenWakeLock({ enabled: options.keepScreenAwake !== false });
1869
- const setState = (next) => {
1870
- state = next;
1871
- wakeLock.setActive(next === "starting" || next === "gating" || next === "recording");
1872
- emitter.emit("state", next);
1873
- };
1874
- const emitGate = () => emitter.emit("gate", { progress, hint, faceDetected });
1875
- const syncProfile = () => {
1876
- const next = engine.animations ?? "full";
1877
- if (next === animations) return;
1878
- animations = next;
1879
- emitter.emit("profile", { animations });
1880
- };
1881
- const unsubscribes = [
1882
- engine.on("statechange", ({ state: engineState }) => {
1883
- const next = mapEngineState(engineState);
1884
- if (next === "starting" && state !== "starting") {
1885
- hint = null;
1886
- progress = 0;
1887
- faceDetected = false;
1888
- recordingStartedAt = null;
1889
- frozenAt = null;
1890
- frameWidth = 0;
1891
- frameHeight = 0;
1892
- }
1893
- setState(next);
1894
- syncProfile();
1895
- if (next === "recording") {
1896
- latchFrameSize();
1897
- recordingStartedAt = now();
1898
- hint = "hold";
1899
- progress = 1;
1900
- emitGate();
1901
- }
1902
- }),
1903
- engine.on("checks", (payload) => {
1904
- latchFrameSize();
1905
- progress = payload.progress;
1906
- faceDetected = payload.factors.presence > 0;
1907
- emitGate();
1908
- syncProfile();
1909
- }),
1910
- engine.on("guidance", ({ key }) => {
1911
- hint = mapGuidanceHint(key);
1912
- emitGate();
1913
- }),
1914
- engine.on("frozen", ({ previewDataUrl }) => {
1915
- frozenAt = now();
1916
- emitter.emit("frozen", { previewDataUrl });
1917
- }),
1918
- engine.on("artifacts", (artifacts) => {
1919
- const clipMs = recordingStartedAt !== null && frozenAt !== null ? Math.max(0, Math.round(frozenAt - recordingStartedAt)) : void 0;
1920
- emitter.emit("captured", {
1921
- keyframe: artifacts.keyframe,
1922
- ...artifacts.clip !== void 0 ? { clip: artifacts.clip } : {},
1923
- ...artifacts.clipMimeType !== void 0 ? { clipMime: artifacts.clipMimeType } : {},
1924
- width: options.video.videoWidth || frameWidth,
1925
- height: options.video.videoHeight || frameHeight,
1926
- ...clipMs !== void 0 ? { clipMs } : {},
1927
- captureChannel: detectIsMobile() ? "mobile" : "desktop",
1928
- ...degraded ? { degraded: "NO_RECORDER" } : {},
1929
- engine: "v3",
1930
- // Face-capture timing: the engine's marks, forwarded flat (absent → absent).
1931
- ...artifacts.timing?.cameraReadyMs !== void 0 ? { cameraReadyMs: artifacts.timing.cameraReadyMs } : {},
1932
- ...artifacts.timing?.faceAcquireMs !== void 0 ? { faceAcquireMs: artifacts.timing.faceAcquireMs } : {},
1933
- ...artifacts.timing?.captureMs !== void 0 ? { captureMs: artifacts.timing.captureMs } : {}
1934
- });
1935
- }),
1936
- engine.on("error", ({ kind, retryable }) => {
1937
- emitter.emit("error", { kind: mapErrorKind(kind), retryable });
1938
- })
1939
- ];
1940
- const handle = {
1941
- get state() {
1942
- return state;
1943
- },
1944
- on: (event, handler) => emitter.on(event, handler),
1945
- start: (startOptions) => engine.start(startOptions?.facing !== void 0 ? { facingMode: startOptions.facing } : {}),
1946
- retry: () => engine.retry(),
1947
- switchCamera: () => engine.switchCamera(),
1948
- destroy: () => {
1949
- for (const unsubscribe of unsubscribes) unsubscribe();
1950
- wakeLock.setActive(false);
1951
- engine.destroy();
1952
- emitter.clear();
1953
- }
1954
- };
1955
- return {
1956
- handle,
1957
- setFlowState: (next) => {
1958
- if (state !== next) setState(next);
1959
- }
1960
- };
1961
- }
1962
- function createLivenessCapture(options) {
1963
- return createLivenessCaptureInternal(options).handle;
1964
- }
1965
-
1966
- // src/capture/camera-probe.ts
1967
- async function permissionStatus() {
1968
- try {
1969
- if (typeof navigator === "undefined" || typeof navigator.permissions?.query !== "function") return null;
1970
- return await navigator.permissions.query({ name: "camera" });
1971
- } catch {
1972
- return null;
1973
- }
1974
- }
1975
- function asState(state) {
1976
- return state === "granted" || state === "prompt" || state === "denied" ? state : "unknown";
1977
- }
1978
- async function queryCameraPermission() {
1979
- const status = await permissionStatus();
1980
- return status === null ? "unknown" : asState(status.state);
1981
- }
1982
- function subscribeCameraPermission(listener) {
1983
- let stopped = false;
1984
- let status = null;
1985
- const onChange = () => {
1986
- if (!stopped && status !== null) listener(asState(status.state));
1987
- };
1988
- void permissionStatus().then((resolved) => {
1989
- if (stopped) return;
1990
- status = resolved;
1991
- listener(resolved === null ? "unknown" : asState(resolved.state));
1992
- resolved?.addEventListener?.("change", onChange);
1993
- });
1994
- return () => {
1995
- stopped = true;
1996
- status?.removeEventListener?.("change", onChange);
1997
- };
1998
- }
1999
- async function hasMultipleCameras() {
2000
- if (typeof navigator === "undefined") return false;
2001
- const ua = String(navigator.userAgent ?? "");
2002
- if (/Android|iPhone|iPad|iPod/i.test(ua)) return true;
2003
- if (/Macintosh/.test(ua) && (navigator.maxTouchPoints ?? 0) > 1) return true;
2004
- try {
2005
- const devices = await navigator.mediaDevices?.enumerateDevices?.() ?? [];
2006
- return devices.filter((device) => device.kind === "videoinput").length >= 2;
2007
- } catch {
2008
- return false;
2009
- }
2010
- }
2011
-
2012
- // src/client/errors.ts
2013
- var KNOWN_CODES = [
2014
- // auth / addressing (session-token.guard, controllers' own-session guards)
2015
- "session_token_invalid",
2016
- // 401 — missing/invalid/expired/revoked token
2017
- "session_token_required",
2018
- // 403 — non-session-token principal on a hosted route (defensive)
2019
- "session_token_session_mismatch",
2020
- // 403 — route :id differs from the token's bound session
2021
- "session_not_found",
2022
- // 404 — token's session missing/foreign (findOwned)
2023
- // rate limiting (session-token.guard — per-token + per-IP buckets)
2024
- "rate_limit_exceeded",
2025
- // 429 + Retry-After header (seconds)
2026
- // consent gate (Task 0 — submit AND media presign/complete)
2027
- "consent_required",
2028
- // 409 — record consent before uploading/submitting
2029
- // submit flow (sessions.service.submitCheck)
2030
- "session_not_active",
2031
- // 409 — session is terminal/review; no further submissions
2032
- "check_not_found",
2033
- // 404 — session has no such checkType
2034
- "check_already_finalized",
2035
- // 409 — re-submit of a terminal/review check
2036
- "check_out_of_order",
2037
- // 409 — only the frontier check accepts a submission
2038
- "check_type_unsupported",
2039
- // 400 — no registered executor for the checkType
2040
- "force_outcome_forbidden",
2041
- // 403 — forceOutcome on a live session (plan D-C)
2042
- "attestation_invalid",
2043
- // 400 (Task 1) — Turnstile/attestation failed; reload and retry
2044
- "nni_locked",
2045
- // 409 (Plan A Task 2) — session is bound to a server-provided NNI; a different client NNI was sent
2046
- // media (media.service)
2047
- "media_content_type_not_allowed",
2048
- // 400 — outside the per-kind MIME allowlist
2049
- "media_too_large",
2050
- // 413 — over the per-kind byte cap
2051
- "media_key_invalid",
2052
- // 400 — not a well-formed pending key
2053
- "media_key_forbidden",
2054
- // 403 — key names another session's pending space
2055
- "media_not_found",
2056
- // 404 — no uploaded object behind the key
2057
- "media_unreadable",
2058
- // 422 — magic-byte sniff rejected the object
2059
- "media_session_invalid",
2060
- // 400 — sessionId unusable as a key segment (never in practice)
2061
- // idempotency (idempotency.interceptor — Task 2)
2062
- "idempotency_key_collision",
2063
- // 409 — same key, different body hash
2064
- "idempotency_in_progress",
2065
- // 409 — concurrent identical request mid-flight (client auto-retries)
2066
- "idempotency_key_required",
2067
- // 400 — only on @Idempotent({required:true}) routes (none hosted yet)
2068
- // validation + fallback
2069
- "validation_error",
2070
- // 400 — ValibotPipe rejection (camelToSnake of 'ValidationError')
2071
- "internal_error",
2072
- // 500 — unhandled server error
2073
- // client-synthesized (never sent by the backend)
2074
- "unknown_error",
2075
- // unparseable (non-JSON) response body — error OR 2xx (defensive)
2076
- "upload_failed",
2077
- // the bare Spaces PUT answered non-2xx
2078
- "network_error",
2079
- // fetch rejected: connection drop / DNS / CORS / mid-transfer (status 0)
2080
- "timeout"
2081
- // AbortSignal.timeout fired — API calls 30 s default, Spaces PUT 15 min (status 0)
2082
- ];
2083
- function isKnownCode(code) {
2084
- return KNOWN_CODES.includes(code);
2085
- }
2086
- var HostedApiError = class extends Error {
2087
- constructor(args) {
2088
- super(args.message);
2089
- this.name = "HostedApiError";
2090
- this.status = args.status;
2091
- this.code = args.code;
2092
- if (args.retryAfterSeconds !== void 0) this.retryAfterSeconds = args.retryAfterSeconds;
2093
- }
2094
- };
2095
-
2096
- // src/client/hosted-client.ts
2097
- var DEFAULT_REQUEST_TIMEOUT_MS = 3e4;
2098
- var SPACES_PUT_TIMEOUT_MS = 9e5;
2099
- var UPLOAD_ERROR_SNIPPET_CHARS = 200;
2100
- var IN_PROGRESS_RETRY_ATTEMPTS = 5;
2101
- var IN_PROGRESS_RETRY_DELAY_MS = 400;
2102
- function stripMimeParams(contentType) {
2103
- return (contentType.split(";")[0] ?? "").trim();
2104
- }
2105
- var MEDIA_INPUT_FIELD = {
2106
- liveness: "clipKey",
2107
- face_match: "imageKey",
2108
- doc_ocr: "imageKey"
2109
- };
2110
- var HostedClient = class {
2111
- constructor(opts) {
2112
- this.sessionId = null;
2113
- this.bootstrap = null;
2114
- this.apiOrigin = opts.apiOrigin.replace(/\/+$/, "");
2115
- this.sessionToken = opts.sessionToken;
2116
- const impl = opts.fetch;
2117
- this.fetchImpl = (input, init) => (impl ?? globalThis.fetch).call(globalThis, input, init);
2118
- this.requestTimeoutMs = opts.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
2119
- this.retryAttempts = opts.inProgressRetry?.attempts ?? IN_PROGRESS_RETRY_ATTEMPTS;
2120
- this.retryDelayMs = opts.inProgressRetry?.delayMs ?? IN_PROGRESS_RETRY_DELAY_MS;
2121
- }
2122
- /** Token-addressed bootstrap — the hosted page's first call. Caches the sessionId. */
2123
- async getSession() {
2124
- const view = await this.api("GET", "/hosted/session");
2125
- this.sessionId = view.sessionId;
2126
- return view;
2127
- }
2128
- /**
2129
- * Record consent once (201; an idempotent replay answers 200 with
2130
- * `alreadyRecorded: true`). Until recorded, media presign/complete AND check
2131
- * submission answer 409 `consent_required`.
2132
- */
2133
- async recordConsent(locale) {
2134
- return this.api("POST", "/hosted/consent", { body: { locale } });
2135
- }
2136
- /**
2137
- * Presign a Spaces PUT for a new pending object. `contentType` is stripped of
2138
- * MIME parameters defensively (the allowlist holds bare types; the engine's
2139
- * `clipMimeType` carries codec params) — PUT with the SAME bare type, or the
2140
- * signed-header check rejects the upload.
2141
- */
2142
- async presign(kind, contentType, contentLength) {
2143
- const id = await this.ensureSessionId();
2144
- const body = { kind, contentType: stripMimeParams(contentType), contentLength };
2145
- return this.api("POST", `/sessions/${id}/media`, { body });
2146
- }
2147
- /**
2148
- * Bare PUT to the presigned Spaces URL: EXACTLY the signed headers — the
2149
- * declared Content-Type and the blob body. NO `x-session-token` (the
2150
- * signature IS the credential; an extra header breaks nothing but leaks the
2151
- * token to a third-party host) and no JSON envelope.
2152
- *
2153
- * `contentType` is param-stripped here too (idempotent for bare types): the
2154
- * presign strips internally, so a caller composing manually with the engine's
2155
- * parameterful `clipMimeType` would otherwise sign `video/webm` but PUT
2156
- * `video/webm;codecs=…` — a signed-header mismatch S3 rejects at runtime.
2157
- *
2158
- * Timeout: 15 min (`AbortSignal.timeout(900_000)`, matching the presign TTL)
2159
- * rather than the API calls' 30 s — a 15 MB clip on a slow link legitimately
2160
- * exceeds 30 s, but a stalled in-flight socket must still be bounded (the TTL
2161
- * alone only bounds when a PUT can START).
2162
- *
2163
- * Failures are ALWAYS typed: non-2xx throws {@link HostedApiError} with the
2164
- * client-synthesized `upload_failed` (message carries a truncated S3 body
2165
- * snippet — e.g. SignatureDoesNotMatch); a mid-transfer drop → `network_error`;
2166
- * the timeout → `timeout`.
2167
- */
2168
- async uploadToSpaces(uploadUrl, blob, contentType) {
2169
- let res;
2170
- try {
2171
- res = await this.fetchImpl(uploadUrl, {
2172
- method: "PUT",
2173
- headers: { "content-type": stripMimeParams(contentType) },
2174
- body: blob,
2175
- signal: AbortSignal.timeout(SPACES_PUT_TIMEOUT_MS)
2176
- });
2177
- } catch (err) {
2178
- throw asTransportError(err);
2179
- }
2180
- if (!res.ok) {
2181
- const snippet = (await res.text().catch(() => "")).slice(0, UPLOAD_ERROR_SNIPPET_CHARS);
2182
- throw new HostedApiError({
2183
- status: res.status,
2184
- code: "upload_failed",
2185
- message: `media upload failed (HTTP ${res.status})${snippet ? `: ${snippet}` : ""}`
2186
- });
2187
- }
2188
- }
2189
- /** Finalize an upload: the backend sniffs + promotes; returns the PROMOTED key to submit. */
2190
- async completeMedia(key) {
2191
- const id = await this.ensureSessionId();
2192
- return this.api("POST", `/sessions/${id}/media/complete`, {
2193
- body: { key }
2194
- });
2195
- }
2196
- /**
2197
- * Submit one check. Sends `{input, forceOutcome?}` (SubmitCheckSchema) and the
2198
- * optional `x-idempotency-key` header. Returns the whitelisted SessionView.
2199
- */
2200
- async submitCheck(checkType, input, opts = {}) {
2201
- const id = await this.ensureSessionId();
2202
- const body = {
2203
- input,
2204
- ...opts.forceOutcome !== void 0 ? { forceOutcome: opts.forceOutcome } : {}
2205
- };
2206
- return this.api("POST", `/sessions/${id}/checks/${checkType}`, {
2207
- body,
2208
- ...opts.idempotencyKey !== void 0 ? { idempotencyKey: opts.idempotencyKey } : {}
2209
- });
2210
- }
2211
- /**
2212
- * Convenience composition: presign → PUT → complete → submit, passing the
2213
- * PROMOTED key (from complete's response — never the pending presign key)
2214
- * into the check's media input field (`clipKey` for liveness, `imageKey` for
2215
- * face_match/doc_ocr). `extraInput` carries the remaining input fields
2216
- * (liveness `attestation`, doc_ocr `side`). The media content type is
2217
- * param-stripped ONCE and used for both presign and PUT, so the signed
2218
- * header always matches.
2219
- */
2220
- async uploadAndSubmit(checkType, media, extraInput, opts = {}) {
2221
- const bareType = stripMimeParams(media.contentType);
2222
- const presigned = await this.presign(media.kind, bareType, media.blob.size);
2223
- await this.uploadToSpaces(presigned.uploadUrl, media.blob, bareType);
2224
- const completed = await this.completeMedia(presigned.key);
2225
- const input = {
2226
- ...extraInput,
2227
- [MEDIA_INPUT_FIELD[checkType]]: completed.key
2228
- };
2229
- return this.submitCheck(checkType, input, opts);
2230
- }
2231
- // ── transport ──────────────────────────────────────────────────────────────
2232
- /** The token's own sessionId — cached from getSession(), lazily bootstrapped. */
2233
- async ensureSessionId() {
2234
- if (this.sessionId !== null) return this.sessionId;
2235
- this.bootstrap ?? (this.bootstrap = this.getSession().finally(() => {
2236
- this.bootstrap = null;
2237
- }));
2238
- return (await this.bootstrap).sessionId;
2239
- }
2240
- /**
2241
- * One API request: `${apiOrigin}/api/v2${path}`, `x-session-token` always,
2242
- * AbortSignal timeout (30 s default), `{success, data}` unwrap on 2xx, flat
2243
- * `{code, message}` → {@link HostedApiError} on non-2xx. EVERY failure is
2244
- * typed: a rejected fetch → `network_error`, the timeout → `timeout`, an
2245
- * unparseable 2xx body → `unknown_error` — the page never sees a raw
2246
- * TypeError/DOMException. The ONLY automatic retry is 409
2247
- * `idempotency_in_progress` (bounded, short delay).
2248
- */
2249
- async api(method, path, opts = {}) {
2250
- const url = `${this.apiOrigin}/api/v2${path}`;
2251
- const headers = { "x-session-token": this.sessionToken };
2252
- if (opts.body !== void 0) headers["content-type"] = "application/json";
2253
- if (opts.idempotencyKey !== void 0) headers["x-idempotency-key"] = opts.idempotencyKey;
2254
- for (let attempt = 0; ; attempt++) {
2255
- let res;
2256
- try {
2257
- res = await this.fetchImpl(url, {
2258
- method,
2259
- headers,
2260
- ...opts.body !== void 0 ? { body: JSON.stringify(opts.body) } : {},
2261
- signal: AbortSignal.timeout(this.requestTimeoutMs)
2262
- });
2263
- } catch (err2) {
2264
- throw asTransportError(err2);
2265
- }
2266
- if (res.ok) {
2267
- let raw;
2268
- try {
2269
- raw = await res.json();
2270
- } catch {
2271
- throw new HostedApiError({
2272
- status: res.status,
2273
- code: "unknown_error",
2274
- message: `response body was not valid JSON (HTTP ${res.status})`
2275
- });
2276
- }
2277
- return unwrap(raw);
2278
- }
2279
- const err = await parseErrorResponse(res);
2280
- if (err.code === "idempotency_in_progress" && attempt < this.retryAttempts) {
2281
- if (this.retryDelayMs > 0) await sleep(this.retryDelayMs);
2282
- continue;
2283
- }
2284
- throw err;
2285
- }
2286
- }
2287
- };
2288
- function asTransportError(err) {
2289
- const name = typeof err === "object" && err !== null ? err.name : void 0;
2290
- if (name === "TimeoutError") {
2291
- return new HostedApiError({ status: 0, code: "timeout", message: "request timed out" });
2292
- }
2293
- const detail = err instanceof Error ? err.message : String(err);
2294
- return new HostedApiError({
2295
- status: 0,
2296
- code: "network_error",
2297
- message: `network request failed: ${detail}`
2298
- });
2299
- }
2300
- function unwrap(raw) {
2301
- if (raw !== null && typeof raw === "object" && "success" in raw && "data" in raw) {
2302
- return raw.data;
2303
- }
2304
- return raw;
2305
- }
2306
- async function parseErrorResponse(res) {
2307
- let code = "unknown_error";
2308
- let message = `request failed (HTTP ${res.status})`;
2309
- try {
2310
- const body = await res.json();
2311
- if (body !== null && typeof body === "object") {
2312
- const env = body;
2313
- if (typeof env.code === "string" && env.code.length > 0) code = env.code;
2314
- if (typeof env.message === "string" && env.message.length > 0) message = env.message;
2315
- }
2316
- } catch {
2317
- }
2318
- const retryAfterRaw = res.headers.get("retry-after");
2319
- const retryAfter = retryAfterRaw === null ? Number.NaN : Number.parseInt(retryAfterRaw, 10);
2320
- return new HostedApiError({
2321
- status: res.status,
2322
- code,
2323
- message,
2324
- ...Number.isFinite(retryAfter) && retryAfter >= 0 ? { retryAfterSeconds: retryAfter } : {}
2325
- });
2326
- }
2327
- function sleep(ms) {
2328
- return new Promise((resolve) => setTimeout(resolve, ms));
2329
- }
2330
-
2331
- // src/verification/result.ts
2332
- var RETRYABLE_REASONS = /* @__PURE__ */ new Set([
2333
- "no_face",
2334
- "media_unreadable",
2335
- "clip_too_short",
2336
- "no_face_source",
2337
- "side_missing",
2338
- "unreadable",
2339
- "registry_unavailable",
2340
- "otp_mismatch",
2341
- "otp_expired",
2342
- "otp_send_failed"
2343
- ]);
2344
- var BIOMETRIC_CHECKS = /* @__PURE__ */ new Set(["liveness", "face_match"]);
2345
- function isExecutable(step) {
2346
- return step !== void 0 && (step.state === "pending" || step.state === "input_required");
2347
- }
2348
- function isTerminalView(view) {
2349
- return view.status !== "created" && view.status !== "in_progress";
2350
- }
2351
- function frontierStep(view) {
2352
- return view.steps.find((step) => isExecutable(step));
2353
- }
2354
- function stepOf(view, checkType) {
2355
- return view.steps.find((step) => step.checkType === checkType);
2356
- }
2357
- function mergeSessionView(prev, next, submitted) {
2358
- const byType = new Map(prev.steps.map((step) => [step.checkType, step]));
2359
- const steps = next.steps.map((step) => {
2360
- const before = byType.get(step.checkType);
2361
- const attemptsBefore = before?.attemptsRemaining ?? 0;
2362
- const merged = {
2363
- ...before ?? {},
2364
- checkType: step.checkType,
2365
- state: step.state,
2366
- attemptsRemaining: step.checkType === submitted ? Math.max(0, attemptsBefore - 1) : attemptsBefore
2367
- };
2368
- if (step.reason !== void 0) merged.reason = step.reason;
2369
- else delete merged.reason;
2370
- return merged;
2371
- });
2372
- return { ...prev, status: next.status, outcome: next.outcome, steps, expiresAt: next.expiresAt };
2373
- }
2374
- function unavailable(sessionId, reason) {
2375
- return reason === void 0 ? { sessionId, status: "unavailable" } : { sessionId, status: "unavailable", reason };
2376
- }
2377
- function withReason(sessionId, status, reason) {
2378
- return reason === void 0 ? { sessionId, status } : { sessionId, status, reason };
2379
- }
2380
- function mapSessionResult(view, opts) {
2381
- const { sessionId } = view;
2382
- switch (view.status) {
2383
- case "completed":
2384
- if (view.outcome === "approved") return { sessionId, status: "approved" };
2385
- if (view.outcome === "review") return withReason(sessionId, "review", reasonIn(view, "review"));
2386
- return withReason(sessionId, "rejected", reasonIn(view, "failed"));
2387
- case "failed":
2388
- return withReason(sessionId, "rejected", reasonIn(view, "failed"));
2389
- case "review_pending":
2390
- return withReason(sessionId, "review", reasonIn(view, "review"));
2391
- case "expired":
2392
- return unavailable(sessionId);
2393
- case "created":
2394
- case "in_progress":
2395
- break;
2396
- default: {
2397
- const unhandled = view.status;
2398
- throw new Error(`mapSessionResult: unhandled status ${unhandled}`);
2399
- }
2400
- }
2401
- const parked = view.steps.find(
2402
- (step) => BIOMETRIC_CHECKS.has(step.checkType) && step.state === "input_required" && step.reason !== void 0
2403
- );
2404
- if (parked?.reason !== void 0) {
2405
- const canRetry = opts.autoRetry && RETRYABLE_REASONS.has(parked.reason) && parked.attemptsRemaining > 0;
2406
- return {
2407
- sessionId,
2408
- status: canRetry ? "retry" : "rejected",
2409
- reason: parked.reason,
2410
- attemptsRemaining: parked.attemptsRemaining
2411
- };
2412
- }
2413
- if (frontierStep(view) === void 0 && view.steps.some((step) => step.state === "review")) {
2414
- return withReason(sessionId, "review", reasonIn(view, "review"));
2415
- }
2416
- return unavailable(sessionId);
2417
- }
2418
- function reasonIn(view, state) {
2419
- return view.steps.find((step) => step.state === state && step.reason !== void 0)?.reason;
2420
- }
2421
-
2422
- // src/verification/liveness-flow.ts
2423
- var CLIP_MIME_ALLOWLIST = ["video/webm", "video/mp4"];
2424
- var KEYFRAME_MIME = "image/jpeg";
2425
- var TRANSPORT_REPLAY_ATTEMPTS = 2;
2426
- var TRANSPORT_REPLAY_DELAY_MS = 1e3;
2427
- var MAX_RETRY_AFTER_MS = 1e4;
2428
- var RESYNC_REENTRY_MAX = 3;
2429
- var TRANSPORT_CODES = /* @__PURE__ */ new Set([
2430
- "network_error",
2431
- "timeout",
2432
- "upload_failed",
2433
- "unknown_error",
2434
- "rate_limit_exceeded"
2435
- ]);
2436
- var RESYNC_CODES = /* @__PURE__ */ new Set([
2437
- "session_not_active",
2438
- "check_not_found",
2439
- "check_already_finalized",
2440
- "check_out_of_order"
2441
- ]);
2442
- var AttestationError = class extends Error {
2443
- constructor(message) {
2444
- super(message);
2445
- this.name = "AttestationError";
2446
- }
2447
- };
2448
- async function runSubmission(rt, executor, hooks = {}) {
2449
- let key = rt.uuid();
2450
- let consentRecovered = false;
2451
- let attestationRetried = false;
2452
- let transportReplays = 0;
2453
- for (; ; ) {
2454
- try {
2455
- return await executor(rt.client, key);
2456
- } catch (err) {
2457
- if (err instanceof AttestationError) {
2458
- if (attestationRetried) throw err;
2459
- attestationRetried = true;
2460
- hooks.onAttestationInvalid?.();
2461
- key = rt.uuid();
2462
- continue;
2463
- }
2464
- if (!(err instanceof HostedApiError)) throw err;
2465
- if (err.code === "consent_required" && !consentRecovered) {
2466
- consentRecovered = true;
2467
- await rt.ensureConsent({ force: true });
2468
- key = rt.uuid();
2469
- continue;
2470
- }
2471
- if (err.code === "attestation_invalid" && !attestationRetried) {
2472
- attestationRetried = true;
2473
- hooks.onAttestationInvalid?.();
2474
- key = rt.uuid();
2475
- continue;
2476
- }
2477
- if (TRANSPORT_CODES.has(err.code) && transportReplays < TRANSPORT_REPLAY_ATTEMPTS) {
2478
- transportReplays += 1;
2479
- const retryAfterMs = err.retryAfterSeconds !== void 0 ? err.retryAfterSeconds * 1e3 : void 0;
2480
- await rt.sleep(
2481
- retryAfterMs !== void 0 ? Math.min(retryAfterMs, MAX_RETRY_AFTER_MS) : TRANSPORT_REPLAY_DELAY_MS
2482
- );
2483
- continue;
2484
- }
2485
- throw err;
2486
- }
2487
- }
2488
- }
2489
- var LIVENESS_CHAINABLE = /* @__PURE__ */ new Set(["passed", "review", "processing", "skipped"]);
2490
- async function runLivenessFlow(deps) {
2491
- const { artifacts } = deps;
2492
- const clip = artifacts.clip;
2493
- const bareMime = stripMimeParams(artifacts.clipMime ?? "");
2494
- if (artifacts.degraded === "NO_RECORDER" || clip === void 0 || !CLIP_MIME_ALLOWLIST.includes(bareMime)) {
2495
- return { kind: "unavailable", reason: "no_recorder" };
2496
- }
2497
- const submitLiveness = buildLivenessSubmit(deps, clip, bareMime);
2498
- const submitFaceMatch = buildFaceMatchSubmit(deps, artifacts.keyframe);
2499
- let livenessSubmitted = false;
2500
- let faceMatchSubmitted = false;
2501
- let livenessChainable = true;
2502
- let resyncs = 0;
2503
- for (; ; ) {
2504
- if (deps.isCancelled()) return { kind: "cancelled" };
2505
- const view = deps.getView();
2506
- if (isTerminalView(view)) return { kind: "settled" };
2507
- const frontier = frontierStep(view)?.checkType;
2508
- const next = frontier === "liveness" && !livenessSubmitted ? "liveness" : frontier === "face_match" && !faceMatchSubmitted && livenessChainable ? "face_match" : null;
2509
- if (next === null) return { kind: "settled" };
2510
- try {
2511
- if (next === "liveness") {
2512
- livenessSubmitted = true;
2513
- const response = await submitLiveness();
2514
- if (deps.isCancelled()) return { kind: "cancelled" };
2515
- deps.applySubmit(response, "liveness");
2516
- const state = stepOf(deps.getView(), "liveness")?.state;
2517
- livenessChainable = state === void 0 || LIVENESS_CHAINABLE.has(state);
2518
- } else {
2519
- faceMatchSubmitted = true;
2520
- const response = await submitFaceMatch();
2521
- if (deps.isCancelled()) return { kind: "cancelled" };
2522
- deps.applySubmit(response, "face_match");
2523
- }
2524
- } catch (err) {
2525
- if (deps.isCancelled()) return { kind: "cancelled" };
2526
- const outcome = classifyFailure(err);
2527
- if (outcome.kind !== "resync" || resyncs >= RESYNC_REENTRY_MAX) return outcome;
2528
- resyncs += 1;
2529
- await deps.refreshView();
2530
- }
2531
- }
2532
- }
2533
- function buildLivenessSubmit(deps, clip, bareMime) {
2534
- let clipKey = null;
2535
- let attestation = null;
2536
- return () => runSubmission(
2537
- deps,
2538
- async (client, idempotencyKey) => {
2539
- if (clipKey === null) {
2540
- deps.onPhase("uploading");
2541
- const presigned = await client.presign("clip", bareMime, clip.size);
2542
- await client.uploadToSpaces(presigned.uploadUrl, clip, bareMime);
2543
- clipKey = (await client.completeMedia(presigned.key)).key;
2544
- }
2545
- if (attestation === null) {
2546
- try {
2547
- attestation = await deps.getAttestation();
2548
- } catch (err) {
2549
- throw new AttestationError(err instanceof Error ? err.message : String(err));
2550
- }
2551
- }
2552
- deps.onPhase("checking");
2553
- return client.submitCheck(
2554
- "liveness",
2555
- {
2556
- clipKey,
2557
- attestation,
2558
- captureChannel: deps.artifacts.captureChannel,
2559
- capture: captureInputOf(deps.artifacts)
2560
- },
2561
- { idempotencyKey }
2562
- );
2563
- },
2564
- {
2565
- onAttestationInvalid: () => {
2566
- attestation = null;
2567
- }
2568
- }
2569
- );
2570
- }
2571
- function captureInputOf(artifacts) {
2572
- return {
2573
- ...artifacts.engine !== void 0 ? { engine: artifacts.engine } : {},
2574
- width: artifacts.width,
2575
- height: artifacts.height,
2576
- ...artifacts.clipMs !== void 0 ? { clipMs: artifacts.clipMs } : {},
2577
- ...artifacts.cameraReadyMs !== void 0 ? { cameraReadyMs: artifacts.cameraReadyMs } : {},
2578
- ...artifacts.faceAcquireMs !== void 0 ? { faceAcquireMs: artifacts.faceAcquireMs } : {},
2579
- ...artifacts.captureMs !== void 0 ? { captureMs: artifacts.captureMs } : {}
2580
- };
2581
- }
2582
- function buildFaceMatchSubmit(deps, keyframe) {
2583
- let imageKey = null;
2584
- return () => runSubmission(deps, async (client, idempotencyKey) => {
2585
- if (imageKey === null) {
2586
- deps.onPhase("uploading");
2587
- const presigned = await client.presign("image", KEYFRAME_MIME, keyframe.size);
2588
- await client.uploadToSpaces(presigned.uploadUrl, keyframe, KEYFRAME_MIME);
2589
- imageKey = (await client.completeMedia(presigned.key)).key;
2590
- }
2591
- deps.onPhase("checking");
2592
- return client.submitCheck("face_match", { imageKey }, { idempotencyKey });
2593
- });
2594
- }
2595
- function classifyFailure(err) {
2596
- if (err instanceof AttestationError) return { kind: "unavailable", reason: "attestation" };
2597
- if (err instanceof HostedApiError) {
2598
- if (err.code === "attestation_invalid") return { kind: "unavailable", reason: "attestation" };
2599
- if (RESYNC_CODES.has(err.code)) return { kind: "resync" };
2600
- }
2601
- return { kind: "unavailable", reason: "network" };
2602
- }
2603
-
2604
- // src/verification/turnstile.ts
2605
- var TURNSTILE_SCRIPT_SRC = "https://challenges.cloudflare.com/turnstile/v0/api.js";
2606
- var TURNSTILE_EXECUTE_TIMEOUT_MS = 3e4;
2607
- function installedApi() {
2608
- return window.turnstile;
2609
- }
2610
- var loaderPromise = null;
2611
- function loadTurnstile() {
2612
- loaderPromise ?? (loaderPromise = new Promise((resolve, reject) => {
2613
- const present = installedApi();
2614
- if (present) {
2615
- resolve(present);
2616
- return;
2617
- }
2618
- const script = document.createElement("script");
2619
- script.src = TURNSTILE_SCRIPT_SRC;
2620
- script.async = true;
2621
- script.onload = () => {
2622
- const api = installedApi();
2623
- if (api) {
2624
- resolve(api);
2625
- } else {
2626
- loaderPromise = null;
2627
- reject(new Error("Turnstile script loaded but exposed no API"));
2628
- }
2629
- };
2630
- script.onerror = () => {
2631
- loaderPromise = null;
2632
- script.remove();
2633
- reject(new Error("Turnstile script failed to load"));
2634
- };
2635
- document.head.appendChild(script);
2636
- }));
2637
- return loaderPromise;
2638
- }
2639
- function abortError() {
2640
- return new Error("Turnstile challenge aborted");
2641
- }
2642
- async function executeTurnstile(siteKey, opts = {}) {
2643
- const timeoutMs = opts.timeoutMs ?? TURNSTILE_EXECUTE_TIMEOUT_MS;
2644
- const signal = opts.signal;
2645
- if (signal?.aborted) throw abortError();
2646
- const api = await loadTurnstile();
2647
- if (signal?.aborted) throw abortError();
2648
- const container = document.createElement("div");
2649
- document.body.appendChild(container);
2650
- let widgetId;
2651
- let timer;
2652
- let onAbort;
2653
- try {
2654
- return await new Promise((resolve, reject) => {
2655
- timer = setTimeout(
2656
- () => reject(new Error(`Turnstile challenge timed out (${timeoutMs} ms)`)),
2657
- timeoutMs
2658
- );
2659
- if (signal !== void 0) {
2660
- onAbort = () => reject(abortError());
2661
- signal.addEventListener("abort", onAbort, { once: true });
2662
- }
2663
- widgetId = api.render(container, {
2664
- sitekey: siteKey,
2665
- execution: "execute",
2666
- appearance: "execute",
2667
- callback: resolve,
2668
- "error-callback": (code) => {
2669
- reject(new Error(`Turnstile challenge failed${code ? ` (${code})` : ""}`));
2670
- }
2671
- });
2672
- if (widgetId === void 0) {
2673
- reject(new Error("Turnstile render returned no widget id"));
2674
- return;
2675
- }
2676
- api.execute(widgetId);
2677
- });
2678
- } finally {
2679
- clearTimeout(timer);
2680
- if (signal !== void 0 && onAbort !== void 0) signal.removeEventListener("abort", onAbort);
2681
- if (widgetId !== void 0) {
2682
- try {
2683
- api.remove(widgetId);
2684
- } catch {
2685
- }
2686
- }
2687
- container.remove();
2688
- }
2689
- }
2690
-
2691
- // src/verification/create-verification.ts
2692
- var DEFAULT_API_ORIGIN = "https://api.sekyro.ai";
2693
- var REGISTRY_RETRY_DELAY_MS = 5e3;
2694
- var PROCESSING_POLL_DELAY_MS = 1500;
2695
- var PROCESSING_POLL_MAX = 10;
2696
- function defaultSleep(ms) {
2697
- return new Promise((resolve) => setTimeout(resolve, ms));
2698
- }
2699
- function randomUuid() {
2700
- const c = globalThis.crypto;
2701
- if (c !== void 0 && typeof c.randomUUID === "function") return c.randomUUID();
2702
- const bytes = new Uint8Array(16);
2703
- if (c !== void 0 && typeof c.getRandomValues === "function") c.getRandomValues(bytes);
2704
- else for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);
2705
- bytes[6] = (bytes[6] ?? 0) & 15 | 64;
2706
- bytes[8] = (bytes[8] ?? 0) & 63 | 128;
2707
- const hex = [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
2708
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
2709
- }
2710
- function createVerification(options) {
2711
- return createVerificationInternal(options, {});
2712
- }
2713
- function createVerificationInternal(options, internals) {
2714
- const apiOrigin = options.apiOrigin ?? DEFAULT_API_ORIGIN;
2715
- const autoRetry = options.autoRetry ?? true;
2716
- const rearm = options.rearm ?? "auto";
2717
- const client = internals.client ?? new HostedClient({
2718
- apiOrigin,
2719
- sessionToken: options.clientToken,
2720
- ...options.fetch !== void 0 ? { fetch: options.fetch } : {}
2721
- });
2722
- const sleep2 = internals.sleep ?? defaultSleep;
2723
- const uuid = internals.uuid ?? randomUuid;
2724
- const getTurnstileToken = internals.getTurnstileToken ?? executeTurnstile;
2725
- const emitter = createEmitter();
2726
- let destroyed = false;
2727
- const lifetime = new AbortController();
2728
- let view = null;
2729
- let bootstrap = null;
2730
- const setView = (next) => {
2731
- view = next;
2732
- emitter.emit("view", next);
2733
- };
2734
- const ensureView = () => {
2735
- if (view !== null) return Promise.resolve(view);
2736
- bootstrap ?? (bootstrap = client.getSession().then((next) => {
2737
- setView(next);
2738
- return next;
2739
- }).finally(() => {
2740
- bootstrap = null;
2741
- }));
2742
- return bootstrap;
2743
- };
2744
- const refreshView = async () => {
2745
- const next = await client.getSession();
2746
- setView(next);
2747
- return next;
2748
- };
2749
- const applySubmit = (response, submitted) => {
2750
- if (view !== null) setView(mergeSessionView(view, response, submitted));
2751
- };
2752
- let consentInFlight = null;
2753
- const recordConsent = async (force) => {
2754
- const current = await ensureView();
2755
- if (!force && current.consentRecorded) return;
2756
- await client.recordConsent(options.locale);
2757
- if (view !== null) setView({ ...view, consentRecorded: true });
2758
- };
2759
- const ensureConsent = (opts) => {
2760
- if (opts?.force === true) return recordConsent(true);
2761
- consentInFlight ?? (consentInFlight = recordConsent(false).finally(() => {
2762
- consentInFlight = null;
2763
- }));
2764
- return consentInFlight;
2765
- };
2766
- const runtime = {
2767
- client,
2768
- ensureConsent: (opts) => ensureConsent(opts),
2769
- sleep: sleep2,
2770
- uuid
2771
- };
2772
- let terminalEmitted = false;
2773
- const emitResult = (result) => {
2774
- if (result.status === "approved" || result.status === "rejected" || result.status === "review") {
2775
- if (terminalEmitted) return;
2776
- terminalEmitted = true;
2777
- }
2778
- emitter.emit("result", result);
2779
- };
2780
- let registry2 = null;
2781
- let registryFailed = false;
2782
- let registryUnbound = false;
2783
- const submitRegistry = () => runSubmission(
2784
- runtime,
2785
- (c, idempotencyKey) => (
2786
- // `{}` input: the session is bound to a SERVER-provided NNI (Plan A Task 2).
2787
- c.submitCheck("population_registry", {}, { idempotencyKey })
2788
- )
2789
- );
2790
- const runRegistry = async () => {
2791
- try {
2792
- const current = await ensureView();
2793
- if (isTerminalView(current) || frontierStep(current)?.checkType !== "population_registry") {
2794
- return;
2795
- }
2796
- if (current.nniBound !== true) {
2797
- registryUnbound = true;
2798
- return;
2799
- }
2800
- await ensureConsent();
2801
- applySubmit(await submitRegistry(), "population_registry");
2802
- const step = view === null ? void 0 : stepOf(view, "population_registry");
2803
- if (step?.state === "input_required" && step.reason === "registry_unavailable" && step.attemptsRemaining > 0) {
2804
- await sleep2(REGISTRY_RETRY_DELAY_MS);
2805
- if (destroyed) return;
2806
- applySubmit(await submitRegistry(), "population_registry");
2807
- }
2808
- } catch {
2809
- registryFailed = true;
2810
- return;
2811
- }
2812
- if (view !== null && isTerminalView(view)) emitResult(mapSessionResult(view, { autoRetry }));
2813
- };
2814
- const startRegistry = () => {
2815
- registry2 ?? (registry2 = runRegistry());
2816
- return registry2;
2817
- };
2818
- const getAttestation = async () => {
2819
- const current = await ensureView();
2820
- const siteKey = current.turnstileSiteKey;
2821
- if (siteKey === null) return { sandbox: true };
2822
- return {
2823
- channel: "hosted_web",
2824
- siteKey,
2825
- turnstileToken: await getTurnstileToken(siteKey, { signal: lifetime.signal })
2826
- };
2827
- };
2828
- let active = null;
2829
- let chain = Promise.resolve();
2830
- let chainDepth = 0;
2831
- const settleProcessing = async () => {
2832
- let current = await ensureView();
2833
- for (let i = 0; i < PROCESSING_POLL_MAX && !destroyed && !isTerminalView(current) && frontierStep(current) === void 0 && current.steps.some((step) => step.state === "processing"); i += 1) {
2834
- await sleep2(PROCESSING_POLL_DELAY_MS);
2835
- if (destroyed) break;
2836
- current = await refreshView();
2837
- }
2838
- return current;
2839
- };
2840
- const runFlow = async (bound, artifacts, capturedAttempt) => {
2841
- const { capture } = bound;
2842
- const isCancelled = () => destroyed;
2843
- const ownsHandle = () => bound.alive && bound.attempt === capturedAttempt;
2844
- const setPhase = (phase) => {
2845
- if (ownsHandle()) capture.setFlowState(phase);
2846
- };
2847
- const finish = (result) => {
2848
- if (isCancelled()) return;
2849
- emitResult(result);
2850
- if (!ownsHandle()) return;
2851
- if (result.status === "retry" && rearm === "auto") {
2852
- capture.handle.retry();
2853
- return;
2854
- }
2855
- capture.setFlowState("done");
2856
- };
2857
- if (artifacts.degraded === "NO_RECORDER") {
2858
- const sessionId = view?.sessionId ?? (await ensureView().catch(() => null))?.sessionId ?? "";
2859
- finish(unavailable(sessionId, "no_recorder"));
2860
- return;
2861
- }
2862
- setPhase("uploading");
2863
- try {
2864
- await startRegistry();
2865
- if (isCancelled()) return;
2866
- let current = await ensureView();
2867
- if (!isTerminalView(current)) {
2868
- if (frontierStep(current)?.checkType === "population_registry") {
2869
- finish(
2870
- unavailable(
2871
- current.sessionId,
2872
- registryUnbound ? "nni_unbound" : registryFailed ? "network" : "registry_unavailable"
2873
- )
2874
- );
2875
- return;
2876
- }
2877
- await ensureConsent();
2878
- if (isCancelled()) return;
2879
- const outcome = await runLivenessFlow({
2880
- ...runtime,
2881
- artifacts,
2882
- getAttestation,
2883
- getView: () => view ?? current,
2884
- refreshView,
2885
- applySubmit,
2886
- onPhase: setPhase,
2887
- isCancelled
2888
- });
2889
- if (isCancelled()) return;
2890
- if (outcome.kind === "unavailable") {
2891
- finish(unavailable(current.sessionId, outcome.reason));
2892
- return;
2893
- }
2894
- if (outcome.kind === "resync") await refreshView();
2895
- current = await settleProcessing();
2896
- }
2897
- finish(mapSessionResult(current, { autoRetry }));
2898
- } catch {
2899
- if (isCancelled()) return;
2900
- finish(unavailable(view?.sessionId ?? "", "network"));
2901
- }
2902
- };
2903
- const enqueueFlow = (bound, artifacts) => {
2904
- const capturedAttempt = bound.attempt;
2905
- if (chainDepth > 0 && bound.alive) {
2906
- bound.capture.setFlowState("uploading");
2907
- }
2908
- chainDepth += 1;
2909
- chain = chain.then(() => runFlow(bound, artifacts, capturedAttempt)).finally(() => {
2910
- chainDepth -= 1;
2911
- }).catch(() => void 0);
2912
- };
2913
- const liveness = (captureOptions) => {
2914
- active?.capture.handle.destroy();
2915
- if (active !== null) active.alive = false;
2916
- const capture = createLivenessCaptureInternal(captureOptions, internals.capture);
2917
- const bound = { capture, alive: true, attempt: 0 };
2918
- active = bound;
2919
- capture.handle.on("state", (state) => {
2920
- if (state === "starting") bound.attempt += 1;
2921
- });
2922
- capture.handle.on("captured", (artifacts) => {
2923
- void Promise.resolve().then(() => enqueueFlow(bound, artifacts));
2924
- });
2925
- const inner = capture.handle;
2926
- return {
2927
- get state() {
2928
- return inner.state;
2929
- },
2930
- on: (event, handler) => inner.on(event, handler),
2931
- start: (startOptions) => inner.start(startOptions),
2932
- retry: () => inner.retry(),
2933
- switchCamera: () => inner.switchCamera(),
2934
- destroy: () => {
2935
- bound.alive = false;
2936
- if (active === bound) active = null;
2937
- inner.destroy();
2938
- }
2939
- };
2940
- };
2941
- return {
2942
- consent: () => ensureConsent(),
2943
- startRegistry,
2944
- liveness,
2945
- voiceClips: async () => {
2946
- if (destroyed) return null;
2947
- try {
2948
- const current = await ensureView();
2949
- if (destroyed) return null;
2950
- return current.voice ?? null;
2951
- } catch {
2952
- return null;
2953
- }
2954
- },
2955
- on: (event, handler) => emitter.on(event, handler),
2956
- destroy: () => {
2957
- destroyed = true;
2958
- lifetime.abort();
2959
- if (active !== null) {
2960
- active.alive = false;
2961
- active.capture.handle.destroy();
2962
- active = null;
2963
- }
2964
- emitter.clear();
2965
- }
2966
- };
2967
- }
2968
-
2969
- // src/popup/index.ts
2970
- var SEKYRO_EVENTS = [
2971
- "session.completed",
2972
- "session.failed",
2973
- "session.review_pending",
2974
- "session.expired",
2975
- "session.cancelled"
2976
- ];
2977
- var WINDOW_NAME = "sekyro-verify";
2978
- var WINDOW_FEATURES = "width=480,height=720,noopener=false";
2979
- var EVENT_NAMES = new Set(SEKYRO_EVENTS);
2980
- function isSekyroEvent(data) {
2981
- if (data === null || typeof data !== "object") return false;
2982
- const d = data;
2983
- return d.source === "sekyro" && d.version === 1 && typeof d.sessionId === "string" && typeof d.event === "string" && EVENT_NAMES.has(d.event);
2984
- }
2985
- function open(opts) {
2986
- const origin = new URL(opts.hostedUrl).origin;
2987
- const popup = window.open(opts.hostedUrl, WINDOW_NAME, WINDOW_FEATURES);
2988
- if (!popup) return { error: "popup_blocked" };
2989
- const listener = (ev) => {
2990
- if (ev.source !== popup) return;
2991
- if (ev.origin !== origin) return;
2992
- if (!isSekyroEvent(ev.data)) return;
2993
- const { source, version, event, sessionId } = ev.data;
2994
- opts.onEvent({ source, version, event, sessionId });
2995
- };
2996
- window.addEventListener("message", listener);
2997
- return {
2998
- close() {
2999
- window.removeEventListener("message", listener);
3000
- popup.close();
3001
- }
3002
- };
3003
- }
3004
- function openHosted(hostedUrl, opts) {
3005
- if (opts.mode === "redirect") {
3006
- window.location.assign(hostedUrl);
3007
- return { close() {
3008
- } };
3009
- }
3010
- return open({ hostedUrl, onEvent: opts.onEvent ?? (() => void 0) });
3011
- }
3012
- // Annotate the CommonJS export names for ESM import in node:
3013
- 0 && (module.exports = {
3014
- DEFAULT_API_ORIGIN,
3015
- HostedApiError,
3016
- KNOWN_CODES,
3017
- SEKYRO_EVENTS,
3018
- createLivenessCapture,
3019
- createVerification,
3020
- getLivenessAssetsStatus,
3021
- hasMultipleCameras,
3022
- isKnownCode,
3023
- openHosted,
3024
- preloadLivenessAssets,
3025
- queryCameraPermission,
3026
- releaseLivenessAssets,
3027
- subscribeCameraPermission,
3028
- subscribeLivenessAssets
3029
- });
3030
- //# sourceMappingURL=index.cjs.map
1
+ "use strict";var qA=Object.create;var Vt=Object.defineProperty;var WA=Object.getOwnPropertyDescriptor;var zA=Object.getOwnPropertyNames;var XA=Object.getPrototypeOf,jA=Object.prototype.hasOwnProperty;var J=(e,t)=>()=>(e&&(t=e(e=0)),t);var ue=(e,t)=>{for(var n in t)Vt(e,n,{get:t[n],enumerable:!0})},Fo=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of zA(t))!jA.call(e,o)&&o!==n&&Vt(e,o,{get:()=>t[o],enumerable:!(i=WA(t,o))||i.enumerable});return e};var Jt=(e,t,n)=>(n=e!=null?qA(XA(e)):{},Fo(t||!e||!e.__esModule?Vt(n,"default",{value:e,enumerable:!0}):n,e)),ZA=e=>Fo(Vt({},"__esModule",{value:!0}),e);function Po(e,t){return{video:{width:{ideal:1280,max:1280},height:{ideal:720,max:720},facingMode:t,frameRate:{ideal:24,max:30}},audio:!1}}function Ve(){return typeof window>"u"||typeof navigator>"u"?!1:window.innerWidth<=768||/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(String(navigator.userAgent??""))}var Yt=J(()=>{"use strict"});function No(){let e=globalThis.MediaRecorder;return!e||typeof e.isTypeSupported!="function"?"":$A.find(t=>e.isTypeSupported(t))??""}function tt(e){if(e instanceof TypeError)return"insecure";switch(e?.name??""){case"NotAllowedError":case"PermissionDeniedError":return"permission";case"NotFoundError":case"DevicesNotFoundError":return"notfound";case"NotReadableError":case"TrackStartError":return"inuse";case"OverconstrainedError":case"ConstraintNotSatisfiedError":return"overconstrained";default:return"generic"}}function Oo(){let e=globalThis;if(typeof e.window<"u"&&e.window.isSecureContext===!1)return"INSECURE_CONTEXT";let t=e.navigator?.mediaDevices;return!t||typeof t.getUserMedia!="function"?"UNSUPPORTED":"OK"}function Ho(){let e=globalThis.MediaRecorder;return typeof e<"u"&&typeof e.isTypeSupported=="function"}function Kt(e){return e.size>jn}var $A,Go,jn,nt=J(()=>{"use strict";$A=["video/mp4;codecs=avc1.42E01E,mp4a.40.2","video/mp4;codecs=avc1.42E01E","video/mp4","video/webm;codecs=vp9,opus","video/webm;codecs=vp9","video/webm;codecs=vp8,opus","video/webm;codecs=vp8","video/webm"];Go="video/webm";jn=8*1024*1024});var Uo,Vo=J(()=>{"use strict";Uo="0.1.0-rc.8"});function Ko(){let e=globalThis.crypto;try{if(typeof e?.randomUUID=="function")return e.randomUUID()}catch{}try{if(typeof e?.getRandomValues=="function"){let t=e.getRandomValues(new Uint8Array(16));return Array.from(t,n=>n.toString(16).padStart(2,"0")).join("")}}catch{}}function ec(){try{let e=localStorage.getItem(Jo);if(e)return e;let t=Ko();return t!==void 0&&localStorage.setItem(Jo,t),t}catch{return Yo??(Yo=Ko()),Yo}}async function tc(){let e=globalThis.crypto?.subtle;if(!e)return"";let t=navigator,n=JSON.stringify([t.userAgent,t.platform,t.hardwareConcurrency??null,t.deviceMemory??null,t.maxTouchPoints??0,screen.width,screen.height,screen.colorDepth,globalThis.devicePixelRatio??1,Intl.DateTimeFormat().resolvedOptions().timeZone,t.languages?.join(",")??t.language]),i=await e.digest("SHA-256",new TextEncoder().encode(n));return Array.from(new Uint8Array(i),o=>o.toString(16).padStart(2,"0")).join("").slice(0,32)}function nc(e){let t=new TextEncoder().encode(e),n="";for(let i of t)n+=String.fromCharCode(i);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function ic(e){let t,n;return{timezone(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone?.slice(0,64)||void 0}catch{return}},noteCameraLabel(i){i&&(t=i.slice(0,128))},async deviceHeader(){try{n??(n=tc().catch(()=>""));let i=[];navigator.webdriver&&i.push("webdriver"),/HeadlessChrome/.test(navigator.userAgent)&&i.push("headless");let o=await n,r=ec(),a={v:1,platform:"web",sdk:e.sdk.slice(0,64),ids:[...r?[{kind:"web_local",value:r.slice(0,128)}]:[],...o?[{kind:"web_fp",value:o}]:[]],screen:{w:screen.width,h:screen.height,dpr:globalThis.devicePixelRatio??1},...t?{cameraLabel:t}:{},...i.length?{signals:i}:{}};return nc(JSON.stringify(a))}catch{return}}}}function Wt(e){try{let t=e.getVideoTracks?.()[0];t&&qt.noteCameraLabel(t.label)}catch{}}var Jo,Yo,Zn,$n,qt,zt=J(()=>{"use strict";Vo();Jo="sekyro.did";Zn=Symbol.for("sekyro.web.clientContext"),$n=globalThis,qt=$n[Zn]??($n[Zn]=ic({sdk:`@sekyro/web@${Uo}`}))});var oc,rc,ac,qo,ve,Xt,Wo=J(()=>{"use strict";nt();oc=2500,rc=1e3,ac=1500,qo=25e5,ve=class extends Error{constructor(t,n){super(n??t),this.kind=t}},Xt=class{constructor(){this.recorder=null;this.stream=null;this.chunks=[];this.bytes=0;this.hardStopTimer=null;this.graceTimer=null;this.settled=!1}clearTimers(){this.hardStopTimer&&clearTimeout(this.hardStopTimer),this.graceTimer&&clearTimeout(this.graceTimer),this.hardStopTimer=null,this.graceTimer=null}record(t,n){if(this.recorder&&!this.settled)return Promise.reject(new ve("generic","record() called while a recording is in flight \u2014 ClipRecorder handles one recording at a time"));this.recorder=null,this.clearTimers(),this.chunks=[],this.bytes=0,this.settled=!1,this.stream=t;let i=No();return new Promise((o,r)=>{let a;try{a=new MediaRecorder(t,i?{mimeType:i,videoBitsPerSecond:qo}:{videoBitsPerSecond:qo})}catch{try{a=new MediaRecorder(t)}catch{r(new ve("unsupported"));return}}this.recorder=a;let s=c=>{this.settled||(this.settled=!0,this.clearTimers(),c())},A=()=>s(()=>{let c=a.mimeType||i||Go,l=new Blob(this.chunks,{type:c});if(l.size===0){r(new ve("generic","empty clip"));return}if(Kt(l)){r(new ve("cliptoolarge"));return}o({blob:l,mimeType:c})});a.ondataavailable=c=>{c.data&&c.data.size&&(this.chunks.push(c.data),this.bytes+=c.data.size,this.bytes>jn&&s(()=>{try{a.state!=="inactive"&&a.stop()}catch{}r(new ve("cliptoolarge"))}))},a.onstop=A,a.onerror=()=>s(()=>r(new ve("generic")));try{a.start(rc)}catch{s(()=>r(new ve("generic")));return}this.hardStopTimer=setTimeout(()=>{if(this.settled||n?.(),a.state!=="inactive"){try{a.stop()}catch{A()}this.graceTimer=setTimeout(A,ac)}else A()},oc)})}stop(t){this.clearTimers();let n=this.recorder;if(n&&n.state!=="inactive")try{n.stop()}catch{}this.recorder=null,(t??this.stream)?.getTracks().forEach(o=>o.stop()),this.stream=null}}});function zo(e,t,n=.92){return new Promise((i,o)=>{let r=e.videoWidth,a=e.videoHeight;if(!r||!a){o(new Error("video-not-ready"));return}let s=t.getContext("2d");if(!s){o(new Error("no-2d-context"));return}t.width=r,t.height=a,s.scale(-1,1),s.drawImage(e,-r,0),t.toBlob(A=>A?i(A):o(new Error("empty-keyframe")),"image/jpeg",n)})}var Xo=J(()=>{"use strict"});function sc(e){let t,n=-1;for(let i of e){let o=i.categories[0]?.score??0;o>n&&(t=i,n=o)}return t}function Ac(e,t){let n=e?.[0],i=e?.[1];if(n===void 0||i===void 0)return;let o=s=>({x:s.x*t.width,y:s.y*t.height}),[r,a]=[o(n),o(i)];return r.x<=a.x?{left:r,right:a}:{left:a,right:r}}var jo,jt,Zo=J(()=>{"use strict";Je();jo=1e4,jt=class e{constructor(t,n){this.tier="blaze";this.inner=t,n!==void 0&&(this.fallbackReason=n)}static async create(t,n){let i=await import("@mediapipe/tasks-vision"),o=await i.FilesetResolver.forVisionTasks(t),r=await i.FaceDetector.createFromOptions(o,{baseOptions:{modelAssetPath:`${t}/blaze_face_short_range.tflite`,delegate:"CPU"},runningMode:"IMAGE"});return new e(r,n)}async detect(t,n,i){let o;try{o=this.inner.detect(t).detections}catch{return null}let r=sc(o);if(r?.boundingBox===void 0)return null;let a=ht(t),s=Ac(r.keypoints,a),A=r.keypoints?.[2],c={box:{x:r.boundingBox.originX,y:r.boundingBox.originY,width:r.boundingBox.width,height:r.boundingBox.height},...s!==void 0?{eyes:s}:{},...A!==void 0?{nose:{x:A.x*a.width,y:A.y*a.height}}:{},score:r.categories[0]?.score??0};return Zt(c,t,n,i)}destroy(){try{this.inner.close()}catch{}}}});function cc(){if(typeof OffscreenCanvas=="function")return new OffscreenCanvas(2,2);let e=document.createElement("canvas");return e.width=2,e.height=2,e}async function $o(){let e=globalThis.FaceDetector;if(typeof e!="function")return{ok:!1,reason:"unsupported"};try{let t=new e({fastMode:!0,maxDetectedFaces:1});return await t.detect(cc()),{ok:!0,instance:t}}catch(t){return{ok:!1,reason:`smoke_failed:${t instanceof Error?t.message:String(t)}`}}}function lc(e){if(e===void 0)return;let t=e.filter(o=>o.type==="eye").map(o=>o.locations[0]).filter(o=>o!==void 0),[n,i]=t;if(!(n===void 0||i===void 0))return n.x<=i.x?{left:n,right:i}:{left:i,right:n}}var $t,er=J(()=>{"use strict";Je();$t=class{constructor(t,n){this.tier="native";this.inner=t,n!==void 0&&(this.fallbackReason=n)}async detect(t,n,i){let o;try{o=await this.inner.detect(t)}catch{return null}let r=o[0];if(r===void 0)return null;let a=lc(r.landmarks),s={box:{x:r.boundingBox.x,y:r.boundingBox.y,width:r.boundingBox.width,height:r.boundingBox.height},...a!==void 0?{eyes:a}:{},score:1};return Zt(s,t,n,i)}destroy(){}}});function ht(e){let t=e;if(typeof t.videoWidth=="number"&&t.videoWidth>0)return{width:t.videoWidth,height:t.videoHeight??0};if(typeof t.naturalWidth=="number"&&t.naturalWidth>0)return{width:t.naturalWidth,height:t.naturalHeight??0};let n=typeof t.width=="number"?t.width:0,i=typeof t.height=="number"?t.height:0;return{width:n,height:i}}function Zt(e,t,n,i){let o=ht(t),r=o.width>0?n/o.width:1,a=o.height>0?i/o.height:1,s=A=>({x:A.x*r,y:A.y*a});return{box:{x:e.box.x*r,y:e.box.y*a,width:e.box.width*r,height:e.box.height*a},...e.eyes!==void 0?{eyes:{left:s(e.eyes.left),right:s(e.eyes.right)}}:{},...e.nose!==void 0?{nose:s(e.nose)}:{},score:e.score}}function dc(e){return e instanceof Error?e.message:String(e)}async function Qe(e){let t=e.preferred??uc,n=[];for(let i of t){if(i==="native"){let o=await $o();if(o.ok)return new $t(o.instance,ei(n));n.push(`native:${o.reason}`);continue}try{return await gc(jt.create(e.v3AssetBaseUrl??ti,ei(n)),e.blazeInitTimeoutMs??jo)}catch(o){n.push(o instanceof en?"blaze:blaze_init_timeout":`blaze:${dc(o)}`)}}throw new pt(ei(n)??"no_tier_available")}function ei(e){return e.length>0?e.join("; "):void 0}function gc(e,t){return new Promise((n,i)=>{let o=setTimeout(()=>{i(new en(`init exceeded ${t}ms`)),e.then(r=>r.destroy(),()=>{})},t);e.then(r=>{clearTimeout(o),n(r)},r=>{clearTimeout(o),i(r)})})}var ti,uc,pt,en,Je=J(()=>{"use strict";Zo();er();ti="/models-v3",uc=["native","blaze"],pt=class extends Error{constructor(t){super(`no detector tier available (${t})`),this.name="DetectorLadderError",this.fallbackReason=t}};en=class extends Error{}});function tr(){return typeof OffscreenCanvas=="function"&&typeof createImageBitmap=="function"&&typeof Worker=="function"}function mc(e,t={}){let n=t.createDetector??Qe,i=null;e.onmessage=o=>{let r=o.data;if(r.v!==Ye){r.bitmap?.close?.();return}if(r.type==="init"){n(r.options).then(a=>{i=a;let s={v:Ye,type:"ready",tier:a.tier,...a.fallbackReason!==void 0?{fallbackReason:a.fallbackReason}:{}};e.postMessage(s)});return}if(r.type==="detect"){let a=s=>{let A={v:Ye,type:"result",id:r.id,observation:s};e.postMessage(A),r.bitmap.close?.()};if(i===null){a(null);return}i.detect(r.bitmap,r.streamWidth,r.streamHeight).then(a,()=>a(null))}}}var Ye,tn,nr=J(()=>{"use strict";Je();Ye=1;typeof self<"u"&&typeof self.importScripts=="function"&&mc(self);tn=class e{constructor(t,n){this.pending=new Map;this.nextId=1;this.worker=t,this.tier=n.tier,n.fallbackReason!==void 0&&(this.fallbackReason=n.fallbackReason),t.addEventListener("message",i=>{let o=i.data;if(o.v!==Ye||o.type!=="result")return;let r=this.pending.get(o.id);this.pending.delete(o.id),r?.(o.observation)})}static create(t,n,i=1e4){return new Promise((o,r)=>{let a=setTimeout(()=>{t.removeEventListener("message",s),t.terminate(),r(new Error(`worker detector not ready within ${i}ms`))},i),s=c=>{let l=c.data;l.v!==Ye||l.type!=="ready"||(clearTimeout(a),t.removeEventListener("message",s),o(new e(t,l)))};t.addEventListener("message",s);let A={v:Ye,type:"init",options:n};t.postMessage(A)})}async detect(t,n,i){let o;try{typeof ImageBitmap<"u"&&t instanceof ImageBitmap?o=t:typeof createImageBitmap=="function"?o=await createImageBitmap(t):o=t}catch{return null}let r=this.nextId;return this.nextId+=1,new Promise(a=>{this.pending.set(r,a);let s={v:Ye,type:"detect",id:r,bitmap:o,streamWidth:n,streamHeight:i};this.worker.postMessage(s,[o])})}destroy(){for(let t of this.pending.values())t(null);this.pending.clear(),this.worker.terminate()}}});function on(){let e=typeof navigator>"u"?void 0:navigator,t=!1;try{t=typeof WebAssembly<"u"&&WebAssembly.validate(pc)}catch{t=!1}return{cores:e?.hardwareConcurrency??2,memGB:e?.deviceMemory??null,simd:t}}function rn(e){let t=e.memGB??4;return e.cores<4||t<3?"LOW":e.cores>=8&&t>=6?"HIGH":"MID"}var hc,pc,ni,nn,ii=J(()=>{"use strict";hc=Object.freeze({LOW:Object.freeze({cadenceHz:5,inputWidth:128,animations:"reduced"}),MID:Object.freeze({cadenceHz:8,inputWidth:160,animations:"full"}),HIGH:Object.freeze({cadenceHz:10,inputWidth:192,animations:"full"})}),pc=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]);ni=["LOW","MID","HIGH"],nn=class{constructor(t){this.samples=[];this.adjusted=!1;this.current=t}get deviceClass(){return this.current}get profile(){return hc[this.current]}record(t){if(this.adjusted||this.samples.length>=10)return this.current;if(this.samples.push(t),this.samples.length<10)return this.current;this.adjusted=!0;let n=this.samples.reduce((i,o)=>i+o,0)/this.samples.length;if(n>70)this.current="LOW";else if(n<25){let i=ni.indexOf(this.current);this.current=ni[Math.min(ni.length-1,i+1)]??this.current}return this.current}}});var an,ir=J(()=>{"use strict";an=class{constructor(t){this.timer=null;this.frameCallbackId=null;this.running=!1;this.busy=!1;this.lastRunAt=Number.NEGATIVE_INFINITY;this.degradeCount=0;this.durations=[];this.options=t,this.periodMs=1e3/t.cadenceHz}start(){if(this.running)return;this.running=!0;let t=this.options.video;if(typeof t?.requestVideoFrameCallback=="function"){let n=()=>{this.running&&(this.frameCallbackId=t.requestVideoFrameCallback?.(()=>{this.frameCallbackId=null,this.now()-this.lastRunAt>=this.periodMs&&this.tick(),n()}))};n();return}this.timer=setInterval(()=>this.tick(),this.periodMs)}stop(){this.running=!1,this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.frameCallbackId!==null&&(this.options.video?.cancelVideoFrameCallback?.(this.frameCallbackId),this.frameCallbackId=null)}stats(){let t=this.durations.length===0?0:this.durations.reduce((n,i)=>n+i,0)/this.durations.length;return{degradeCount:this.degradeCount,meanDetectMs:t}}now(){return this.options.now?.()??performance.now()}tick(){if(!this.running)return;if(this.busy){this.degradeCount+=1;return}this.busy=!0,this.lastRunAt=this.now();let t=this.now();this.options.run().catch(()=>{}).finally(()=>{this.busy=!1,this.durations.push(this.now()-t),this.durations.length>20&&this.durations.shift()})}}});function or(e,t){return .299*(e[t]??0)+.587*(e[t+1]??0)+.114*(e[t+2]??0)}function Ke(e){let{data:t,width:n,height:i}=e,o=n*i;if(o===0)return 0;let r=0;for(let a=0;a<o;a+=1)r+=or(t,a*4);return r/o}function we(e){let{data:t,width:n,height:i}=e;if(n<3||i<3)return 0;let o=new Float32Array(n*i);for(let l=0;l<o.length;l+=1)o[l]=or(t,l*4);let r=0,a=0,s=0;for(let l=1;l<i-1;l+=1)for(let d=1;d<n-1;d+=1){let m=l*n+d,h=(o[m-n]??0)+(o[m-1]??0)+(o[m+1]??0)+(o[m+n]??0)-4*(o[m]??0);r+=h,a+=h*h,s+=1}if(s===0)return 0;let A=r/s,c=a/s-A*A;return Math.min(1,Math.max(0,c)/180)}function it(e){let t=Ke(e),[n,i]=Se,o=t<n?n-t:t>i?t-i:0;return Math.max(0,1-o/fc)}var Se,fc,qe=J(()=>{"use strict";Se=[100,190],fc=64});var Ic,ot,sn,rr=J(()=>{"use strict";qe();Ic=Object.freeze({Q_GOOD:.6,RISE_PER_S:.9,FALL_PER_S:.25,CENTER_FALLOFF_IOD_MULTIPLE:1.35,BOX_EYE_OFFSET_FACTOR:.12,IOD_BOX_PROXY_FACTOR:.42,SIZE_IDEAL_MIN:.12,SIZE_IDEAL_MAX:.3,SIZE_HARD_MIN:.08,SIZE_HARD_MAX:.45,ROLL_MAX_DEG:25,MOTION_VELOCITY_IOD_PER_S:.5,MOTION_TAU_S:.4,MOTION_DEADBAND_IOD_PER_S:.1,READY_WINDOW_MS:500,GUIDE_SIZE:.6,GUIDE_CENTERING:.6,GUIDE_POSE:.6,GUIDE_EXPOSURE:.6,GUIDE_SHARPNESS:.35,GUIDE_MOTION:.5}),ot=e=>Math.min(1,Math.max(0,e)),sn=class{constructor(t={}){this.p=0;this.lastTickAt=null;this.lastCenter=null;this.velocityEma=0;this.qWindow=[];this.lastSizeDirection="ideal";this.t={...Ic,...t}}reset(){this.p=0,this.lastTickAt=null,this.lastCenter=null,this.velocityEma=0,this.qWindow=[],this.lastSizeDirection="ideal"}tick(t){let{observation:n,quality:i,timestampMs:o}=t,r=this.lastTickAt===null?0:Math.max(0,(o-this.lastTickAt)/1e3);this.lastTickAt=o;let a={presence:0,centering:0,size:0,pose:0,sharpness:ot(i.sharpness),exposure:ot(i.exposure),motion:1};if(n!==null){a.presence=1;let l=this.geometryOf(n,t);a.centering=l.centering,a.size=l.size,a.pose=l.pose,a.motion=this.motionOf(l.center,l.iod,o)}else this.lastCenter=null,this.velocityEma=0;let s=Math.min(a.presence,a.centering,a.size,a.pose,a.sharpness,a.exposure,a.motion);this.p=ot(this.p+(s>=this.t.Q_GOOD?this.t.RISE_PER_S*s:-this.t.FALL_PER_S*(1-s))*r),this.qWindow.push({at:o,q:s}),this.qWindow=this.qWindow.filter(l=>l.at>=o-this.t.READY_WINDOW_MS);let A=this.qWindow.map(l=>l.q);if(A.length>=3){let l=Math.min(...A),d=A.indexOf(l);A=A.filter((m,h)=>h!==d)}let c=this.p>=1&&A.every(l=>l>=this.t.Q_GOOD);return{at:o,q:s,p:this.p,factors:a,guidanceKey:this.guidanceOf(a,i,s),ready:c,accepted:s>=this.t.Q_GOOD}}geometryOf(t,n){let{box:i,eyes:o}=t,r={x:n.frameWidth/2,y:n.frameHeight/2},a=Math.min(n.frameWidth,n.frameHeight),s=o!==void 0?{x:(o.left.x+o.right.x)/2,y:(o.left.y+o.right.y)/2}:{x:i.x+i.width/2,y:i.y+i.height/2-this.t.BOX_EYE_OFFSET_FACTOR*i.height},A=o!==void 0?Math.hypot(o.right.x-o.left.x,o.right.y-o.left.y):this.t.IOD_BOX_PROXY_FACTOR*i.width,c=Math.hypot(s.x-r.x,s.y-r.y),l=A<=0?0:1-ot(c/(this.t.CENTER_FALLOFF_IOD_MULTIPLE*A)),d=a>0?A/a:0;this.lastSizeDirection=d<this.t.SIZE_IDEAL_MIN?"far":d>this.t.SIZE_IDEAL_MAX?"close":"ideal";let m;d<this.t.SIZE_HARD_MIN||d>this.t.SIZE_HARD_MAX?m=0:d<this.t.SIZE_IDEAL_MIN?m=(d-this.t.SIZE_HARD_MIN)/(this.t.SIZE_IDEAL_MIN-this.t.SIZE_HARD_MIN):d>this.t.SIZE_IDEAL_MAX?m=(this.t.SIZE_HARD_MAX-d)/(this.t.SIZE_HARD_MAX-this.t.SIZE_IDEAL_MAX):m=1;let h=1;if(o!==void 0){let u=Math.abs(Math.atan2(o.right.y-o.left.y,o.right.x-o.left.x))*180/Math.PI;h=1-ot(u/this.t.ROLL_MAX_DEG)}return{center:s,iod:A,centering:l,size:m,pose:h}}motionOf(t,n,i){let o=this.lastCenter;if(this.lastCenter={...t,at:i},o===null||n<=0)return 1;let r=(i-o.at)/1e3;if(r<=0)return 1;let a=Math.hypot(t.x-o.x,t.y-o.y)/n/r;a<=this.t.MOTION_DEADBAND_IOD_PER_S&&(a=0);let s=1-Math.exp(-r/this.t.MOTION_TAU_S);return this.velocityEma=s*a+(1-s)*this.velocityEma,1-ot(this.velocityEma/this.t.MOTION_VELOCITY_IOD_PER_S)}guidanceOf(t,n,i){if(t.presence<=0)return"fcv3.no_face";if(t.size<this.t.GUIDE_SIZE)return this.sizeGuidance();if(t.centering<this.t.GUIDE_CENTERING)return"fcv3.center_face";if(t.pose<this.t.GUIDE_POSE)return"fcv3.straighten";if(t.exposure<this.t.GUIDE_EXPOSURE)return this.exposureGuidance(n);if(t.sharpness<this.t.GUIDE_SHARPNESS)return"fcv3.steady_camera";if(t.motion<this.t.GUIDE_MOTION)return"fcv3.hold_still";if(i<this.t.Q_GOOD){let o=[["size",this.sizeGuidance()],["centering","fcv3.center_face"],["pose","fcv3.straighten"],["exposure",this.exposureGuidance(n)],["sharpness","fcv3.steady_camera"],["motion","fcv3.hold_still"]],r=o[0];for(let a of o)t[a[0]]<t[r[0]]&&(r=a);return r[1]}return"fcv3.hold_still"}sizeGuidance(){return this.lastSizeDirection==="far"?"fcv3.come_closer":"fcv3.move_back"}exposureGuidance(t){let n=(Se[0]+Se[1])/2;return t.meanLuma<n?"fcv3.more_light":"fcv3.too_bright"}}});function yc(e){if(e.accepted)return null;if(e.factors.presence<=0)return"no_face";let t="size";for(let n of Cc)e.factors[n]<e.factors[t]&&(t=n);return t}var Cc,An,ar=J(()=>{"use strict";Cc=["size","centering","pose","exposure","sharpness","motion"];An=class{constructor(){this.blocked={};this.acceptedMs=0;this.ticks=0;this.lastAt=null}record(t){let n=this.lastAt===null?0:Math.max(0,t.at-this.lastAt);this.lastAt=t.at,this.ticks+=1;let i=yc(t);if(i===null){this.acceptedMs+=n;return}let o=this.blocked[i]??{count:0,ms:0};o.count+=1,o.ms+=n,this.blocked[i]=o}summary(){let t={};for(let[n,i]of Object.entries(this.blocked))t[n]={count:i.count,ms:Math.round(i.ms)};return{blocked:t,acceptedMs:Math.round(this.acceptedMs),ticks:this.ticks}}}});var mr={};ue(mr,{RANK_CANDIDATES:()=>Ec,RANK_TOLERANCE:()=>cn,RANK_WINDOW_MS:()=>bc,ROLL_ZERO_DEG:()=>Qc,SHARPNESS_REPORT_MAX:()=>dr,YAW_REPORT_MAX:()=>ur,YAW_ZERO_IOD:()=>Bc,collectRankedKeyframes:()=>gr,default:()=>wc,featuresOf:()=>cr,frontalOf:()=>Ar,rankKeyframes:()=>lr});function Ar(e){let t=e.eyes;if(t===void 0)return{frontal:1,yaw:null,roll:null};let n=t.right.x-t.left.x,i=t.right.y-t.left.y,o=n*n+i*i;if(o===0)return{frontal:1,yaw:null,roll:null};let r=Math.abs(Math.atan2(i,Math.abs(n))*180/Math.PI),a=sr(1-r/30),s=null,A=e.nose;if(A!==void 0){let c=(t.left.x+t.right.x)/2,l=(t.left.y+t.right.y)/2;s=Math.abs(((A.x-c)*n+(A.y-l)*i)/o),a*=sr(1-s/.5)}return{frontal:a,yaw:s,roll:r}}function cr(e,t){return e===null?{face:!1,frontal:0,yaw:null,roll:null,eyes:null,score:0,sharpness:t}:{face:!0,...Ar(e),eyes:null,score:e.score,sharpness:t}}function lr(e){let t=e.map((o,r)=>r),n=(o,r)=>{let a=Number.NEGATIVE_INFINITY;for(let s of t)a=Math.max(a,o(e[s]));t=t.filter(s=>o(e[s])>=a-r)};n(o=>o.frontal,cn.frontal),n(o=>o.eyes??1,cn.eyes),n(o=>o.score,cn.score);let i=-1;for(let o of t)(i===-1||e[o].sharpness>e[i].sharpness)&&(i=o);return i}function Sc(e){return{face:e.face,frontal:rt(e.frontal),...e.yaw!==null?{yaw:Math.min(rt(e.yaw),ur)}:{},...e.roll!==null?{roll:rt(e.roll)}:{},...e.eyes!==null?{eyes:rt(e.eyes)}:{},score:rt(e.score),sharpness:Math.min(rt(e.sharpness),dr)}}async function gr(e,t){let{options:n}=e,i=n.video,o=n.now??(()=>performance.now()),r=n.captureKeyframe??(m=>e.defaultKeyframe(m)),a=600/3,s=[],A=[],c=0;for(let m=0;m<4;m+=1){if(t!==e.attempt)return null;let h=e.detector,u=Promise.resolve(null),f,p=0;try{if(h!==null){let Q=e.profiler?.profile.inputWidth??160,k=n.makeSnapshot?.(i,Q)??e.defaultSnapshot(i,Q);f=r(i).then(b=>(p=o(),b));let I=o();u=h.detect(k,i.videoWidth,i.videoHeight).then(b=>(c+=o()-I,b),()=>null)}else f=r(i).then(Q=>(p=o(),Q));let[C,w]=await Promise.all([f,u]);s.push(C),A.push(cr(w,C.sharpness))}catch{f?.catch(()=>{})}let g=p>0?Math.max(0,o()-p):0;m<3&&await new Promise(C=>setTimeout(C,Math.max(0,a-g)))}if(t!==e.attempt)return null;let l=lr(A);if(l===-1)return null;let d=0;A.forEach((m,h)=>{m.sharpness>A[d].sharpness&&(d=h)});try{n.telemetry?.({type:"keyframe",tier:e.detector?.tier??null,chosen:l,sharpest:d,detectMs:Math.round(c),candidates:A.map(Sc)})}catch{}return s[l]??null}var Ec,bc,Bc,Qc,cn,sr,rt,ur,dr,wc,hr=J(()=>{"use strict";Ec=4,bc=600,Bc=.5,Qc=30,cn={frontal:.1,eyes:.1,score:.05},sr=e=>e<0?0:e>1?1:e;rt=e=>Number.isFinite(e)?Math.round(e*1e3)/1e3:0,ur=99,dr=999999;wc=gr});function xc(e){return new Promise(t=>setTimeout(t,e))}function Dc(e){return e instanceof Error?e.message:String(e)}function fr(e,t,n){try{let i=document.createElement("canvas"),o=n/Math.max(1,t.width);i.width=Math.max(1,Math.round(t.width*o)),i.height=Math.max(1,Math.round(t.height*o));let r=i.getContext("2d");return r===null?null:(r.drawImage(e,t.x,t.y,t.width,t.height,0,0,i.width,i.height),r.getImageData(0,0,i.width,i.height))}catch{return null}}var kc,oi,Mc,pr,ln,ri,Ir=J(()=>{"use strict";zt();Yt();Wo();Xo();nt();Je();nr();ii();ir();rr();qe();ar();kc=1e3,oi=4,Mc=600,pr={sharpness:1,exposure:1,meanLuma:128},ln=class{constructor(t){this.handlers=new Map;this.stateValue="idle";this.attempt=0;this.stream=null;this.detector=null;this.scheduler=null;this.gate=null;this.profiler=null;this.lastGuidanceKey=null;this.positioningStartedAt=0;this.cameraRequestedAt=null;this.cameraReadyAt=null;this.faceAcquiredAt=null;this.captureCompleteAt=null;this.fired=!1;this.carriedDegrade=0;this.carriedMeans=[];this.blockStats=null;this.lastGateSnapshotAt=Number.NEGATIVE_INFINITY;this.snapshotCanvas=null;this.options=t,this.facing=t.facingMode??"user"}get state(){return this.stateValue}on(t,n){let i=this.handlers.get(t);return i||(i=new Set,this.handlers.set(t,i)),i.add(n),()=>i?.delete(n)}emit(t,n){for(let i of[...this.handlers.get(t)??[]])i(n)}async start(t={}){t.facingMode!==void 0&&(this.facing=t.facingMode),this.attempt+=1,await this.run(this.attempt)}get facingMode(){return this.facing}retry(){this.teardownAttempt(),this.start()}switchCamera(){this.facing=this.facing==="user"?"environment":"user",this.teardownAttempt(),this.start()}destroy(){this.attempt+=1,this.teardownAttempt(),this.detector?.destroy(),this.detector=null,this.options.video.srcObject=null}async run(t){let{options:n}=this;this.fired=!1,this.lastGuidanceKey=null,this.carriedDegrade=0,this.carriedMeans=[],this.cameraRequestedAt=null,this.cameraReadyAt=null,this.faceAcquiredAt=null,this.captureCompleteAt=null,this.setState("preflight");let i=Oo();if(i!=="OK"){this.fail(i==="INSECURE_CONTEXT"?"insecure":"unsupported");return}this.setState("acquiring");let o=n.getUserMedia??(A=>navigator.mediaDevices.getUserMedia(A)),r;this.cameraRequestedAt=this.now();try{r=await o(Po(Ve(),this.facing))}catch(A){if(t!==this.attempt)return;this.fail(tt(A));return}if(Wt(r),t!==this.attempt){for(let A of r.getTracks())A.stop();return}if(this.stream=r,n.video.srcObject=r,await n.video.play().catch(()=>{}),t!==this.attempt)return;if(this.cameraReadyAt=this.now(),this.detector===null){let A={...n.v3AssetBaseUrl!==void 0?{v3AssetBaseUrl:n.v3AssetBaseUrl}:{}},c=n.createDetector??(n.createWorker!==void 0&&tr()?async()=>{try{return await tn.create(n.createWorker(),A)}catch{return Qe(A)}}:()=>Qe(A)),l;try{l=await c()}catch(d){t===this.attempt&&this.fail("models",d instanceof pt?d.fallbackReason:Dc(d));return}if(t!==this.attempt){l.destroy();return}this.detector=l,this.options.telemetry?.({type:"detector",tier:l.tier,fallbackReason:l.fallbackReason})}let a=on(),s=n.deviceClass??rn(a);this.profiler=new nn(s),this.options.telemetry?.({type:"profile",staticClass:s,activeClass:this.profiler.deviceClass,simd:a.simd}),this.gate=new sn(n.thresholds??{}),this.blockStats=new An,this.lastGateSnapshotAt=this.now(),n.rankKeyframes?.()&&Promise.resolve().then(()=>(hr(),mr)).then(A=>ri=A,()=>{}),this.setState("positioning"),this.positioningStartedAt=this.now(),this.startScheduler(t)}get animations(){return this.profiler?.profile.animations??"full"}startScheduler(t){let n=this.profiler;if(n===null)return;if(this.scheduler!==null){let o=this.scheduler.stats();this.carriedDegrade+=o.degradeCount,o.meanDetectMs>0&&this.carriedMeans.push(o.meanDetectMs),this.scheduler.stop()}let i=new an({cadenceHz:n.profile.cadenceHz,video:this.options.video,now:this.options.now,run:()=>this.detectTick(t)});this.scheduler=i,i.start()}async detectTick(t){let{detector:n,gate:i,profiler:o}=this,r=this.options.video;if(t!==this.attempt||n===null||i===null||o===null||this.fired||r.videoWidth===0)return;let a=o.deviceClass,s=this.now(),A=this.options.makeSnapshot?.(r,o.profile.inputWidth)??this.defaultSnapshot(r,o.profile.inputWidth),c=null;try{c=await n.detect(A,r.videoWidth,r.videoHeight)}catch{c=null}if(t!==this.attempt||this.fired)return;o.record(this.now()-s),o.deviceClass!==a&&this.startScheduler(t);let l=c===null?pr:this.options.measureQuality?.(r,c.box)??this.defaultQuality(r,c.box),d=i.tick({timestampMs:this.now(),observation:c,quality:l,frameWidth:r.videoWidth,frameHeight:r.videoHeight});d.accepted&&this.faceAcquiredAt===null&&(this.faceAcquiredAt=d.at),this.blockStats?.record(d),!d.ready&&d.at-this.lastGateSnapshotAt>=kc&&(this.lastGateSnapshotAt=d.at,this.reportGate(!1)),this.emit("checks",{engine:"v3",progress:d.p,q:d.q,factors:d.factors,attempt:t}),d.guidanceKey!==this.lastGuidanceKey&&(this.lastGuidanceKey=d.guidanceKey,this.emit("guidance",{key:d.guidanceKey})),d.ready&&this.stateValue==="positioning"&&(this.fired=!0,this.captureCompleteAt=d.at,this.fire(t))}async fire(t){let{options:n}=this,i=this.scheduler;i?.stop(),this.reportGate(!0);let o=i?.stats()??{degradeCount:0,meanDetectMs:0},r=[...this.carriedMeans,...o.meanDetectMs>0?[o.meanDetectMs]:[]];n.telemetry?.({type:"fired",timeToGateMs:this.now()-this.positioningStartedAt,degradeCount:this.carriedDegrade+o.degradeCount,meanDetectMs:r.length===0?0:r.reduce((u,f)=>u+f,0)/r.length});let a=n.mode??"clip",s=n.rankKeyframes?.()&&ri?ri.default(this,t).catch(()=>this.collectKeyframes(t)):this.collectKeyframes(t);if(a==="photo"){let u=await s;if(t!==this.attempt)return;if(u===null){this.fail("generic");return}this.finishCapture({keyframe:u.blob,previewDataUrl:u.previewDataUrl});return}this.setState("recording");let A=n.createRecorder?.()??new Xt,c=this.stream;if(c===null){this.fail("generic");return}let l=null;s.then(u=>{l=u},()=>{});let d=()=>{t===this.attempt&&l!==null&&this.emit("frozen",{previewDataUrl:l.previewDataUrl})},m,h;try{[m,h]=await Promise.all([A.record(c,d),s])}catch(u){if(t!==this.attempt)return;let f=u.kind;this.fail(f==="cliptoolarge"?"cliptoolarge":"recorder");return}if(t===this.attempt){if(Kt(m.blob)){this.fail("cliptoolarge");return}if(h===null){this.fail("generic");return}this.finishCapture({clip:m.blob,clipMimeType:m.mimeType,keyframe:h.blob,previewDataUrl:h.previewDataUrl})}}async collectKeyframes(t){let n=this.options.captureKeyframe??(r=>this.defaultKeyframe(r)),i=Mc/(oi-1),o=null;for(let r=0;r<oi;r+=1){if(t!==this.attempt)return o;try{let a=await n(this.options.video);(o===null||a.sharpness>o.sharpness)&&(o=a)}catch{}r<oi-1&&await xc(i)}return o}finishCapture(t){this.stopTracks(),this.setState("captured");let n=this.captureTiming();this.emit("artifacts",n===void 0?t:{...t,timing:n})}captureTiming(){let t=(a,s)=>a!==null&&s!==null?Math.max(0,Math.round(s-a)):void 0,n=t(this.cameraRequestedAt,this.cameraReadyAt),i=t(this.cameraReadyAt,this.faceAcquiredAt),o=t(this.faceAcquiredAt,this.captureCompleteAt),r={...n!==void 0?{cameraReadyMs:n}:{},...i!==void 0?{faceAcquireMs:i}:{},...o!==void 0?{captureMs:o}:{}};return Object.keys(r).length>0?r:void 0}async defaultKeyframe(t){let n=document.createElement("canvas"),i=await zo(t,n),o=n.toDataURL("image/jpeg",.92);return{blob:i,previewDataUrl:o,sharpness:this.centerSharpness(t)}}defaultSnapshot(t,n){try{let i=this.snapshotCanvas??document.createElement("canvas"),o=n/Math.max(1,t.videoWidth),r=Math.max(1,Math.round(t.videoWidth*o)),a=Math.max(1,Math.round(t.videoHeight*o)),s=i.getContext("2d");return s===null?t:(i.width!==r&&(i.width=r),i.height!==a&&(i.height=a),s.drawImage(t,0,0,r,a),this.snapshotCanvas=i,i)}catch{return t}}defaultQuality(t,n){let i=fr(t,n,96);return i===null?pr:{sharpness:we(i),exposure:it(i),meanLuma:Ke(i)}}centerSharpness(t){let n=ht(t),i=fr(t,{x:n.width*.25,y:n.height*.25,width:n.width*.5,height:n.height*.5},96);return i===null?0:we(i)}teardownAttempt(){this.scheduler?.stop(),this.scheduler=null,this.reportGate(!0),this.gate=null,this.stopTracks()}reportGate(t){let n=this.blockStats,i=this.profiler;if(n===null||i===null)return;let o=n.summary();t&&(this.blockStats=null),o.ticks!==0&&this.options.telemetry?.({type:"gate",final:t,activeClass:i.deviceClass,cadenceHz:i.profile.cadenceHz,...o})}stopTracks(){if(this.stream!==null){for(let t of this.stream.getTracks())t.stop();this.stream=null}}fail(t,n){this.scheduler?.stop(),this.reportGate(!0),this.stopTracks(),this.setState("error"),this.options.telemetry?.({type:"error",kind:t,fallbackReason:n}),this.emit("error",{kind:t,retryable:t!=="insecure"&&t!=="unsupported"})}setState(t){this.stateValue=t,this.emit("statechange",{state:t})}now(){return this.options.now?.()??performance.now()}}});function Pe(){let e=new Map;return{on(t,n){let i=e.get(t);i===void 0&&(i=new Set,e.set(t,i));let o=n;return i.add(o),()=>{i?.delete(o)}},emit(t,n){let i=e.get(t);if(i!==void 0)for(let o of[...i])o(n)},clear(){e.clear()}}}var ft=J(()=>{"use strict"});function gn(){let e=globalThis;return e[un]??(e[un]=new Map),e[un]}function It(e){let t=(e??ti).replace(/\/+$/,"");return t===""?"/":t}function yr(e){let t=gn(),n=t.get(e);return n===void 0&&(n={status:"idle",promise:null,scheduled:null,detectorPromise:null,detector:null,listeners:new Set},t.set(e,n)),n}function dn(e,t){if(e.status!==t){e.status=t;for(let n of[...e.listeners])n(t)}}function Fc(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.mediaDevices?.getUserMedia=="function"}function Pc(){return navigator.connection?.saveData===!0}function Nc(e){let t=window;if(typeof t.requestIdleCallback=="function"){let i=t.requestIdleCallback(e,{timeout:Rc});return()=>t.cancelIdleCallback?.(i)}let n=setTimeout(e,Tc);return()=>clearTimeout(n)}function Gc(e,t){let n,i=new Promise(s=>{n=s}),o=!1,r=()=>{},a={promise:i,settle:s=>{o||(o=!0,r(),e.scheduled===a&&(e.scheduled=null),n(s))}};return e.scheduled=a,r=Nc(()=>{o||a.settle(ai(e,t))}),i}function ai(e,t){if((e.status==="loading"||e.status==="ready")&&e.promise!==null)return e.promise;dn(e,"loading");let n=new Promise(s=>s(Lc(t)));e.detectorPromise=n;let i,o=new Promise((s,A)=>{i=setTimeout(()=>{n.then(c=>c.destroy(),()=>{}),A(new Error(`detector preload exceeded ${Cr} ms`))},Cr)}),a=Promise.race([n,o]).then(s=>e.detectorPromise!==n?(s.destroy(),e.status):(e.detector=s,dn(e,"ready"),"ready"),s=>(e.detectorPromise===n&&(e.detectorPromise=null,e.detector=null,dn(e,"failed"),console.warn("[@sekyro/web] face-detector preload failed:",s)),e.status)).finally(()=>clearTimeout(i));return e.promise=a,e.scheduled?.settle(a),a}function Er(e={}){if(!Fc())return Promise.resolve("idle");let t=It(e.assetBaseUrl),n=yr(t);return e.respectSaveData===!0&&Pc()?Promise.resolve(n.status):(n.status==="loading"||n.status==="ready")&&n.promise!==null?n.promise:e.idle===!0?n.scheduled?.promise??Gc(n,t):ai(n,t)}function br(e){return gn().get(It(e))?.status??"idle"}function Br(e,t){let n=yr(It(t));return n.listeners.add(e),()=>{n.listeners.delete(e)}}function Qr(e){let t=gn().get(It(e));t!==void 0&&(t.scheduled?.settle("idle"),t.detector?.destroy(),t.detector=null,t.detectorPromise=null,t.promise=null,dn(t,"idle"))}function Oc(e){return{get tier(){return e.tier},get fallbackReason(){return e.fallbackReason},detect:(...t)=>e.detect(...t),destroy:()=>{}}}function Sr(e){let t=It(e),n=gn().get(t);if(!(n===void 0||n.detector===null&&n.detectorPromise===null&&n.scheduled===null))return async()=>{n.scheduled!==null&&ai(n,t);let i=n.promise;for(;n.detector===null&&i!==null&&(await i,n.promise!==i);)i=n.promise;return n.detector!==null?Oc(n.detector):Qe({v3AssetBaseUrl:t})}}var vc,Cr,Rc,Tc,un,_c,Lc,si=J(()=>{"use strict";Je();vc=12e4,Cr=13e4,Rc=3e3,Tc=1200,un=Symbol.for("@sekyro/web.preload.v1");_c=e=>Qe({preferred:["blaze"],v3AssetBaseUrl:e,blazeInitTimeoutMs:vc}),Lc=_c});function wr(){if(typeof navigator>"u"||!("wakeLock"in navigator))return null;let e=navigator.wakeLock;return typeof e?.request=="function"?e:null}function kr(){return typeof document>"u"||document.visibilityState==="visible"}function Mr(e){try{e.release().catch(()=>{})}catch{}}function at(e={}){if(e.enabled===!1)return{setActive:()=>{}};let t=!1,n=null,i=!1,o=!1,r=()=>{if(!t||i||n!==null&&!n.released)return;let A=wr();if(A===null||!kr())return;let c;try{c=A.request("screen")}catch{return}i=!0,c.then(l=>{if(i=!1,!t){Mr(l);return}n=l,l.addEventListener?.("release",()=>{n===l&&(n=null)})},()=>{i=!1})},a=()=>{kr()&&r()},s=A=>{typeof document>"u"||A===o||(o=A,A?document.addEventListener("visibilitychange",a):document.removeEventListener("visibilitychange",a))};return{setActive:A=>{if(t=A,A){if(wr()===null)return;s(!0),r();return}if(s(!1),n!==null){let c=n;n=null,Mr(c)}}}}var mn=J(()=>{"use strict"});function Hc(e){switch(e){case"fcv3.no_face":case"fcv3.center_face":case"fcv3.straighten":return"center";case"fcv3.come_closer":return"closer";case"fcv3.move_back":return"farther";case"fcv3.more_light":case"fcv3.too_bright":return"light";case"fcv3.hold_still":case"fcv3.steady_camera":return"still";default:return null}}function Uc(e){switch(e){case"preflight":case"acquiring":return"starting";case"positioning":return"gating";default:return e}}function Ai(e){switch(e){case"permission":case"notfound":case"inuse":case"insecure":case"unsupported":return e;default:{let t=e;return"generic"}}}function ci(e,t={},n){let i=t.now??(()=>performance.now()),o=Pe(),r=!Ho(),a=t.engineOptions,s=a?.createDetector===void 0&&a?.createWorker===void 0?{createDetector:()=>{let L=Sr(e.assetBaseUrl);return L!==void 0?L():Qe({v3AssetBaseUrl:e.assetBaseUrl})}}:{},A={video:e.video,mode:r?"photo":"clip",rankKeyframes:n,facingMode:e.facing,v3AssetBaseUrl:e.assetBaseUrl,...t.engineOptions??{},...s},c=t.createEngine?.(A)??new ln(A),l="idle",d=null,m=0,h=!1,u="full",f=null,p=null,g=0,C=0,w=()=>{e.video.videoWidth>0&&e.video.videoHeight>0&&(g=e.video.videoWidth,C=e.video.videoHeight)},Q=at({enabled:e.keepScreenAwake!==!1}),k=L=>{l=L,Q.setActive(L==="starting"||L==="gating"||L==="recording"),o.emit("state",L)},I=()=>o.emit("gate",{progress:m,hint:d,faceDetected:h}),b=()=>{let L=c.animations??"full";L!==u&&(u=L,o.emit("profile",{animations:u}))},v=[c.on("statechange",({state:L})=>{let q=Uc(L);q==="starting"&&l!=="starting"&&(d=null,m=0,h=!1,f=null,p=null,g=0,C=0),k(q),b(),q==="recording"&&(w(),f=i(),d="hold",m=1,I())}),c.on("checks",L=>{w(),m=L.progress,h=L.factors.presence>0,I(),b()}),c.on("guidance",({key:L})=>{d=Hc(L),I()}),c.on("frozen",({previewDataUrl:L})=>{p=i(),o.emit("frozen",{previewDataUrl:L})}),c.on("artifacts",L=>{let q=f!==null&&p!==null?Math.max(0,Math.round(p-f)):void 0;o.emit("captured",{keyframe:L.keyframe,...L.clip!==void 0?{clip:L.clip}:{},...L.clipMimeType!==void 0?{clipMime:L.clipMimeType}:{},width:e.video.videoWidth||g,height:e.video.videoHeight||C,...q!==void 0?{clipMs:q}:{},captureChannel:Ve()?"mobile":"desktop",...r?{degraded:"NO_RECORDER"}:{},engine:"v3",...L.timing})}),c.on("error",({kind:L,retryable:q})=>{o.emit("error",{kind:Ai(L),retryable:q})})];return{handle:{get state(){return l},on:(L,q)=>o.on(L,q),start:L=>c.start({facingMode:L?.facing}),retry:()=>c.retry(),switchCamera:()=>c.switchCamera(),destroy:()=>{for(let L of v)L();Q.setActive(!1),c.destroy(),o.clear()}},setFlowState:L=>{l!==L&&k(L)}}}function xr(e){return ci(e).handle}var hn=J(()=>{"use strict";Yt();nt();Ir();Je();ft();si();mn()});function _r(e){return ui.includes(e)}var ui,ce,st=J(()=>{"use strict";ui=["session_token_invalid","session_token_required","session_token_session_mismatch","session_not_found","rate_limit_exceeded","consent_required","session_not_active","check_not_found","check_already_finalized","check_out_of_order","check_type_unsupported","force_outcome_forbidden","attestation_invalid","platform_unregistered","app_attest_invalid","too_many_challenges","inference_unavailable","mobile_required","nni_locked","method_required","method_locked","document_nni_mismatch","media_content_type_not_allowed","media_too_large","media_key_invalid","media_key_forbidden","media_not_found","media_unreadable","media_session_invalid","idempotency_key_collision","idempotency_in_progress","idempotency_key_required","validation_error","internal_error","unknown_error","upload_failed","network_error","timeout","method_not_offered","nfc_outcome_not_accepted","contact_locked","identity_confirm_required","identity_confirm_locked"];ce=class extends Error{constructor(t){super(t.message),this.name="HostedApiError",this.status=t.status,this.code=t.code,t.retryAfterSeconds!==void 0&&(this.retryAfterSeconds=t.retryAfterSeconds)}}});function At(e){return(e.split(";")[0]??"").trim()}function di(e){if((typeof e=="object"&&e!==null?e.name:void 0)==="TimeoutError")return new ce({status:0,code:"timeout",message:"request timed out"});let n=e instanceof Error?e.message:String(e);return new ce({status:0,code:"network_error",message:`network request failed: ${n}`})}function Xc(e){return e!==null&&typeof e=="object"&&"success"in e&&"data"in e?e.data:e}async function jc(e){let t="unknown_error",n=`request failed (HTTP ${e.status})`,i=Number.NaN;try{let a=await e.json();if(a!==null&&typeof a=="object"){let s=a;typeof s.code=="string"&&s.code.length>0&&(t=s.code),typeof s.message=="string"&&s.message.length>0&&(n=s.message),typeof s.retryAfterSeconds=="number"&&(i=s.retryAfterSeconds)}}catch{}let o=e.headers.get("retry-after"),r=o===null?Math.floor(i):Number.parseInt(o,10);return new ce({status:e.status,code:t,message:n,...Number.isFinite(r)&&r>=0?{retryAfterSeconds:r}:{}})}function Zc(e){return new Promise(t=>setTimeout(t,e))}var Vc,Lr,Jc,Yc,Kc,qc,Wc,zc,pn,gi=J(()=>{"use strict";zt();st();Vc=6e4,Lr=4,Jc=3e4,Yc=9e5,Kc=200,qc=5,Wc=400;zc={liveness:"clipKey",face_match:"imageKey",doc_ocr:"imageKey"},pn=class{constructor(t){this.sessionId=null;this.bootstrap=null;this.captureNonces=[];this.captureFetch=null;this.apiOrigin=t.apiOrigin.replace(/\/+$/,""),this.sessionToken=t.sessionToken;let n=t.fetch;this.fetchImpl=(i,o)=>(n??globalThis.fetch).call(globalThis,i,o),this.requestTimeoutMs=t.requestTimeoutMs??Jc,this.retryAttempts=t.inProgressRetry?.attempts??qc,this.retryDelayMs=t.inProgressRetry?.delayMs??Wc}async getSession(){let t=await this.api("GET","/hosted/session");return this.sessionId=t.sessionId,t}async recordConsent(t){return this.api("POST","/hosted/consent",{body:{locale:t}})}async selectMethod(t){let n=await this.api("POST","/hosted/method",{body:{method:t}});return this.sessionId=n.sessionId,n}async selectContact(t){return this.api("POST","/hosted/contact",{body:{channel:t}})}async confirmIdentity(t){return this.api("POST","/hosted/identity/confirm",{body:{decision:t}})}async identityPortrait(){return this.api("GET","/hosted/identity/portrait",{blob:!0})}async presign(t,n,i){let o=await this.ensureSessionId(),r={kind:t,contentType:At(n),contentLength:i};return this.api("POST",`/sessions/${o}/media`,{body:r})}armCapture(t=2){this.fillCaptureNonces(t)}async presignCapture(t,n,i,o={}){let r=await this.ensureSessionId(),a=await this.takeCaptureNonce(),s=a===void 0?void 0:{nonce:a,...o.engine!==void 0?{engine:o.engine.slice(0,32)}:{},...o.durationMs!==void 0&&Number.isFinite(o.durationMs)?{captureMs:Math.min(36e5,Math.max(0,Math.round(o.durationMs)))}:{}},A={kind:t,contentType:At(n),contentLength:i,...s!==void 0?{capture:s}:{}};return this.api("POST",`/sessions/${r}/media`,{body:A})}async takeCaptureNonce(){let t=()=>{let n=Date.now();return this.captureNonces=this.captureNonces.filter(i=>i.expiresAt-Vc>n),this.captureNonces.shift()?.nonce};for(let n=0;n<2;n++){let i=t();if(i!==void 0)return i;await this.fillCaptureNonces(1)}return t()}fillCaptureNonces(t){return this.captureFetch??(this.captureFetch=(async()=>{try{let n=await this.ensureSessionId(),i=await this.api("POST",`/sessions/${n}/media/capture-nonces`,{body:{count:Math.min(Lr,Math.max(1,t))}}),o=Date.now()+Math.max(0,i.expiresIn)*1e3;for(let r of Array.isArray(i.nonces)?i.nonces:[])typeof r=="string"&&r.length>0&&this.captureNonces.push({nonce:r,expiresAt:o});this.captureNonces=this.captureNonces.slice(-Lr)}catch{}})().finally(()=>{this.captureFetch=null})),this.captureFetch}async uploadToSpaces(t,n,i){let o;try{o=await this.fetchImpl(t,{method:"PUT",headers:{"content-type":At(i)},body:n,signal:AbortSignal.timeout(Yc)})}catch(r){throw di(r)}if(!o.ok){let r=(await o.text().catch(()=>"")).slice(0,Kc);throw new ce({status:o.status,code:"upload_failed",message:`media upload failed (HTTP ${o.status})${r?`: ${r}`:""}`})}}async completeMedia(t){let n=await this.ensureSessionId();return this.api("POST",`/sessions/${n}/media/complete`,{body:{key:t}})}async submitCheck(t,n,i={}){let o=await this.ensureSessionId(),r={input:n,...i.forceOutcome!==void 0?{forceOutcome:i.forceOutcome}:{}};return this.api("POST",`/sessions/${o}/checks/${t}`,{body:r,...i.idempotencyKey!==void 0?{idempotencyKey:i.idempotencyKey}:{}})}async uploadAndSubmit(t,n,i,o={}){let r=At(n.contentType),a=await this.presign(n.kind,r,n.blob.size);await this.uploadToSpaces(a.uploadUrl,n.blob,r);let s=await this.completeMedia(a.key),A={...i,[zc[t]]:s.key};return this.submitCheck(t,A,o)}async ensureSessionId(){return this.sessionId!==null?this.sessionId:(this.bootstrap??(this.bootstrap=this.getSession().finally(()=>{this.bootstrap=null})),(await this.bootstrap).sessionId)}async api(t,n,i={}){let o=`${this.apiOrigin}/api/v2${n}`,r={"x-session-token":this.sessionToken};i.body!==void 0&&(r["content-type"]="application/json"),i.idempotencyKey!==void 0&&(r["x-idempotency-key"]=i.idempotencyKey);try{let a=qt.timezone();a!==void 0&&(r["sekyro-client-timezone"]=a)}catch{}try{let a=await qt.deviceHeader();a!==void 0&&(r["sekyro-client-device"]=a)}catch{}for(let a=0;;a++){let s;try{s=await this.fetchImpl(o,{method:t,headers:r,...i.body!==void 0?{body:JSON.stringify(i.body)}:{},cache:"no-store",signal:AbortSignal.timeout(this.requestTimeoutMs)})}catch(c){throw di(c)}if(s.ok){if(i.blob===!0)try{return await s.blob()}catch(l){throw di(l)}let c;try{c=await s.json()}catch{throw new ce({status:s.status,code:"unknown_error",message:`response body was not valid JSON (HTTP ${s.status})`})}return Xc(c)}let A=await jc(s);if(A.code==="idempotency_in_progress"&&a<this.retryAttempts){this.retryDelayMs>0&&await Zc(this.retryDelayMs);continue}throw A}}}});function Re(e){let t=e.methodChoice;if(t===void 0||!t.available||t.selected!==null)return null;let n=Ie(e)?.checkType;return n==="phone_otp"||n==="email_otp"?null:t}function Et(e){return e!==void 0&&(e.state==="pending"||e.state==="input_required")}function pe(e){return e.status!=="created"&&e.status!=="in_progress"}function Ie(e){return e.steps.find(t=>Et(t))}function Te(e,t){return e.steps.find(n=>n.checkType===t)}function mi(e,t){let n=t.steps.find(o=>o.checkType==="liveness"),i=t.steps.find(o=>o.checkType==="face_match");return Te(e,"face_match")?.state==="pending"&&(n?.state==="passed"||n?.state==="review")&&i!==void 0&&i.state!=="pending"&&i.state!=="skipped"}function Fr(e,t,n){let i=new Map(e.steps.map(a=>[a.checkType,a])),o=n==="liveness"&&mi(e,t),r=t.steps.map(a=>{let s=i.get(a.checkType),A=s?.attemptsRemaining??0,c={...s??{},checkType:a.checkType,state:a.state,attemptsRemaining:a.checkType===n||a.checkType==="face_match"&&o?Math.max(0,A-1):A};return a.reason!==void 0?c.reason=a.reason:delete c.reason,a.attemptsExhausted!==void 0?c.attemptsExhausted=a.attemptsExhausted:delete c.attemptsExhausted,c});return{...e,status:t.status,outcome:t.outcome,failureReason:t.failureReason,steps:r,expiresAt:t.expiresAt}}function ke(e,t){return t===void 0?{sessionId:e,status:"unavailable"}:{sessionId:e,status:"unavailable",reason:t}}function Ct(e,t,n){return n===void 0?{sessionId:e,status:t}:{sessionId:e,status:t,reason:n}}function We(e,t){let{sessionId:n}=e;switch(e.status){case"completed":return e.outcome==="approved"?{sessionId:n,status:"approved"}:e.outcome==="review"?Ct(n,"review",yt(e,"review")):Ct(n,"rejected",yt(e,"failed"));case"failed":{let r=Ct(n,"rejected",e.failureReason??yt(e,"failed"));return e.failureReason==="device_cooldown"&&e.retryAfter!==void 0&&(r.retryAfter=e.retryAfter),r}case"review_pending":return Ct(n,"review",yt(e,"review"));case"expired":return ke(n);case"created":case"in_progress":break;default:{let r=e.status;throw new Error(`mapSessionResult: unhandled status ${r}`)}}let i=e.steps.find(r=>el.has(r.checkType)&&r.state==="input_required"&&r.reason!==void 0);if(i?.reason==="mobile_required")return ke(n,"mobile_required");if(i?.reason!==void 0){let r=t.autoRetry&&$c.has(i.reason)&&i.attemptsRemaining>0;return{sessionId:n,status:r?"retry":"rejected",reason:i.reason,attemptsRemaining:i.attemptsRemaining}}let o=Ie(e);return o===void 0&&e.steps.some(r=>r.state==="review")?Ct(n,"review",yt(e,"review")):o?.checkType==="portrait_icao"?ke(n,"portrait_required"):ke(n)}function yt(e,t){return e.steps.find(n=>n.state===t&&n.reason!==void 0)?.reason}var $c,el,bt=J(()=>{"use strict";$c=new Set(["no_face","media_unreadable","clip_too_short","no_face_source","side_missing","unreadable","registry_unavailable","otp_mismatch","otp_expired","otp_send_failed","document_type_not_accepted","age_unverifiable","nationality_unreadable","liveness_inconclusive","match_inconclusive","document_authenticity","probe_not_from_liveness","chip_read_failed","chip_access_denied","chip_parse_failed","icao_pose","icao_eyes","icao_mouth","icao_occlusion","icao_lighting","icao_background","icao_resolution","portrait_not_from_liveness","nni_recheck","device_integrity_failed","eid_identifier_invalid","eid_code_invalid","eid_code_expired","eid_unavailable","eid_resend_too_soon"]);el=new Set(["liveness","face_match"])});function Ne(e,t,n,i,o){return e.presignCapture!==void 0?e.presignCapture(t,n,i,o):e.presign(t,n,i)}function Nr(e){return{...e?.engine!==void 0?{engine:e.engine}:{},...e?.clipMs!==void 0?{durationMs:e.clipMs}:{}}}function ul(e){let t=e.steps.findIndex(i=>i.checkType==="liveness");return t<0?!1:e.steps.slice(t+1).find(i=>Et(i))?.checkType==="face_match"}async function ct(e,t,n={}){let i=e.uuid(),o=!1,r=!1,a=0,s=0;for(;;)try{return await t(e.client,i)}catch(A){if(A instanceof Qt){if(r)throw A;r=!0,n.onAttestationInvalid?.(),i=e.uuid();continue}if(!(A instanceof ce))throw A;if(A.code==="consent_required"&&!o){o=!0,await e.ensureConsent({force:!0}),i=e.uuid();continue}if(A.code==="attestation_invalid"&&!r){r=!0,n.onAttestationInvalid?.(),i=e.uuid();continue}if(A.code==="inference_unavailable"&&s<rl){s+=1;let c=Math.min(A.retryAfterSeconds??al,sl);e.onBusy?.({attempt:s,retryAfterSeconds:c}),await e.sleep(c*1e3),n.onAttestationInvalid?.(),i=e.uuid();continue}if(cl.has(A.code)&&a<nl){a+=1;let c=A.retryAfterSeconds!==void 0?A.retryAfterSeconds*1e3:void 0;await e.sleep(c!==void 0?Math.min(c,ol):il);continue}throw A}}async function Gr(e){let{artifacts:t}=e,n=t.clip,i=At(t.clipMime??"");if(t.degraded==="NO_RECORDER"||n===void 0||!tl.includes(i))return{kind:"unavailable",reason:"no_recorder"};e.client.armCapture?.(2);let o=gl(e,t.keyframe),r=ml(e,n,i,o),a=hl(e,o),s=!1,A=!1,c=!0,l=0;for(;;){if(e.isCancelled())return{kind:"cancelled"};let d=e.getView();if(pe(d))return{kind:"settled"};let m=Ie(d)?.checkType,h=m==="liveness"&&!s?"liveness":m==="face_match"&&!A&&c?"face_match":null;if(h===null)return{kind:"settled"};if(h==="liveness"&&t.captureChannel==="desktop"&&Te(d,"liveness")?.requiresMobile===!0)return{kind:"unavailable",reason:"mobile_required"};try{if(h==="liveness"){s=!0;let u=await r();if(e.isCancelled())return{kind:"cancelled"};A=mi(d,u),e.applySubmit(u,"liveness");let f=Te(e.getView(),"liveness")?.state;c=f===void 0||dl.has(f)}else{A=!0;let u=await a();if(e.isCancelled())return{kind:"cancelled"};e.applySubmit(u,"face_match")}}catch(u){if(e.isCancelled()||u instanceof Bt)return{kind:"cancelled"};let f=fl(u);if(f.kind!=="resync"||l>=Al)return f;l+=1,await e.refreshView()}}}function gl(e,t){let n=null,i=null,o=()=>n!==null?Promise.resolve(n):(i??(i=(async()=>{let r=await Ne(e.client,"image",Pr,t.size,Nr(e.artifacts));return await e.client.uploadToSpaces(r.uploadUrl,t,Pr),n=(await e.client.completeMedia(r.key)).key,e.onKeyframePromoted?.(n),n})().finally(()=>{i=null})),i);return{ensure:o,attempt:()=>o().catch(()=>null),current:()=>n}}function ml(e,t,n,i){let o=null,r,a=null;return()=>ct(e,async(s,A)=>{if(o===null||r===void 0){if(e.isCancelled())throw new Bt;r===void 0&&!ul(e.getView())&&(r=null),e.onPhase("uploading");let[c,l]=await Promise.all([o!==null?Promise.resolve(o):(async()=>{let d=await Ne(s,"clip",n,t.size,Nr(e.artifacts));return await s.uploadToSpaces(d.uploadUrl,t,n),(await s.completeMedia(d.key)).key})(),r!==void 0?Promise.resolve(r===null?null:r.imageKey):i.attempt()]);o=c,r===void 0&&(r=l===null?null:{imageKey:l})}if(a===null)try{a=await e.getAttestation()}catch(c){throw new Qt(c instanceof Error?c.message:String(c))}return e.onPhase("checking"),s.submitCheck("liveness",{clipKey:o,attestation:a,captureChannel:e.artifacts.captureChannel,capture:pl(e.artifacts),...r!==null?{faceMatch:r}:{}},{idempotencyKey:A})},{onAttestationInvalid:()=>{a=null}})}function hl(e,t){return()=>ct(e,async(n,i)=>{if(t.current()===null){if(e.isCancelled())throw new Bt;e.onPhase("uploading")}let o=await t.ensure();return e.onPhase("checking"),n.submitCheck("face_match",{imageKey:o},{idempotencyKey:i})})}function pl(e){return{...e.engine!==void 0?{engine:e.engine}:{},width:e.width,height:e.height,...e.clipMs!==void 0?{clipMs:e.clipMs}:{},...e.cameraReadyMs!==void 0?{cameraReadyMs:e.cameraReadyMs}:{},...e.faceAcquireMs!==void 0?{faceAcquireMs:e.faceAcquireMs}:{},...e.captureMs!==void 0?{captureMs:e.captureMs}:{}}}function fl(e){if(e instanceof Qt)return{kind:"unavailable",reason:"attestation"};if(e instanceof ce){if(e.code==="attestation_invalid")return{kind:"unavailable",reason:"attestation"};if(e.code==="method_required")return{kind:"unavailable",reason:"method_required"};if(e.code==="inference_unavailable")return{kind:"unavailable",reason:"inference_unavailable"};if(e.code==="mobile_required")return{kind:"unavailable",reason:"mobile_required"};if(ll.has(e.code))return{kind:"resync"}}return{kind:"unavailable",reason:"network"}}var tl,Pr,nl,il,ol,rl,al,sl,Al,cl,ll,Bt,Qt,dl,lt=J(()=>{"use strict";st();gi();bt();tl=["video/webm","video/mp4"],Pr="image/jpeg",nl=2,il=1e3,ol=1e4,rl=3,al=10,sl=30,Al=3,cl=new Set(["network_error","timeout","upload_failed","unknown_error","rate_limit_exceeded"]),ll=new Set(["session_not_active","check_not_found","check_already_finalized","check_out_of_order","identity_confirm_required"]),Bt=class extends Error{constructor(){super("verification destroyed"),this.name="FlowCancelledError"}};Qt=class extends Error{constructor(t){super(t),this.name="AttestationError"}};dl=new Set(["passed","review","processing","skipped"])});var Vr={};ue(Vr,{TURNSTILE_EXECUTE_TIMEOUT_MS:()=>Il,TURNSTILE_SCRIPT_SRC:()=>Hr,executeTurnstile:()=>yl,loadTurnstile:()=>Ur,resetTurnstileForTests:()=>Cl});function Or(){return window.turnstile}function Cl(){St=null}function Ur(){return St??(St=new Promise((e,t)=>{let n=Or();if(n){e(n);return}let i=document.createElement("script");i.src=Hr,i.async=!0,i.onload=()=>{let o=Or();o?e(o):(St=null,t(new Error("Turnstile script loaded but exposed no API")))},i.onerror=()=>{St=null,i.remove(),t(new Error("Turnstile script failed to load"))},document.head.appendChild(i)})),St}function hi(){return new Error("Turnstile challenge aborted")}async function yl(e,t={}){let n=t.timeoutMs??3e4,i=t.signal;if(i?.aborted)throw hi();let o=await Ur();if(i?.aborted)throw hi();let r=document.createElement("div");document.body.appendChild(r);let a,s,A;try{return await new Promise((c,l)=>{if(s=setTimeout(()=>l(new Error(`Turnstile challenge timed out (${n} ms)`)),n),i!==void 0&&(A=()=>l(hi()),i.addEventListener("abort",A,{once:!0})),a=o.render(r,{sitekey:e,execution:"execute",appearance:"execute",callback:c,"error-callback":d=>{l(new Error(`Turnstile challenge failed${d?` (${d})`:""}`))}}),a===void 0){l(new Error("Turnstile render returned no widget id"));return}o.execute(a)})}finally{if(clearTimeout(s),i!==void 0&&A!==void 0&&i.removeEventListener("abort",A),a!==void 0)try{o.remove(a)}catch{}r.remove()}}var Hr,Il,St,Jr=J(()=>{"use strict";Hr="https://challenges.cloudflare.com/turnstile/v0/api.js",Il=3e4;St=null});function Yr(e){return pi[e==="card"?"ID-1":e]}function fn(e,t){return El[e].some(n=>Math.abs(t-pi[n].center)<=pi[n].tolerance)}function Kr(e){let t=Bl.find(n=>n.docType===e);return t===void 0||t.format==="ID-1"?"card":t.format}var pi,El,bl,Bl,wt=J(()=>{"use strict";pi={"ID-1":{center:1.586,tolerance:.15},"ID-2":{center:1.419,tolerance:.12},"ID-3":{center:1.42,tolerance:.2}},El={"ID-1":["ID-1"],"ID-2":["ID-2"],"ID-3":["ID-3"],card:["ID-1","ID-2"]};bl=[{docType:"carte_identite",format:"ID-1",sides:["recto","verso"],mrz:"td1",portraitSide:"recto",aspectRatio:1.586,identifierSource:"mrz"},{docType:"passport",format:"ID-3",sides:["single"],mrz:"td3",portraitSide:"single",aspectRatio:1.42,identifierSource:"mrz"}],Bl=[...bl,{docType:"residence_permit",format:"ID-1",sides:["recto","verso"],mrz:"td1",portraitSide:"recto",aspectRatio:1.586,identifierSource:"mrz"}]});function Sl(e){let{width:t,height:n,data:i}=e;if(t<16||n<16)return-1;let o=new Uint8Array(t*n);for(let a=0,s=0;a<o.length;a+=1,s+=4)o[a]=Math.round(.299*(i[s]??0)+.587*(i[s+1]??0)+.114*(i[s+2]??0));let r=-1;for(let[a,s]of Ql){let A=new Uint32Array(256),c=new Float64Array(256),l=0;for(let p=1;p<n-1;p+=1){let g=p*t,C=(p+s)*t,w=(p-s)*t;for(let Q=1;Q<t-1;Q+=1){let k=o[C+Q+a]??0,I=o[w+Q-a]??0,b=Math.abs(k-I);A[b]=(A[b]??0)+1,c[b]=(c[b]??0)+Math.abs(k+I-2*(o[g+Q]??0)),l+=1}}let d=Math.max(1,Math.floor(l/20)),m=0,h=0,u=0;for(let p=255;p>=0&&m<d;p-=1){let g=A[p]??0;m+=g,h+=g*p,u+=c[p]??0}if(h===0)return 0;let f=u/h;r=r<0?f:Math.min(r,f)}return r}function kt(e,t,n,i=wl){if(e===null||t.width<=0||t.height<=0)return null;let o=[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft],r=n.width/t.width,a=n.height/t.height,s=Math.min(...o.map(g=>g.x))*r,A=Math.max(...o.map(g=>g.x))*r,c=Math.min(...o.map(g=>g.y))*a,l=Math.max(...o.map(g=>g.y))*a,d=(A-s)*i,m=(l-c)*i,h=Math.max(0,Math.floor(s-d)),u=Math.max(0,Math.floor(c-m)),f=Math.min(n.width,Math.ceil(A+d)),p=Math.min(n.height,Math.ceil(l+m));return f-h<16||p-u<16?null:{x:h,y:u,width:f-h,height:p-u}}function In(e,t){let n=t??{x:0,y:0,width:e.width,height:e.height},i=Math.min(1,1e3/Math.max(n.width,n.height)),o=Math.max(1,Math.round(n.width*i)),r=Math.max(1,Math.round(n.height*i)),a=document.createElement("canvas");a.width=o,a.height=r;try{let s=a.getContext("2d",{willReadFrequently:!0});return s===null?-1:(s.imageSmoothingQuality="high",s.drawImage(e,n.x,n.y,n.width,n.height,0,0,o,r),Sl(s.getImageData(0,0,o,r)))}catch{return-1}finally{a.width=0,a.height=0}}var Ql,wl,fi=J(()=>{"use strict";Ql=[[1,0],[0,1],[1,1],[1,-1]];wl=.06});function Ml(e){let{deviceMemory:t,effectiveType:n,saveData:i,downlinkMbps:o,sourceLongEdge:r}=e,a=i===!0||n==="slow-2g"||n==="2g"||o!=null&&o>0&&o<1,s=t!=null&&t<=2,A=n==="4g"||o!=null&&o>=5,c=t!=null&&t>=6,l;a||s?l="low":A&&c?l="good":l="mid";let d=kl[l],m=r&&r>0?Math.min(d.maxLongEdge,r):d.maxLongEdge;return{tier:l,...d,maxLongEdge:m}}function qr(e){let t={};try{let n=navigator;typeof n.deviceMemory=="number"&&(t.deviceMemory=n.deviceMemory);let i=n.connection;i&&(t.effectiveType=i.effectiveType,t.saveData=i.saveData,t.downlinkMbps=i.downlink)}catch{}return typeof e=="number"&&e>0&&(t.sourceLongEdge=e),Ml(t)}function xl(e,t,n){let i=Math.min(1,Math.max(0,(e-.28)/.21999999999999997)),o=(t+n)/2;return Math.max(t,n-i*(n-o))}function Dl(e,t,n){let i=Math.max(e,t),o=i>0?Math.min(1,n/i):1;return{width:Math.max(1,Math.round(e*o)),height:Math.max(1,Math.round(t*o))}}async function vl(e,t){let n=t.startQ,i=await e(n);for(let o=0;o<4&&!(i.size<=t.budgetBytes||n<=t.qMin);o++)n=Math.max(t.qMin,n-.08),i=await e(n);return{blob:i,quality:n}}async function Wr(e,t,n,i,o){if(t<=0||n<=0)return null;let{width:r,height:a}=Dl(t,n,i.maxLongEdge),s=document.createElement("canvas");s.width=r,s.height=a;let A=s.getContext("2d");if(!A)return null;A.drawImage(e,0,0,r,a);let c=h=>new Promise((u,f)=>{s.toBlob(p=>p?u(p):f(new Error("canvas toBlob returned null")),"image/jpeg",h)}),l=xl(o,i.qMin,i.qMax),{blob:d,quality:m}=await vl(c,{startQ:l,qMin:i.qMin,budgetBytes:i.payloadTargetBytes}).finally(()=>{s.width=0,s.height=0});if(d.size>5242880)throw new Error("encoded document exceeds the 5242880-byte media cap");return{blob:d,quality:m,width:r,height:a}}var kl,zr=J(()=>{"use strict";kl={low:{maxLongEdge:1920,payloadTargetBytes:7e5,qMin:.7,qMax:.92},mid:{maxLongEdge:2240,payloadTargetBytes:12e5,qMin:.7,qMax:.92},good:{maxLongEdge:2560,payloadTargetBytes:16e5,qMin:.7,qMax:.92}}});async function Xr(e){let t=qr(Math.max(e.width,e.height)),n=await Wr(e,e.width,e.height,t,.5);if(n===null)throw new Error("canvas encode unavailable");return{blob:n.blob,width:n.width,height:n.height}}var jr=J(()=>{"use strict";zr()});function Ci(e,t){return{layout:e,phase:"framing",captured:{},pending:[],lastCaptureAt:t,lastReportAt:t,manualShutter:!1,restPhase:"framing",readSides:[],needFlip:!1,flipped:!1,flipTimeoutSpent:!1,timeoutCapture:!1,lastShotByTimeout:!1}}function Ii(e,t){return e.lastCaptureAt>=0&&e.lastReportAt>=0?e:{...e,lastCaptureAt:e.lastCaptureAt<0?t:e.lastCaptureAt,lastReportAt:e.lastReportAt<0?t:e.lastReportAt}}function Rl(e,t,n){if(e.phase==="result")return{...e,lastReportAt:n};let i=!t.present||e.captureArea!==void 0&&t.areaFrac<.6*e.captureArea,{flipped:o,awaySince:r}=e;i&&(r=r??n),r!==void 0&&n-r>=250&&(o=!0),i||(r=void 0);let a=e.flipTimeoutSpent&&!(o&&!e.flipped),s={...e,lastReportAt:n,flipped:o,awaySince:r,flipTimeoutSpent:a,lastArea:t.areaFrac};if(!$r(e))return s;if(e.needFlip&&!o){if(!t.ready)return{...s,phase:e.restPhase,goodSince:void 0};let A=e.lastShot!==void 0&&e.pending.includes(e.lastShot);if(a||A)return{...s,goodSince:void 0,phase:e.restPhase};let c=e.goodSince??n;return n-c>=1800?{...s,goodSince:c,phase:"capturing",flipTimeoutSpent:!0,timeoutCapture:!0}:{...s,goodSince:c,phase:e.restPhase}}return t.ready?{...s,phase:"capturing",goodSince:e.goodSince??n}:{...s,goodSince:void 0,phase:t.locking?"locking":e.restPhase}}function Tl(e,t){if(!$r(e)||e.manualShutter)return e;let n=t-e.lastReportAt>=2e3,i=t-e.lastCaptureAt>=6e3;return n||i?{...e,manualShutter:!0}:e}function _l(e,t,n){let i=e.layout==="singlePage",o=i?{recto:t}:e.captured,r=i?[]:[...e.pending,t],a={...e,captured:o,pending:r,lastShot:t,lastCaptureAt:n,lastReportAt:-1,manualShutter:!1,goodSince:void 0,notice:void 0,awaySince:void 0,flipped:!1,lastShotByTimeout:e.timeoutCapture,timeoutCapture:!1,captureArea:e.lastArea};return i||yi({captured:o,pending:r})>=2?{...a,phase:"reading",restPhase:"framing",current:void 0,needFlip:!1}:{...a,phase:"flipCue",restPhase:"flipCue",current:void 0,needFlip:!0}}function ea(e,t,n){return e.pending.includes(t)?{...e,pending:e.pending.filter(i=>i!==t),lastShot:e.lastShot===t?void 0:e.lastShot,phase:e.phase==="capturing"?e.phase:"flipCue",restPhase:"flipCue",current:Zr(n),needFlip:!0,flipTimeoutSpent:!0,goodSince:void 0,manualShutter:!0,notice:"same_face",lastCaptureAt:-1,lastReportAt:-1}:e}function Ll(e,t,n){if(!e.pending.includes(t))return e;if(e.captured[n]!==void 0)return ea(e,t,n);let i=e.pending.filter(A=>A!==t),o={...e,pending:i,captured:{...e.captured,[n]:t}};if(yi(o)!==1||e.layout==="singlePage")return o;let r=Zr(n),a=r==="recto"&&e.restPhase==="reaskRecto"?"reaskRecto":"flipCue",s=e.phase==="flipCue"||e.phase==="reaskRecto"||e.phase==="framing";return{...o,restPhase:a,current:r,phase:s?a:e.phase}}function Fl(e,t){let n=t.id??e.captured[t.side],i={...e.captured};(t.id===void 0||i[t.side]===t.id)&&delete i[t.side];let o=e.pending.filter(c=>c!==n),r=e.layout==="twoSided"&&yi({captured:i,pending:o})>0,a=e.lastShotByTimeout||n===e.lastShot!==e.flipped,s=r&&!a,A=s?t.side==="recto"?"reaskRecto":"flipCue":"framing";return{...e,captured:i,pending:o,readSides:e.readSides.filter(c=>c!==t.side),lastShot:e.lastShot===n?void 0:e.lastShot,notice:t.issue,goodSince:void 0,manualShutter:!1,phase:A,restPhase:A,current:t.side,needFlip:s,flipped:!1,flipTimeoutSpent:!1,awaySince:void 0,lastCaptureAt:-1,lastReportAt:-1}}function ta(e,t){switch(t.type){case"report":return Rl(Ii(e,t.at),t.report,t.at);case"tick":return Tl(Ii(e,t.at),t.at);case"captured":return _l(Ii(e,t.at),t.id,t.at);case"captureFailed":return{...e,phase:e.restPhase,goodSince:void 0,lastCaptureAt:t.at,manualShutter:!0,timeoutCapture:!1};case"classified":return Ll(e,t.id,t.side);case"duplicate":return ea(e,t.id,t.side);case"readOk":{let n=e.readSides.includes(t.side)?e.readSides:[...e.readSides,t.side],i=["recto","verso"].filter(r=>e.captured[r]!==void 0),o=e.phase==="reading"&&e.pending.length===0&&i.every(r=>n.includes(r));return{...e,readSides:n,flipTimeoutSpent:!1,phase:o?"result":e.phase}}case"readFailed":return Fl(e,t);case"clockRestart":return e.lastCaptureAt<0&&e.lastReportAt<0&&e.awaySince===void 0?e:{...e,awaySince:void 0,lastCaptureAt:-1,lastReportAt:-1};case"retake":return{...Ci(e.layout,-1),lastCaptureAt:-1,lastReportAt:-1};default:return e}}var Zr,$r,yi,na=J(()=>{"use strict";Zr=e=>e==="recto"?"verso":"recto",$r=e=>e.phase==="framing"||e.phase==="locking"||e.phase==="flipCue"||e.phase==="reaskRecto",yi=e=>(e.captured.recto!==void 0?1:0)+(e.captured.verso!==void 0?1:0)+e.pending.length});var oa={};ue(oa,{MRZ_BAND_DEFAULTS:()=>ia,detectMrzBand:()=>Ei});function Ei(e,t={}){let n={...ia,...t},{data:i,width:o,height:r}=e;if(o<32||r<32)return null;let a=new Array(r).fill(!1),s=new Float32Array(r),A=new Int32Array(r).fill(o),c=new Int32Array(r).fill(-1),l=o/Cn,d=new Array(Cn);for(let I=0;I<r;I++){let b=0;d.fill(!1);let v=I*o*4,O=.299*(i[v]??0)+.587*(i[v+1]??0)+.114*(i[v+2]??0);for(let q=1;q<o;q++){let Z=v+q*4,R=.299*(i[Z]??0)+.587*(i[Z+1]??0)+.114*(i[Z+2]??0);Math.abs(R-O)>=n.EDGE_LUMA_DELTA&&(b+=1,d[Math.min(Cn-1,Math.floor(q/l))]=!0,q<A[I]&&(A[I]=q),q>c[I]&&(c[I]=q)),O=R}s[I]=b/o;let L=d.filter(Boolean).length/Cn;a[I]=s[I]>=n.MIN_ROW_DENSITY&&L>=n.MIN_COLUMN_COVERAGE&&c[I]-A[I]>=n.MIN_WIDTH_FRAC*o}let m=null,h=-1,u=-1,f=0,p=I=>{if(h<0)return;let b=I-h+1;b>=n.MIN_HEIGHT_FRAC*r&&b<=n.MAX_HEIGHT_FRAC*r&&f>=4&&(m===null||f>m.rows)&&(m={top:h,bottom:I,rows:f}),h=-1,f=0};for(let I=0;I<r;I++)a[I]&&(h<0?h=I:I-u>n.ROW_MERGE_GAP&&(p(u),h=I),u=I,f+=1);if(p(u),m===null)return null;let g=m,C=o,w=-1,Q=0,k=0;for(let I=g.top;I<=g.bottom;I++)a[I]&&(A[I]<C&&(C=A[I]),c[I]>w&&(w=c[I]),Q+=s[I],k+=1);return w-C<n.MIN_WIDTH_FRAC*o?null:{x:C,y:g.top,width:w-C,height:g.bottom-g.top+1,density:k>0?Q/k:0}}var ia,Cn,bi=J(()=>{"use strict";ia=Object.freeze({EDGE_LUMA_DELTA:40,MIN_ROW_DENSITY:.08,MIN_COLUMN_COVERAGE:.6,MIN_WIDTH_FRAC:.55,MIN_HEIGHT_FRAC:.02,MAX_HEIGHT_FRAC:.16,ROW_MERGE_GAP:18}),Cn=12});function Pl(e,t,n=!1){let i=e(t);return i===null?"recto":!n||i.y+i.height/2>=t.height/2?"verso":"recto"}async function Nl(e,t=!1){let{detectMrzBand:n}=await Promise.resolve().then(()=>(bi(),oa));return Pl(n,e,t)}async function Bi(e,t=480,n,i=n!=null){let o=n??{x:0,y:0,width:e.width,height:e.height},r=Math.max(1,Math.round(o.height/o.width*t)),a=document.createElement("canvas");a.width=t,a.height=r;try{let s=a.getContext("2d");return s===null?"recto":(s.drawImage(e,o.x,o.y,o.width,o.height,0,0,t,r),await Nl(s.getImageData(0,0,t,r),i))}finally{a.width=0,a.height=0}}var ra=J(()=>{"use strict"});function Gl(e,t){let n=e.lineBoxes;if(n.length===0)return{lineCount:0,detected:!1,fill:0,offsetX:0,offsetY:0,centers:[]};let i=Math.min(...n.map(s=>s[0])),o=Math.max(...n.map(s=>s[0]+s[2])),r=Math.min(...n.map(s=>s[1])),a=Math.max(...n.map(s=>s[1]+s[3]));return{lineCount:n.length,detected:n.length>=t.minLines,fill:o-i,offsetX:(i+o)/2-.5,offsetY:(r+a)/2-.5,centers:n.map(s=>[s[0]+s[2]/2,s[1]+s[3]/2])}}function Ol(e,t){if(e.centers.length===0||t.centers.length===0)return Number.POSITIVE_INFINITY;let n=0;for(let[i,o]of t.centers){let r=Number.POSITIVE_INFINITY;for(let[a,s]of e.centers)r=Math.min(r,Math.hypot(i-a,o-s));n+=r}return n/t.centers.length}var Qi,yn,aa=J(()=>{"use strict";Qi=Object.freeze({minLines:4,fillMin:.55,fillMax:.98,offsetMax:.12,steadyFillDelta:.04,steadyOffsetDelta:.03,layoutShiftMax:.025,lineCountDelta:1,lockMs:600,steadyMs:900,minFrames:3});yn=class{constructor(t=Qi){this.t=t;this.last=null;this.goodSince=null;this.steadySince=null;this.frames=0}offer(t,n,i={glareOk:!0,sharpOk:!0}){let o=this.t,r=Gl(t,o),a=this.last;this.last=r;let s=r.fill>=o.fillMin&&r.fill<=o.fillMax,A=Math.abs(r.offsetX)<=o.offsetMax&&Math.abs(r.offsetY)<=o.offsetMax,c=a!==null&&a.detected&&Math.abs(r.lineCount-a.lineCount)<=o.lineCountDelta&&Ol(a,r)<=o.layoutShiftMax,l=r.detected&&i.glareOk&&i.sharpOk&&s&&c&&a!==null&&Math.abs(r.fill-a.fill)<=o.steadyFillDelta&&Math.abs(r.offsetX-a.offsetX)<=o.steadyOffsetDelta&&Math.abs(r.offsetY-a.offsetY)<=o.steadyOffsetDelta,d=l&&A,m=r.detected?i.glareOk?r.fill<o.fillMin?"closer":r.fill>o.fillMax?"farther":A?i.sharpOk?void 0:"blurry":"center":"glare":void 0;return l?(this.frames++,this.steadySince??(this.steadySince=n),this.goodSince=d?this.goodSince??n:null,(this.goodSince!==null&&n-this.goodSince>=o.lockMs||n-this.steadySince>=o.steadyMs)&&this.frames>=o.minFrames?{state:"locked"}:{state:"locking",...m?{hint:m}:{}}):(this.goodSince=null,this.steadySince=null,this.frames=r.detected?1:0,{state:r.detected?"locking":"searching",...m?{hint:m}:{}})}reset(){this.last=null,this.goodSince=null,this.steadySince=null,this.frames=0}}});var En,sa=J(()=>{"use strict";En=class{constructor(t=2){this.stableReads=t;this.last=null;this.run=0}offer(t){return t===null?(this.reset(),!1):(this.run=t===this.last?this.run+1:1,this.last=t,this.run>=this.stableReads)}reset(){this.last=null,this.run=0}}});function Ul(e){return e<=250?"fast":e<=600?"mid":"slow"}function Aa(e,t,n){let i=e.y+e.h*t,o=Math.min(n,e.y+e.h*1.05);return{x:e.x,y:i,w:e.w,h:Math.max(1,o-i)}}var wi,ki,Hl,Si,bn,Bn=J(()=>{"use strict";aa();sa();wi=Object.freeze({...Qi,minIntervalMs:150,maxWidthPx:480,detectorLimit:960,searchTimeoutMs:12e3}),ki=Object.freeze({detectorLimit:960,bandMaxWidthPx:1280,minBandWidthPx:900,bandTop:.55,minIntervalMs:150,stableReads:2,profileReads:5,maxReadMs:1200,searchTimeoutMs:12e3}),Hl=(e,t,n)=>createImageBitmap(e,Math.round(t.x),Math.round(t.y),Math.max(1,Math.round(t.w)),Math.max(1,Math.round(t.h)),{resizeWidth:Math.max(1,Math.round(Math.min(t.w,n))),resizeQuality:"high"}),Si=(e,t)=>{if(e.length===0)return 0;let n=[...e].sort((i,o)=>i-o);return n[Math.min(n.length-1,Math.floor(n.length*t))]};bn=class{constructor(t){this.o=t;this.engine=null;this.gen=0;this.inFlight=!1;this.lastReadAt=Number.NEGATIVE_INFINITY;this.firstSeen=null;this.reads=0;this.times=[];this.mrzState={state:"searching"};this.lockState={state:"searching"};this.fallback=null;this.lockOff=!1;this.lockError=!1;this.fired=null;this.valid=null;this.faceMode="off";this.disabled=!1;this.crop=t.crop??Hl,this.mrzGate=new En(t.liveMrz?.stableReads??2),this.lockGate=new yn(t.textLock??wi)}setEngine(t){this.engine=t}get bandTop(){return this.o.liveMrz?.bandTop??ki.bandTop}get hasEngine(){return this.engine!==null&&!this.disabled}reset(){this.gen++,this.inFlight=!1,this.lastReadAt=Number.NEGATIVE_INFINITY,this.firstSeen=null,this.reads=0,this.times=[],this.mrzGate.reset(),this.lockGate.reset(),this.mrzState={state:"searching"},this.lockState={state:"searching"},this.fallback=null,this.lockOff=!1,this.lockError=!1,this.fired=null,this.valid=null,this.faceMode="off"}rearmFace(){this.gen++,this.inFlight=!1,this.lastReadAt=Number.NEGATIVE_INFINITY,this.mrzGate.reset(),this.lockGate.reset(),this.fired=null,this.valid=null,this.fallback===null&&(this.mrzState={state:"searching"}),this.lockOff||(this.lockState={state:"searching"})}liveCapture(){return this.fired?.via==="live_mrz"?this.valid:null}modeFor(t){return this.engine===null||this.disabled?"off":t.mrzFace&&this.o.liveMrz!==null&&this.fallback===null?"live_mrz":this.o.textLock!==null&&!this.lockOff?"text_lock":"off"}tick(t){let n=this.modeFor(t);return n!=="off"&&(this.faceMode=n),this.fired!==null?{ready:!0,via:this.fired.via,suspendQuality:this.fired.via==="live_mrz",mode:n,...this.states()}:n==="live_mrz"?this.liveTick(t,this.o.liveMrz):n==="text_lock"?this.lockTick(t,this.o.textLock):{ready:!1,suspendQuality:!1,mode:n,...this.states()}}states(){return{...this.faceMode==="live_mrz"||this.fallback!==null?{mrz:this.fallback!==null?{state:"fallback",reason:this.fallback}:this.mrzState}:{},...this.faceMode==="text_lock"?{lock:this.lockState}:{}}}canRead(t,n){let i=this.engine;return i!==null&&!this.inFlight&&!i.busy&&t-this.lastReadAt>=n}fall(t){this.fallback=t,this.mrzGate.reset()}liveTick(t,n){let i=()=>this.fallback!==null?{ready:!1,suspendQuality:!1,mode:"live_mrz",mrz:{state:"fallback",reason:this.fallback}}:{ready:!1,suspendQuality:!0,mode:"live_mrz",mrz:this.mrzState};if(!t.present||t.band===null)return this.mrzGate.reset(),this.mrzState={state:"searching"},i();if(this.firstSeen??(this.firstSeen=t.atMs),t.atMs-this.firstSeen>n.searchTimeoutMs)return this.fall("timeout"),i();if(t.band.w<n.minBandWidthPx)return t.card!==null&&t.card.w<n.minBandWidthPx?(this.fall("unsupported"),i()):(this.mrzState={state:"reading",coach:t.portrait?"turnSideways":"moveCloser"},{ready:!1,suspendQuality:!1,mode:"live_mrz",mrz:this.mrzState});if(!this.canRead(t.atMs,n.minIntervalMs))return i();this.inFlight=!0,this.lastReadAt=t.atMs;let o=this.gen,r=this.engine,a=t.glareOk?t.sharpOk?void 0:"holdStill":"glare";return this.crop(t.video,t.band,n.bandMaxWidthPx).then(s=>r.bandRead(s,n.detectorLimit)).then(s=>{if(o===this.gen){if(this.reads++,this.times.push(s.ms),this.times.length>8&&this.times.shift(),this.reads>=n.profileReads&&Si(this.times,.5)>n.maxReadMs)return this.fall("slow");if(this.mrzGate.offer(s.valid?s.digest??null:null)&&s.format&&s.digest){this.valid={format:s.format,...s.documentCode!==void 0?{documentCode:s.documentCode}:{},digest:s.digest,lineCount:s.lineCount,framesToValid:this.reads,msToValid:Math.round(t.atMs-(this.firstSeen??t.atMs))},this.mrzState={state:"valid",format:s.format},this.fired={via:"live_mrz",at:t.atMs};return}this.mrzState={state:"reading",...a?{coach:a}:{},...s.format?{format:s.format}:{}}}}).catch(()=>{o===this.gen&&this.fall("error")}).finally(()=>{o===this.gen&&(this.inFlight=!1)}),i()}lockTick(t,n){let i=()=>({ready:!1,suspendQuality:!1,mode:"text_lock",lock:this.lockState,...this.fallback!==null?{mrz:{state:"fallback",reason:this.fallback}}:{}});if(!t.present||t.card===null)return this.lockGate.reset(),this.lockState={state:"searching"},i();if(this.firstSeen??(this.firstSeen=t.atMs),t.atMs-this.firstSeen>n.searchTimeoutMs)return this.lockOff=!0,i();if(!this.canRead(t.atMs,n.minIntervalMs))return i();this.inFlight=!0,this.lastReadAt=t.atMs;let o=this.gen,r=this.engine,a={glareOk:t.glareOk,sharpOk:t.sharpOk};return this.crop(t.video,t.card,n.maxWidthPx).then(s=>r.layoutRead(s,n.detectorLimit)).then(s=>{if(o!==this.gen)return;this.reads++,this.times.push(s.ms),this.times.length>8&&this.times.shift();let A=this.lockGate.offer(s,t.atMs,a);this.lockState=A.state==="locked"?{state:"locked"}:{state:A.state,...A.hint?{hint:A.hint}:{}},A.state==="locked"&&(this.fired={via:"text_lock",at:t.atMs})}).catch(()=>{o===this.gen&&(this.lockOff=!0,this.lockError=!0)}).finally(()=>{o===this.gen&&(this.inFlight=!1)}),i()}disable(){this.disabled=!0,this.reset()}report(t,n,i){let o=this.faceMode;if(o==="off")return null;let r=Si(this.times,.5),a={capture:t,mode:o,reads:this.reads,...this.times.length>0?{readP50Ms:Math.round(r),readP90Ms:Math.round(Si(this.times,.9)),deviceClass:Ul(r)}:{}};return o==="live_mrz"?this.fired?.via==="live_mrz"&&this.valid!==null&&n==="live_mrz"?{...a,outcome:"valid",format:this.valid.format,framesToValid:this.valid.framesToValid,msToValid:this.valid.msToValid}:this.fallback!==null?{...a,outcome:this.fallback}:{...a,outcome:i-(this.firstSeen??i)>=(this.o.liveMrz?.searchTimeoutMs??1/0)?"timeout":"off"}:this.fired?.via==="text_lock"?{...a,outcome:"locked",framesToLock:Math.max(1,this.reads),msToLock:Math.round(this.fired.at-(this.firstSeen??this.fired.at))}:{...a,outcome:this.lockError?"error":this.lockOff?"timeout":"off"}}}});async function ca(e,t,n,i){let o=i.decode??(A=>createImageBitmap(A)),r=async()=>e.stillRead(await o(t),i.region??[0,0,1,1],i.detectorLimit),a;try{a=await r()}catch{try{await new Promise(A=>setTimeout(A,i.retryMs??300)),a=await r()}catch{return null}}let s=a.mrzBox;return s===void 0?null:{engine:i.engine,source:"live_mrz",format:n.format,lineCount:Mi(n.lineCount,2,3),checkDigitsValid:!0,stillConfirmed:a.valid&&a.digest===n.digest,band:[Qn(s[0]),Qn(s[1]),Qn(Math.min(s[2],1-s[0])),Qn(Math.min(s[3],1-s[1]))],digest:n.digest,framesToValid:Mi(n.framesToValid,1,1e3),msToValid:Mi(n.msToValid,0,12e4)}}var Mi,Qn,la=J(()=>{"use strict";Mi=(e,t,n)=>Math.min(n,Math.max(t,Math.round(e))),Qn=e=>Math.round(Math.min(1,Math.max(0,e))*1e4)/1e4});function ua(e,t=globalThis){let n=t.WebAssembly?.validate;if(typeof n!="function")return{ok:!1,reason:"simd"};try{if(!n.call(t.WebAssembly,Vl)||!n.call(t.WebAssembly,Jl))return{ok:!1,reason:"simd"}}catch{return{ok:!1,reason:"simd"}}if(typeof t.Worker!="function")return{ok:!1,reason:"worker"};if(typeof t.createImageBitmap!="function")return{ok:!1,reason:"bitmap"};let i=t.navigator?.deviceMemory;return typeof i=="number"&&i<e.minDeviceMemoryGb?{ok:!1,reason:"memory"}:{ok:!0}}function da(e=globalThis){let t=e.navigator?.connection;return t?.saveData===!0||["slow-2g","2g","3g"].includes(t?.effectiveType??"")}var Vl,Jl,ga=J(()=>{"use strict";Vl=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]),Jl=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,6,64,11,11])});function ma(){let e=t=>(t.close(),Promise.reject(new Ce("unsupported")));return{ready:Promise.resolve("unsupported"),busy:!1,bandRead:e,stillRead:e,layoutRead:e,dispose:()=>{}}}function ha(e){let t;try{if(e.createWorker)t=e.createWorker();else if(e.workerUrl!==void 0)t=new Worker(e.workerUrl,{type:"module",name:"sekyro-ocr"});else return ma()}catch{return ma()}let n=new Map,i=0,o=!1,r=!1,a=!1;t.addEventListener("message",p=>{let g=p.data,C=n.get(g.id);C&&(n.delete(g.id),C.resolve(g))});let s=()=>{for(let p of n.values())p.reject(new Ce("error"));n.clear(),c()};t.addEventListener("error",s),t.addEventListener("messageerror",s);function A(p,g=[]){if(o)return Promise.reject(new Ce("disposed"));let C=++i;return new Promise((w,Q)=>{n.set(C,{resolve:w,reject:Q});try{t.postMessage({...p,id:C},g)}catch{n.delete(C),Q(new Ce("error"))}})}function c(){if(!o){o=!0;try{t.postMessage({id:++i,kind:"dispose"})}catch{}t.terminate();for(let p of n.values())p.reject(new Ce("disposed"));n.clear()}}let l=(async()=>{let p=await A({kind:"init",baseUrl:e.baseUrl,salt:e.salt,detectorLimit:e.tuning.detectorLimit,maxDownloadMs:e.tuning.maxDownloadMs});if(p.kind==="failed")return p.reason;if(p.kind!=="ready")return"error";let g=await A({kind:"warmup"});return g.kind!=="ready"?"error":{warmupMs:g.warmupMs,downloadMs:p.downloadMs,cached:p.cached}})().catch(()=>"error"),d,m=new Promise(p=>{d=setTimeout(()=>p("timeout"),e.tuning.loadTimeoutMs)}),h=Promise.race([l,m]).then(p=>(clearTimeout(d),typeof p=="string"?c():a=!0,o&&typeof p!="string"?"error":p));(e.page===void 0?globalThis.addEventListener?globalThis:null:e.page)?.addEventListener("pagehide",c,{once:!0});async function f(p,g,C){if(o)throw g.close(),new Ce("disposed");if(!a)throw g.close(),new Ce("not_ready");if(r)throw g.close(),new Ce("busy");r=!0;let w;try{let Q=new Promise((I,b)=>{w=setTimeout(()=>{b(new Ce("timeout")),c()},e.tuning.readTimeoutMs??1e4)}),k=await Promise.race([A(p,[g]),Q]);if(k.kind===C){let{id:I,...b}=k;return b}throw new Ce(k.kind==="error"?k.code:k.kind==="failed"?k.reason:"error")}finally{clearTimeout(w),r=!1}}return{ready:h,get busy(){return r},bandRead:(p,g=e.tuning.detectorLimit)=>f({kind:"band",bitmap:p,detectorLimit:g},p,"band"),stillRead:(p,g,C=e.tuning.detectorLimit)=>f({kind:"still",bitmap:p,region:g,detectorLimit:C},p,"band"),layoutRead:(p,g)=>f({kind:"layout",bitmap:p,detectorLimit:g},p,"layout"),dispose:c}}var Ce,pa=J(()=>{"use strict";Ce=class extends Error{constructor(t){super(t),this.name="OcrEngineError",this.code=t}}});function Ca(e,t={}){let n=xi(e),i=xi(n.liveMrz),o=xi(n.frontLock),r=Ia(t.engine??Mt),a=t.mode==="off",s=p=>p.enabled===!0?p.arm==="live"?"live":"control":null,A=s(i),c=s(o),l=(p,g)=>!a&&g==="live"&&Ia(p.minEngine??Mt)<=r,d=ki,m=l(i,A)?{detectorLimit:ge(i.detectorLimit,320,1600,d.detectorLimit),bandMaxWidthPx:ge(i.bandMaxWidthPx,320,4096,d.bandMaxWidthPx),minBandWidthPx:ge(i.minBandWidthPx,0,4096,d.minBandWidthPx),bandTop:ge(i.bandTop,0,.95,d.bandTop),minIntervalMs:ge(i.minIntervalMs,0,5e3,d.minIntervalMs),stableReads:Math.round(ge(i.stableReads,1,10,d.stableReads)),profileReads:Math.round(ge(i.profileReads,1,100,d.profileReads)),maxReadMs:ge(i.maxReadMs,50,6e4,d.maxReadMs),searchTimeoutMs:ge(i.searchTimeoutMs,1e3,12e4,d.searchTimeoutMs),hint:fa(i.hint,!0),stillConfirm:fa(i.stillConfirm,!0)}:null,h=wi,u=(p,g,C)=>ge(o[p],g,C,h[p]),f=l(o,c)?{minLines:Math.round(u("minLines",1,50)),fillMin:u("fillMin",0,1),fillMax:u("fillMax",0,2),offsetMax:u("offsetMax",0,1),steadyFillDelta:u("steadyFillDelta",0,1),steadyOffsetDelta:u("steadyOffsetDelta",0,1),layoutShiftMax:u("layoutShiftMax",0,1),lineCountDelta:Math.round(u("lineCountDelta",0,50)),lockMs:u("lockMs",0,3e4),steadyMs:u("steadyMs",0,3e4),minFrames:Math.round(u("minFrames",1,100)),minIntervalMs:u("minIntervalMs",0,5e3),maxWidthPx:u("maxWidthPx",160,2048),detectorLimit:u("detectorLimit",320,1600),searchTimeoutMs:u("searchTimeoutMs",1e3,12e4)}:null;return{enabled:m!==null||f!==null,liveMrz:m,textLock:f,liveMrzArm:A,frontLockArm:c,load:{detectorLimit:m?.detectorLimit??f?.detectorLimit??d.detectorLimit,loadTimeoutMs:ge(i.loadTimeoutMs,1e3,12e4,2e4),maxDownloadMs:ge(i.maxDownloadMs,1e3,12e4,2e4),minDeviceMemoryGb:ge(i.minDeviceMemoryGb,0,64,2)},reportSampleRate:ge(i.reportSampleRate,0,1,1)}}function ya(e,t){return e.enabled?!(t.probe??ua)({minDeviceMemoryGb:e.load.minDeviceMemoryGb}).ok||(t.slow??da)()?{ok:!1,reason:"unsupported"}:{ok:!0,engine:ha({baseUrl:t.baseUrl,salt:t.salt,tuning:{detectorLimit:e.load.detectorLimit,maxDownloadMs:e.load.maxDownloadMs,loadTimeoutMs:e.load.loadTimeoutMs},...t.workerUrl!==void 0?{workerUrl:t.workerUrl}:{},...t.createWorker!==void 0?{createWorker:t.createWorker}:{},...t.page!==void 0?{page:t.page}:{}})}:{ok:!1,reason:"off"}}function Yl(e=typeof navigator<"u"?navigator.userAgent:""){return/SamsungBrowser\//.test(e)?"samsung":/Firefox\/|FxiOS\//.test(e)?"firefox":/Chrome\/|CriOS\/|Chromium\//.test(e)&&!/Edg\/|OPR\//.test(e)?"chrome":/Safari\//.test(e)&&/Version\/|Mobile\//.test(e)&&!/Chrome\/|CriOS\//.test(e)?"safari":"other"}function Ea(e){let t=e.assist??null,n=e.load!==null&&e.load!==void 0&&typeof e.load=="object"?e.load:null,i=typeof e.load=="string"?e.load:null,o=t!==null?t.outcome:i==="unsupported"||i==="download"||i==="integrity"?i:i==="error"||i==="timeout"?"error":"off",r={kind:"live_mrz",platform:"web",engine:e.engine??Mt,arm:e.arm,capture:e.capture,outcome:o,reads:Di(t?.reads??0,0,1e4)??0,browser:e.browser??Yl()},a=(s,A)=>{A!==void 0&&(r[s]=A)};return a("format",t?.format),a("framesToValid",Di(t?.framesToValid,1,1e4)),a("msToValid",ze(t?.msToValid)),a("framesToLock",Di(t?.framesToLock,1,1e4)),a("msToLock",ze(t?.msToLock)),a("msToCapture",ze(e.msToCapture)),a("readP50Ms",ze(t?.readP50Ms)),a("readP90Ms",ze(t?.readP90Ms)),a("deviceClass",t?.deviceClass),n!==null&&(a("warmupMs",ze(n.warmupMs)),a("downloadMs",ze(n.downloadMs)),a("cached",n.cached)),a("stillConfirmed",e.stillConfirmed),a("typeMismatch",e.typeMismatch),r}function vi(e,t){return e===void 0?!1:t==="passport"?e!=="TD3":e==="TD3"}var Mt,xi,ge,fa,Ia,ze,Di,ba=J(()=>{"use strict";ga();Bn();pa();Mt="sekyro-ocr-1",xi=e=>e!==null&&typeof e=="object"?e:{},ge=(e,t,n,i)=>typeof e=="number"&&Number.isFinite(e)&&e>=t&&e<=n?e:i,fa=(e,t)=>typeof e=="boolean"?e:t,Ia=e=>{let t=typeof e=="string"?/^sekyro-ocr-(\d{1,4})$/.exec(e):null;return t?Number(t[1]):Number.POSITIVE_INFINITY};ze=e=>e===void 0||!Number.isFinite(e)?void 0:Math.min(6e5,Math.max(0,Math.round(e))),Di=(e,t,n)=>e===void 0||!Number.isFinite(e)?void 0:Math.min(n,Math.max(t,Math.round(e)))});function Ba(e){return e.framing==="no_document"?"sensing":e.framing==="too_far"?"too_far":e.framing==="too_close"?"too_close":e.framing==="edge_clipped"?"edge_clipped":e.framing==="wrong_shape"?"wrong_shape":e.framing==="tilted"?"tilted":e.lighting==="too_dark"?"too_dark":e.lighting==="too_bright"?"too_bright":e.glare==="glare"?"glare":e.blur==="blurry"?"blurry":"hold_still"}var Sn,wn,Qa=J(()=>{"use strict";Sn=Object.freeze({sensing:{key:"sensing",reticle:"searching",minDurationMs:900},too_far:{key:"too_far",reticle:"coaching",minDurationMs:1400},too_close:{key:"too_close",reticle:"coaching",minDurationMs:1400},edge_clipped:{key:"edge_clipped",reticle:"coaching",minDurationMs:1400},wrong_shape:{key:"wrong_shape",reticle:"coaching",minDurationMs:1400},tilted:{key:"tilted",reticle:"coaching",minDurationMs:1400},too_dark:{key:"too_dark",reticle:"coaching",minDurationMs:1400},too_bright:{key:"too_bright",reticle:"coaching",minDurationMs:1400},blurry:{key:"blurry",reticle:"coaching",minDurationMs:1400},focus_far:{key:"focus_far",reticle:"coaching",minDurationMs:1600},glare:{key:"glare",reticle:"coaching",minDurationMs:1400},hold_still:{key:"hold_still",reticle:"locking",minDurationMs:900},processing:{key:"processing",reticle:"processing",minDurationMs:800},side_captured:{key:"side_captured",reticle:"flip",minDurationMs:2600},captured:{key:"captured",reticle:"done",minDurationMs:800}});wn=class{constructor(t=2600,n=.35){this.windowMs=t;this.decayPerSecond=n;this.votes=[];this.current=Sn.sensing;this.currentSinceMs=null}reset(){this.votes=[],this.current=Sn.sensing,this.currentSinceMs=null}force(t,n){return this.votes=[],this.current=Sn[t],this.currentSinceMs=n,this.current}tick(t,n){if(this.currentSinceMs===null&&(this.currentSinceMs=n),this.votes.push({key:t,atMs:n}),this.votes=this.votes.filter(a=>n-a.atMs<=this.windowMs),n-this.currentSinceMs<this.current.minDurationMs)return this.current;let i=new Map;for(let a of this.votes){let s=(n-a.atMs)/1e3,A=this.decayPerSecond**s;i.set(a.key,(i.get(a.key)??0)+A)}let o=this.current.key,r=-1;for(let[a,s]of i)s>r&&(r=s,o=a);return o!==this.current.key&&(this.current=Sn[o],this.currentSinceMs=n),this.current}}});function Li(e,t,n){let i=[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft],o=0;for(let a=0;a<4;a++){let s=i[a],A=i[(a+1)%4];o+=s.x*A.y-A.x*s.y}let r=t*n;return r>0?Math.abs(o/2)/r:0}function Kl(e,t){let n=Ti(e),i=Ti(t),o=Math.max(n.x1,i.x1),r=Math.max(n.y1,i.y1),a=Math.min(n.x2,i.x2),s=Math.min(n.y2,i.y2),A=Math.max(0,a-o)*Math.max(0,s-r),c=(n.x2-n.x1)*(n.y2-n.y1),l=(i.x2-i.x1)*(i.y2-i.y1),d=c+l-A;return d>0?A/d:0}function Mn(e){let t=Ti(e);return{width:t.x2-t.x1,height:t.y2-t.y1}}function Ti(e){let t=[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft];return{x1:Math.min(...t.map(n=>n.x)),y1:Math.min(...t.map(n=>n.y)),x2:Math.max(...t.map(n=>n.x)),y2:Math.max(...t.map(n=>n.y))}}function ql(e){let t=Math.hypot(e.topRight.x-e.topLeft.x,e.topRight.y-e.topLeft.y),n=Math.hypot(e.bottomRight.x-e.bottomLeft.x,e.bottomRight.y-e.bottomLeft.y),i=Math.hypot(e.bottomLeft.x-e.topLeft.x,e.bottomLeft.y-e.topLeft.y),o=Math.hypot(e.bottomRight.x-e.topRight.x,e.bottomRight.y-e.topRight.y),r=(t+n)/2,a=(i+o)/2;return r<=0||a<=0?0:Math.max(r,a)/Math.min(r,a)}var Xe,_i,Ri,kn,xn=J(()=>{"use strict";qe();wt();Xe=480,_i=Object.freeze({MIN_AREA_FRAC:.15,EDGE_CLIP_MARGIN_PX:4,STABLE_TICKS:3,IOU_STABLE_MIN:.85,RISE_PER_S:.9,FALL_PER_S:.25,GUIDE_EXPOSURE:.6,GUIDE_SHARPNESS:.35,ID3_BAND_MIN_WIDTH_FRAC:.55,ID3_BAND_ASPECT_MIN:4,ID3_BAND_ASPECT_MAX:40}),Ri=e=>Math.min(1,Math.max(0,e));kn=class{constructor(t,n={}){this.p=0;this.lastTickAt=null;this.lastQuad=null;this.streak=0;this.format=t,this.t={..._i,...n}}reset(){this.p=0,this.lastTickAt=null,this.lastQuad=null,this.streak=0}tick(t){let{quad:n,quality:i,timestampMs:o}=t,r=this.lastTickAt===null?0:Math.max(0,(o-this.lastTickAt)/1e3);this.lastTickAt=o;let a=null;if(n===null)a="dcv1.no_doc";else if(this.format==="ID-3"){let u=Mn(n),f=u.height>0?u.width/u.height:0;u.width<this.t.ID3_BAND_MIN_WIDTH_FRAC*t.frameWidth?a="dcv1.come_closer":this.edgeClipped(n,t.frameWidth,t.frameHeight)?a="dcv1.fit_document":(f<this.t.ID3_BAND_ASPECT_MIN||f>this.t.ID3_BAND_ASPECT_MAX)&&(a="dcv1.wrong_shape")}else Li(n,t.frameWidth,t.frameHeight)<this.t.MIN_AREA_FRAC?a="dcv1.come_closer":this.edgeClipped(n,t.frameWidth,t.frameHeight)?a="dcv1.fit_document":fn(this.format,ql(n))||(a="dcv1.wrong_shape");let s=a===null,A=Ri(i.exposure)>=this.t.GUIDE_EXPOSURE,c=Ri(i.sharpness)>=this.t.GUIDE_SHARPNESS,l=A&&c;if(s&&l&&n!==null){let u=this.lastQuad===null||Kl(n,this.lastQuad)>=this.t.IOU_STABLE_MIN;this.streak=u?this.streak+1:1}else this.streak=0;this.lastQuad=n;let d=s&&l;this.p=Ri(this.p+(d?this.t.RISE_PER_S:-this.t.FALL_PER_S)*r);let m=d&&this.streak>=this.t.STABLE_TICKS,h;if(a!==null)h=a;else if(A)c?h="dcv1.hold_still":h="dcv1.steady";else{let u=(Se[0]+Se[1])/2;h=i.meanLuma<u?"dcv1.more_light":"dcv1.too_bright"}return{at:o,quad:n,plausible:s,p:this.p,guidanceKey:h,ready:m,stableTicks:this.streak}}edgeClipped(t,n,i){let o=this.t.EDGE_CLIP_MARGIN_PX;return[t.topLeft,t.topRight,t.bottomRight,t.bottomLeft].some(a=>a.x<=o||a.y<=o||a.x>=n-o||a.y>=i-o)}}});function wa(e){let{data:t,width:n,height:i}=e,o=n*i;if(o===0)return 0;let r=0;for(let a=0;a<o;a++){let s=a*4;.299*(t[s]??0)+.587*(t[s+1]??0)+.114*(t[s+2]??0)>=252&&r++}return r/o}function zl(e){let t=(A,c)=>Math.hypot(c.x-A.x,c.y-A.y),n=t(e.topLeft,e.topRight),i=t(e.bottomLeft,e.bottomRight),o=t(e.topLeft,e.bottomLeft),r=t(e.topRight,e.bottomRight),a=Math.max(n,i)/Math.max(1e-6,Math.min(n,i)),s=Math.max(o,r)/Math.max(1e-6,Math.min(o,r));return Math.max(a,s)}function ka(e){let t={..._i,...e.thresholds},n=Wl,{quad:i,frameWidth:o,frameHeight:r,measures:a}=e,s=e.format==="ID-3",A="ok";if(i===null)A="no_document";else if(s){let m=Mn(i),h=o>0?m.width/o:0,u=m.height>0?m.width/m.height:0;h<t.ID3_BAND_MIN_WIDTH_FRAC?A="too_far":Sa(i,o,r,t.EDGE_CLIP_MARGIN_PX)?A="edge_clipped":(u<t.ID3_BAND_ASPECT_MIN||u>t.ID3_BAND_ASPECT_MAX)&&(A="wrong_shape")}else{let m=Li(i,o,r),h=Mn(i),u=Math.max(h.width,h.height)/Math.max(1e-6,Math.min(h.width,h.height));m<t.MIN_AREA_FRAC?A="too_far":m>n.MAX_AREA_FRAC?A="too_close":Sa(i,o,r,t.EDGE_CLIP_MARGIN_PX)?A="edge_clipped":fn(e.format,u)?zl(i)>n.TILT_MAX_SIDE_RATIO&&(A="tilted"):A="wrong_shape"}let c=a.exposure>=t.GUIDE_EXPOSURE?"ok":a.meanLuma<(Se[0]+Se[1])/2?"too_dark":"too_bright",l=a.sharpness>=t.GUIDE_SHARPNESS?"ok":"blurry",d=a.specularFraction>=n.GLARE_MAX_SPECULAR_FRAC?"glare":"ok";return{framing:A,lighting:c,blur:l,glare:d,acceptable:A==="ok"&&c==="ok"&&l==="ok"&&d==="ok"}}function Sa(e,t,n,i){return[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft].some(r=>r.x<=i||r.y<=i||r.x>=t-i||r.y>=n-i)}var Wl,Ma=J(()=>{"use strict";qe();wt();xn();Wl=Object.freeze({MAX_AREA_FRAC:.92,TILT_MAX_SIDE_RATIO:1.3,GLARE_MAX_SPECULAR_FRAC:.025})});function Ge(e){let t=[e.topLeft.x,e.topRight.x,e.bottomRight.x,e.bottomLeft.x],n=[e.topLeft.y,e.topRight.y,e.bottomRight.y,e.bottomLeft.y],i=Math.min(...t),o=Math.min(...n);return{x:i,y:o,width:Math.max(...t)-i,height:Math.max(...n)-o}}function Ra(e,t){let n=Math.max(0,Math.floor(e.x)),i=Math.max(0,Math.floor(e.y)),o=Math.min(t.width,Math.ceil(e.x+e.width)),r=Math.min(t.height,Math.ceil(e.y+e.height));return o-n<16||r-i<16?null:{x:n,y:i,width:o-n,height:r-i}}function Zl(e,t,n){if(e===null||t.width<=0||t.height<=0)return null;let i=Ge(e);if(i.width<=0||i.height<=0)return null;let o=n==="ID-3"?{x:i.x-i.width*xt.side,y:i.y-i.width*xt.above,width:i.width*(1+2*xt.side),height:i.height+i.width*(xt.above+xt.below)}:{x:i.x-i.width*Dn,y:i.y-i.height*Dn,width:i.width*(1+2*Dn),height:i.height*(1+2*Dn)};return Ra(o,t)}function Fi(e,t,n){let i=Math.max(e,t);return i>0?Math.min(1,n/i):1}function Pi(e,t,n,i,o=jl){let r=t.width>0?n.width/t.width:1,a=t.height>0?n.height/t.height:1,s=e===null?null:{topLeft:{x:e.topLeft.x*r,y:e.topLeft.y*a},topRight:{x:e.topRight.x*r,y:e.topRight.y*a},bottomRight:{x:e.bottomRight.x*r,y:e.bottomRight.y*a},bottomLeft:{x:e.bottomLeft.x*r,y:e.bottomLeft.y*a}},A=Zl(s,n,i)??{x:0,y:0,width:n.width,height:n.height},c=Fi(A.width,A.height,o),l=Math.max(1,Math.round(A.width*c)),d=Math.max(1,Math.round(A.height*c)),m=null;if(s!==null){let h=Ge(s);m=Ra({x:(h.x-A.x)*c,y:(h.y-A.y)*c,width:h.width*c,height:h.height*c},{width:l,height:d})}return{crop:A,width:l,height:d,docRegion:m}}function Ta(e,t,n,i=Xl){if(n==="LOW")return null;let o=e?.width?.max,r=e?.height?.max;if(typeof o!="number"||typeof r!="number"||o<=0||r<=0)return null;let a=Math.max(o,r),s=Math.min(o,r),A=Math.min(a,Math.max(i.width,i.height)),c=Math.min(s,Math.min(i.width,i.height));return A<=Math.max(t.width,t.height)?null:{width:{ideal:A},height:{ideal:c}}}function _a(e){let t={},n=e?.imageWidth,i=e?.imageHeight;if(typeof n?.max=="number"&&n.max>0){let o=typeof i?.max=="number"&&i.max>0?n.max/i.max:1.3333333333333333,r=o>=1?xa:xa*o,a=Math.min(n.max,Math.floor(r)),s=typeof n.step=="number"&&n.step>0?n.step:1,A=typeof n.min=="number"?n.min:0;a=Math.max(A,A+Math.floor((a-A)/s)*s),t.imageWidth=a}return e?.fillLightMode?.includes("off")===!0&&(t.fillLightMode="off"),t}function La(e,t){if(e.width<=0||e.height<=0||t.width<=0||t.height<=0)return!1;let n=e.width>e.height,i=t.width>t.height;return n!==i&&e.width!==e.height&&t.width!==t.height?!1:Math.max(e.width,e.height)>=1.2*Math.max(t.width,t.height)}function Fa(e,t,n,i){if(n===null)return!1;let o=Ge(e),r=Ge(n);if(t.width<=0||i.width<=0)return!1;let a=o.width/t.width,s=r.width/i.width;return s>0&&a>=.6*s&&a<=1.25*s}var Da,Xl,xa,jl,va,Dn,xt,Ni=J(()=>{"use strict";Da=Object.freeze({width:1920,height:1080}),Xl=Object.freeze({width:3840,height:2160}),xa=4096,jl=2560,va=640,Dn=.15,xt=Object.freeze({side:.2,above:.9,below:.3})});function Ga(){let e=globalThis.ImageCapture;return typeof e=="function"?e:null}function eu(e){return/AppleWebKit\//.test(e)&&!/(Chrome|Chromium|Edg|OPR)\//.test(e)}function Oa(e,t=typeof navigator>"u"?"":navigator.userAgent){return Ga()!==null&&!eu(t)&&e!=null&&e.kind==="video"&&e.readyState==="live"}function Na(e,t){return new Promise((n,i)=>{let o=setTimeout(()=>i(new Error("takePhoto timed out")),t);e.then(r=>{clearTimeout(o),n(r)},r=>{clearTimeout(o),i(r)})})}function Gi(e,t){let n=document.createElement("canvas");return n.width=e,n.height=t,n}function tu(e,t){return new Promise((n,i)=>{e.toBlob(o=>o?n(o):i(new Error("toBlob failed")),"image/jpeg",t)})}async function Ha(e,t,n,i,o){let r=Gi(n,i),a=Gi(1,1);try{let s=r.getContext("2d");if(s===null)throw new Error("2d context unavailable");s.imageSmoothingQuality="high",s.drawImage(e,t.x,t.y,t.width,t.height,0,0,n,i);let A=await tu(r,$l),c=o===null?null:kt({topLeft:{x:o.x,y:o.y},topRight:{x:o.x+o.width,y:o.y},bottomRight:{x:o.x+o.width,y:o.y+o.height},bottomLeft:{x:o.x,y:o.y+o.height}},{width:n,height:i},{width:n,height:i}),l=In(r,c),d=Fi(n,i,va);return a.width=Math.max(1,Math.round(n*d)),a.height=Math.max(1,Math.round(i*d)),a.getContext("2d")?.drawImage(r,0,0,a.width,a.height),{blob:A,previewDataUrl:a.toDataURL("image/jpeg",.85),sharpness:l}}finally{r.width=0,r.height=0,a.width=0,a.height=0}}function nu(e,t){let n=Math.min(1,t/e.width),i=Gi(Math.max(1,Math.round(e.width*n)),Math.max(1,Math.round(e.height*n)));try{let o=i.getContext("2d",{willReadFrequently:!0});return o===null?null:(o.imageSmoothingQuality="high",o.drawImage(e,0,0,i.width,i.height),o.getImageData(0,0,i.width,i.height))}finally{i.width=0,i.height=0}}async function Ua(e,t,n,i){let o={width:Math.max(1,e.videoWidth),height:Math.max(1,e.videoHeight)},r=Pi(t,n,o,i);return{...await Ha(e,r.crop,r.width,r.height,r.docRegion),docRegion:r.docRegion,source:"video",width:r.width,height:r.height}}async function Va(e,t,n,i,o){let r=Ga();if(r===null)return null;let a=null;try{let s=new r(o.track),A=await Na(s.getPhotoCapabilities?.()??Promise.resolve({}),Pa).catch(()=>({})),c=await Na(s.takePhoto(_a(A)),Pa);a=await createImageBitmap(c);let l={width:e.videoWidth,height:e.videoHeight};if(!La(a,l))return null;let d=nu(a,o.detectWidth),m=null;d!==null&&t!==null&&(m=await o.detect(d).catch(()=>null));let h=d??{width:a.width,height:a.height};m!==null&&!Fa(m,h,t,n)&&(m=null);let u=Pi(m,h,a,i);return{...await Ha(a,u.crop,u.width,u.height,u.docRegion),docRegion:u.docRegion,source:"photo",width:u.width,height:u.height}}catch{return null}finally{a?.close()}}var Pa,$l,Ja=J(()=>{"use strict";fi();Ni();Pa=3500,$l=.92});function qa(e){let t=vn,n=e!==null&&typeof e=="object"?e:{},i=n.fillDistanceM!==null&&typeof n.fillDistanceM=="object"?n.fillDistanceM:{},o=(r,a)=>typeof r=="boolean"?r:a;return{width:me(n.width,640,7680)??t.width,height:me(n.height,480,4320)??t.height,lensSelection:o(n.lensSelection,t.lensSelection),continuousFocus:o(n.continuousFocus,t.continuousFocus),refocusBeforePhotoMs:me(n.refocusBeforePhotoMs,0,2e3)??t.refocusBeforePhotoMs,zoomMax:me(n.zoomMax,1,5)??t.zoomMax,zoomNoFocusInfo:me(n.zoomNoFocusInfo,1,5)??t.zoomNoFocusInfo,zoomMinSourcePx:me(n.zoomMinSourcePx,0,8e3)??t.zoomMinSourcePx,fillDistanceM:{id1:me(i.id1,.03,1)??t.fillDistanceM.id1,id3:me(i.id3,.03,1)??t.fillDistanceM.id3},focusMarginFrac:me(n.focusMarginFrac,0,2)??t.focusMarginFrac,stillSharpnessMin:me(n.stillSharpnessMin,0,10)??t.stillSharpnessMin,stillRefusalsMax:me(n.stillRefusalsMax,0,10)??t.stillRefusalsMax,focusFarFillFrac:me(n.focusFarFillFrac,0,1)??t.focusFarFillFrac,noDocFarHintMs:me(n.noDocFarHintMs,0,6e4)??t.noDocFarHintMs,zoomFallbackMs:me(n.zoomFallbackMs,0,12e4)??t.zoomFallbackMs}}function iu(e){let t=e.toLowerCase();return t===""?"unknown":/front|facing front|user|selfie|face ?time/.test(t)?"front":/ultra|0\.5x|wide angle/.test(t)?"ultra":/tele|zoom|periscope|[2-9]x/.test(t)?"tele":/depth|tof|infrared|\bir\b|truedepth|lidar|macro|monochrome|mono\b/.test(t)?"depth":/dual|triple/.test(t)?"virtual":/back|rear|environment|facing back|arrière|خلفية/.test(t)?"main":"unknown"}function ou(e){let t=/camera2?\s*(\d+)/i.exec(e);return t?Number(t[1]):Number.POSITIVE_INFINITY}function ru(e){let t={main:0,virtual:1,ultra:9,tele:9,depth:9,front:9,unknown:9};return e.filter(n=>(n.kind===void 0||n.kind==="videoinput")&&n.deviceId!=="").map((n,i)=>({id:n.deviceId,kind:iu(n.label),index:ou(n.label),i})).filter(n=>t[n.kind]<9).sort((n,i)=>t[n.kind]-t[i.kind]||n.index-i.index||n.i-i.i).map(n=>n.id)}function au(){try{let e=globalThis.localStorage?.getItem(Oi);return typeof e=="string"&&e!==""?e:null}catch{return null}}function Ya(e){try{e===null?globalThis.localStorage?.removeItem(Oi):globalThis.localStorage?.setItem(Oi,e)}catch{}}function Ui(e,t,n){if(!Rn(e,"single-shot"))return null;let i=o=>Math.min(1,Math.max(0,Number.isFinite(o)?o:.5));return{focusMode:"single-shot",pointsOfInterest:[{x:i(t),y:i(n)}]}}function Wa(e,t,n,i=vn){let o=e?.zoom?.min,r=e?.zoom?.max;if(typeof r!="number"||r<=1)return 1;let a=n==="ID-3"?i.fillDistanceM.id3:i.fillDistanceM.id1,s=e?.focusDistance?.min,A;if(typeof s=="number"&&s>0&&s<1){if(A=s*(1+i.focusMarginFrac)/a,A<=1.05)return 1}else{if(Math.min(t.width,t.height)<i.zoomMinSourcePx)return 1;A=i.zoomNoFocusInfo}let c=Math.min(A,i.zoomMax,r);typeof o=="number"&&(c=Math.max(c,o));let l=e?.zoom?.step;return typeof l=="number"&&l>0&&(c=Math.round(c/l)*l),c>1.01?Number(c.toFixed(2)):1}function Hi(e){try{return e.getVideoTracks?.()[0]}catch{return}}function Ka(e){if(e!==null)for(let t of e.getTracks())t.stop()}function su(e){try{let t=Hi(e)?.getCapabilities?.();return!Array.isArray(t?.focusMode)||t.focusMode.includes("continuous")}catch{return!0}}async function za(e){let t=r=>({audio:!1,video:{...r,width:{ideal:e.base.width},height:{ideal:e.base.height}}}),n=r=>e.getUserMedia(t({deviceId:{exact:r}})),i=()=>e.getUserMedia(t({facingMode:{ideal:"environment"}}));if(e.lensSelection){let r=au();if(r!==null)try{return{stream:await n(r),lens:"stored"}}catch{Ya(null)}}let o=await i();if(!e.lensSelection||e.enumerateDevices===void 0)return{stream:o,lens:"default"};try{let r=ru(await e.enumerateDevices()).slice(0,Au);if(r.length===0)return{stream:o,lens:"default"};let a=null;for(let s of r){let A=o!==null?Hi(o)?.getSettings?.().deviceId:void 0;if(o===null||A!==s){Ka(o),o=null;try{o=await n(s)}catch{continue}}if(a??(a=s),su(o))return Ya(s),{stream:o,lens:"selected"}}if(o!==null&&a!==null&&Hi(o)?.getSettings?.().deviceId===a)return{stream:o,lens:"selected"};if(Ka(o),o=null,a!==null)try{return{stream:await n(a),lens:"selected"}}catch{}return{stream:await i(),lens:"default"}}catch{return{stream:o??await i(),lens:"default"}}}var vn,me,Oi,Rn,Au,Vi=J(()=>{"use strict";vn=Object.freeze({width:3840,height:2160,lensSelection:!0,continuousFocus:!0,refocusBeforePhotoMs:350,zoomMax:2,zoomNoFocusInfo:1.5,zoomMinSourcePx:2160,fillDistanceM:Object.freeze({id1:.11,id3:.15}),focusMarginFrac:.2,stillSharpnessMin:.16,stillRefusalsMax:2,focusFarFillFrac:.45,noDocFarHintMs:1500,zoomFallbackMs:8e3}),me=(e,t,n)=>typeof e=="number"&&Number.isFinite(e)&&e>=t&&e<=n?e:void 0;Oi="sekyro.doc.camera";Rn=(e,t)=>Array.isArray(e?.focusMode)&&e.focusMode.includes(t);Au=3});function ja(e,t,n,i=.06){let o=Math.max(e.width/n,e.height),r=o*n,a=(e.width-r)/2,s=(e.height-o)/2,A=Oe((t.x-t.width*i-a)/r),c=Oe((t.y-t.height*i-s)/o),l=Oe((t.x+t.width*(1+i)-a)/r),d=Oe((t.y+t.height*(1+i)-s)/o);return{x:A,y:c,width:l-A,height:d-c}}function Za(e,t,n={}){let i=n.edgePeakFrac??0,{width:o,height:r,data:a}=e;if(o<=0||r<=0)return Dt;let s=Oe(t.x),A=Oe(t.y),c={x:s,y:A,width:Math.max(0,Oe(t.x+t.width)-s),height:Math.max(0,Oe(t.y+t.height)-A)};if(c.width<=0||c.height<=0)return Dt;let l=c.x*o,d=c.y*r,m=(c.x+c.width)*o,h=(c.y+c.height)*r,u=(m-l)*.15,f=(h-d)*.15,p=(te,ne,fe)=>Math.min(fe,Math.max(ne,te)),g=p(Math.floor(l-u),0,o-1),C=p(Math.floor(d-f),0,r-1),w=p(Math.ceil(m+u),g+1,o),Q=p(Math.ceil(h+f),C+1,r),k=Math.max(1,Math.ceil(Math.max(w-g,Q-C)/320)),I=Math.floor((w-g+k-1)/k),b=Math.floor((Q-C+k-1)/k);if(I<3||b<3)return Dt;let v=new Int32Array(I*b);for(let te=0;te<b;te++){let ne=C+te*k;for(let fe=0;fe<I;fe++){let Be=(ne*o+g+fe*k)*4;v[te*I+fe]=(a[Be]??0)*77+(a[Be+1]??0)*150+(a[Be+2]??0)*29>>8}}let O=(te,ne)=>(te-ne-.5)/k,L=O(l,g),q=O(m,g),Z=O(d,C),R=O(h,C),E=(m-l)/k,y=(h-d)/k,x=p(Math.ceil(L),0,I-1),N=p(Math.floor(q),x,I-1),U=p(Math.ceil(Z),0,b-1),M=p(Math.floor(R),U,b-1),B=0,D=0,P=0,H=0,F=0,G=0;for(let te=U;te<=M;te++)for(let ne=x;ne<=N;ne++){let fe=v[te*I+ne];if(B+=fe,fe>=248&&D++,P++,ne>=1&&ne<I-1&&te>=1&&te<b-1){let Be=v[te*I+ne-1]+v[te*I+ne+1]+v[(te-1)*I+ne]+v[(te+1)*I+ne]-4*fe;H+=Be,F+=Be*Be,G++}}let V=P>0?B/P:0,W=P>0?D/P:0,z=G>0?H/G:0,X=G>0?Math.max(0,F/G-z*z):0,S=new Float64Array(I),_=new Float64Array(b);for(let te=0;te<b;te++)for(let ne=1;ne<I-1;ne++)S[ne]=S[ne]+Math.abs(v[te*I+ne+1]-v[te*I+ne-1]);for(let te=1;te<b-1;te++)for(let ne=0;ne<I;ne++)_[te]=_[te]+Math.abs(v[(te+1)*I+ne]-v[(te-1)*I+ne]);let K=Tn(S,!0,L,i),$=Tn(S,!1,q,i),T=Tn(_,!0,Z,i),Y=Tn(_,!1,R,i),j=($.position-K.position)/E,ie=(Y.position-T.position)/y,ee=ie>0?j/ie:0,oe=((K.position+$.position)/2-(L+q)/2)/E,le=((T.position+Y.position)/2-(Z+R)/2)/y,se=Xa(S),Ae=Xa(_),Ee=se<=0||Ae<=0?0:Math.min(Math.min(K.value,$.value)/se,Math.min(T.value,Y.value)/Ae),be=(te,ne)=>ne+(te+.5)*k,je=W,Ze=0;{let te=($.position-K.position)*.06,ne=(Y.position-T.position)*.06,fe=p(Math.ceil(K.position+te),0,I-1),Be=p(Math.floor($.position-te),0,I-1),JA=p(Math.ceil(T.position+ne),0,b-1),To=p(Math.floor(Y.position-ne),0,b-1),_o=0,Ut=0,Lo=0;for(let $e=JA;$e<=To;$e++)for(let et=fe;et<=Be;et++){Ut++;let mt=v[$e*I+et];mt>=248&&_o++;let YA=et+2<=Be?v[$e*I+et+2]:mt,KA=$e+2<=To?v[($e+2)*I+et]:mt;(Math.abs(YA-mt)>=24||Math.abs(KA-mt)>=24)&&Lo++}Ut>=16&&(je=_o/Ut,Ze=Lo/Ut)}return{brightness:V,glare:W,cardGlare:je,sharpness:X,fill:j,shape:ee,content:Ze,offsetX:oe,offsetY:le,edgeConfidence:Ee,box:{left:be(K.position,g),right:be($.position,g),top:be(T.position,C),bottom:be(Y.position,C)}}}function Tn(e,t,n,i){let o=e.length,r=Math.max(1,Math.floor(o*.45)),a=t?1:Math.max(1,o-1-r),s=t?Math.min(o-2,r):o-2,A=a;for(let h=a;h<=s;h++)e[h]>e[A]&&(A=h);if(i>0&&i<1){let h=e[A]*i,u=A,f=Math.abs(A-n);for(let p=a;p<=s;p++){let g=e[p];if(g<h||g<(e[p-1]??0)||g<(e[p+1]??0))continue;let C=Math.abs(p-n);C<f&&(u=p,f=C)}A=u}let c=A>0?e[A-1]:0,l=e[A],d=A<o-1?e[A+1]:0,m=c+l+d;return{position:m>0?A+(d-c)/m:A,value:l}}function Xa(e){if(e.length<3)return 0;let t=0;for(let n=1;n<e.length-1;n++)t+=e[n];return t/(e.length-2)}function $a(e){let t=e.box;return t===null||t.right-t.left<4||t.bottom-t.top<4?null:{topLeft:{x:t.left,y:t.top},topRight:{x:t.right,y:t.top},bottomRight:{x:t.right,y:t.bottom},bottomLeft:{x:t.left,y:t.bottom}}}function es(e){let t=e!==null&&typeof e=="object"?e:{},n={...vt};for(let i of Object.keys(vt)){let o=t[i];typeof o=="number"&&Number.isFinite(o)&&o>=0&&o<=1e6&&(n[i]=o)}return n}var Dt,Oe,vt,_n,Ji=J(()=>{"use strict";Dt=Object.freeze({brightness:0,glare:0,cardGlare:0,sharpness:0,fill:0,shape:0,content:0,offsetX:0,offsetY:0,edgeConfidence:0,box:null}),Oe=e=>Math.min(1,Math.max(0,e));vt=Object.freeze({fillMin:.82,fillMax:1.06,offsetMax:.06,glareMax:.025,sharpnessMin:180,edgeConfidenceMin:1.6,darkBrightness:70,lockMs:450,steadyMs:900,steadyFillMin:.45,steadyFillMax:1.3,steadyFillDelta:.06,steadyOffsetDelta:.04,steadyRefMs:100,edgePeakFrac:.4,shapeTolerance:.2,contentMin:.1});_n=class{constructor(t=vt){this.t=t;this.goodSince=null;this.steadySince=null;this.last=null}reset(){this.goodSince=null,this.steadySince=null,this.last=null}tick(t,n){let i=this.t,o=i.shapeTolerance<=0||Math.abs(t.shape-1)<=i.shapeTolerance,r=t.edgeConfidence>=i.edgeConfidenceMin&&o&&t.content>=i.contentMin,a=t.fill>=i.fillMin&&t.fill<=i.fillMax,s=Math.abs(t.offsetX)<=i.offsetMax&&Math.abs(t.offsetY)<=i.offsetMax,A=t.cardGlare<=i.glareMax,c=t.sharpness>=i.sharpnessMin,l=this.last;this.last={fill:t.fill,offsetX:t.offsetX,offsetY:t.offsetY,at:n};let d=l!==null&&i.steadyRefMs>0?Math.min(3,Math.max(1,(n-l.at)/i.steadyRefMs)):1,m=r&&A&&c&&t.fill>=i.steadyFillMin&&t.fill<=i.steadyFillMax&&l!==null&&Math.abs(t.fill-l.fill)<=i.steadyFillDelta*d&&Math.abs(t.offsetX-l.offsetX)<=i.steadyOffsetDelta*d&&Math.abs(t.offsetY-l.offsetY)<=i.steadyOffsetDelta*d,h=r&&a&&s&&A&&c,u;if(r?A?t.fill<i.fillMin?u="too_small":t.fill>i.fillMax?u="too_big":c?s?u="locking":u="off_center":u="blurry":u="glare":u="no_card",h){if(m&&(this.steadySince??(this.steadySince=n)),this.goodSince??(this.goodSince=n),n-this.goodSince>=i.lockMs)return{detected:r,ready:!0,via:"good",blocker:"locking"};let f=this.steadySince!==null&&n-this.steadySince>=i.steadyMs;return{detected:r,ready:f,via:f?"steady":null,blocker:"locking"}}if(this.goodSince=null,m){this.steadySince??(this.steadySince=n);let f=n-this.steadySince>=i.steadyMs;return{detected:r,ready:f,via:f?"steady":null,blocker:f?"locking":"steadying"}}return this.steadySince=null,{detected:r,ready:!1,via:null,blocker:u}}}});var ts={};ue(ts,{default:()=>lu,initMlDetector:()=>cu});function cu(){throw new Error("scanic ML detector is not vendored (classical pipeline only)")}var lu,ns=J(()=>{"use strict";lu={}});function gu(e,t={}){let n=t.width||Math.sqrt(e.length),i=t.height||e.length/n,o=t.mode!==void 0?t.mode:1,r=t.method!==void 0?t.method:2,a=t.minArea||uu,s=n+2,A=i+2,c=new Int32Array(s*A);for(let h=0;h<i;h++)for(let u=0;u<n;u++)e[h*n+u]>0&&(c[(h+1)*s+(u+1)]=1);let l=[],d=2;for(let h=1;h<=i;h++)for(let u=1;u<=n;u++){let f=c[h*s+u],p=c[h*s+(u-1)],g=null,C=!1,w=-1;if(f===1&&p===0?(C=!0,g={x:u,y:h},w=2):f===0&&p>=1&&p!==-1&&p===1&&(C=!1,g={x:u-1,y:h},w=6),g){if(o===0&&!C){c[g.y*s+g.x]=-1;continue}let Q=d++,k=mu(c,s,A,g,w,Q);if(k&&k.length>0){let I=k;r===2&&(I=hu(k));let b=I.map(v=>({x:v.x-1,y:v.y-1}));if(b.length>=(r===2?4:du)){let v={id:Q,points:b,isOuter:C};l.push(v)}}else c[g.y*s+g.x]===1&&(c[g.y*s+g.x]=Q)}}l.forEach(h=>{h.area=(function(u){let f=0,p=u.length;if(p<3)return 0;for(let g=0;g<p;g++){let C=(g+1)%p;f+=u[g].x*u[C].y,f-=u[C].x*u[g].y}return Math.abs(f)/2})(h.points),h.boundingBox=(function(u){if(u.length===0)return{minX:0,minY:0,maxX:0,maxY:0};let f=u[0].x,p=u[0].y,g=u[0].x,C=u[0].y;for(let w=1;w<u.length;w++){let Q=u[w];f=Math.min(f,Q.x),p=Math.min(p,Q.y),g=Math.max(g,Q.x),C=Math.max(C,Q.y)}return{minX:f,minY:p,maxX:g,maxY:C}})(h.points)});let m=l.filter(h=>h.area>=a);return m.sort((h,u)=>u.area-h.area),t.debug&&(t.debug.labels=c,t.debug.rawContours=l,t.debug.finalContours=m),m}function mu(e,t,n,i,o,r){let a=[],s=new Set,A=i.x,c=i.y,l=A,d=c,m=-1;e[d*t+l]=r;let h=0,u=t*n,f=[0,1,1,1,0,-1,-1,-1],p=[-1,-1,0,1,1,1,0,-1];for(;h++<u;){let g;if(m===-1){let I=!1;for(let b=0;b<8;b++){g=o+b&7;let v=A+f[g],O=c+p[g];if(v>=0&&v<t&&O>=0&&O<n&&e[O*t+v]>0){I=!0;break}}if(!I)return null}else g=m+2&7;let C=-1,w=-1;for(let I=0;I<8;I++){let b=g+I&7,v=A+f[b],O=c+p[b];if(v>=0&&v<t&&O>=0&&O<n&&e[O*t+v]>0){C=v,w=O,m=b+4&7;break}}if(C===-1){a.length===0&&a.push({x:A,y:c});break}let Q=c*t+A;if(s.has(Q))return a;a.push({x:A,y:c}),s.add(Q);let k=w*t+C;if(e[k]===1&&(e[k]=r),A=C,c=w,A===l&&c===d)break}return h>=u?null:a}function hu(e){let t=e.length;if(t<=2)return e;let n=[],i=e[t-1],o=e[0],r=i,a=o,s=e[1],A=a.x-r.x,c=a.y-r.y,l=s.x-a.x,d=s.y-a.y;A*d!==c*l&&n.push(a);for(let m=1;m<t-1;m++)r=e[m-1],a=e[m],s=e[m+1],A=a.x-r.x,c=a.y-r.y,l=s.x-a.x,d=s.y-a.y,A*d!==c*l&&n.push(a);if(r=e[t-2],a=i,s=o,A=a.x-r.x,c=a.y-r.y,l=s.x-a.x,d=s.y-a.y,A*d!==c*l&&n.push(a),n.length===0){if(t===1)return[e[0]];if(t===2)return e;let m=0,h=1,u=o.x,f=o.y;for(let p=1;p<t;p++){let g=e[p],C=g.x-u,w=g.y-f,Q=C*C+w*w;Q>m&&(m=Q,h=p)}return[o,e[h]]}return n}function qi(e,t=1){if(e.length<=2)return e;let n=0,i=0,o=e[0],r=e[e.length-1];for(let a=1;a<e.length-1;a++){let s=pu(e[a],o,r);s>n&&(n=s,i=a)}if(n>t){let a=qi(e.slice(0,i+1),t),s=qi(e.slice(i),t);return a.slice(0,-1).concat(s)}return[o,r]}function pu(e,t,n){let i=n.x-t.x,o=n.y-t.y,r=i*i+o*o;if(r===0)return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));let a=((e.x-t.x)*i+(e.y-t.y)*o)/r,s,A;a<0?(s=t.x,A=t.y):a>1?(s=n.x,A=n.y):(s=t.x+a*i,A=t.y+a*o);let c=e.x-s,l=e.y-A;return Math.sqrt(c*c+l*l)}function cs(e,t=.02){return qi(e,t*(function(n){let i=0,o=n.length;if(o<2)return 0;for(let r=0;r<o;r++){let a=(r+1)%o,s=n[r].x-n[a].x,A=n[r].y-n[a].y;i+=Math.sqrt(s*s+A*A)}return i})(e))}function Wi(e,t){return Math.hypot(t.x-e.x,t.y-e.y)}function is(e){let t=0,n=0;for(let i of e)t+=i.x,n+=i.y;return{x:t/e.length,y:n/e.length}}function fu(e,t={}){if(!e||!e.points||e.points.length<4)return null;let n=t.epsilon||.02,i=(function(r,a){if(!r||r.length<4)return null;let s=[a,1.3*a,1.6*a,2*a],A=new Set;for(let c of s){let l=Math.min(.12,c),d=l.toFixed(4);if(A.has(d))continue;A.add(d);let m=Iu(cs(r,l));if(m&&m.length===4)return m}return null})(e.points,n),o;return i&&i.length===4?o=(function(r){if(r.length!==4)return null;let a=is(r),s=[...r].sort((d,m)=>Math.atan2(d.y-a.y,d.x-a.x)-Math.atan2(m.y-a.y,m.x-a.x)),A=1/0,c=0;for(let d=0;d<4;d++){let m=s[d].x+s[d].y;m<A&&(A=m,c=d)}let l=[s[c],s[(c+1)%4],s[(c+2)%4],s[(c+3)%4]];return{topLeft:l[0],topRight:l[1],bottomRight:l[2],bottomLeft:l[3]}})(i):(o=(function(r){if(!r||r.length<4)return null;let a=is(r),s=null,A=null,c=null,l=null,d=0,m=0,h=0,u=0;for(let f of r){let p=Wi(f,a);f.x<a.x&&f.y<a.y?p>d&&(s=f,d=p):f.x>a.x&&f.y<a.y?p>m&&(A=f,m=p):f.x>a.x&&f.y>a.y?p>h&&(c=f,h=p):f.x<a.x&&f.y>a.y&&p>u&&(l=f,u=p)}return s&&A&&c&&l?{topLeft:s,topRight:A,bottomRight:c,bottomLeft:l}:null})(e.points),o&&o.topLeft&&o.topRight&&o.bottomRight&&o.bottomLeft||(o=(function(r){if(!r||r.length===0)return null;let a=r[0],s=r[0],A=r[0],c=r[0],l=a.x+a.y,d=s.x-s.y,m=A.x+A.y,h=c.x-c.y;for(let u=1;u<r.length;u++){let f=r[u],p=f.x+f.y,g=f.x-f.y;p<l&&(l=p,a=f),p>m&&(m=p,A=f),g>d&&(d=g,s=f),g<h&&(h=g,c=f)}return{topLeft:a,topRight:s,bottomRight:A,bottomLeft:c}})(e.points))),o&&o.topLeft&&o.topRight&&o.bottomRight&&o.bottomLeft?o:null}function Iu(e){if(!e||e.length<4)return null;if(e.length===4)return e;if(e.length>8)return null;let t=(function(n,i){if(!n||n.length===0)return[];let o=[];for(let r of n)(o.length===0||Wi(r,o[o.length-1])>i)&&o.push(r);return o.length>2&&Wi(o[0],o[o.length-1])<=i&&o.pop(),o})(e,6);return t.length===4?t:(t.length,null)}function ls(){return Tt!==null&&Tt.byteLength!==0||(Tt=new Uint8Array(ae.memory.buffer)),Tt}function Yi(e,t){let n=t(1*e.length,1)>>>0;return ls().set(e,n/1),_e=e.length,n}function Fn(e,t){return e>>>=0,ls().subarray(e/1,e/1+t)}function us(){return _t!==null&&_t.byteLength!==0||(_t=new Float32Array(ae.memory.buffer)),_t}function Cu(e,t,n,i,o){let r=(function(c,l){let d=l(4*c.length,4)>>>0;return us().set(c,d/4),_e=c.length,d})(e,ae.__wbindgen_malloc),a=_e,s=ae.hysteresis_thresholding(r,a,t,n,i,o);var A=Fn(s[0],s[1]).slice();return ae.__wbindgen_free(s[0],1*s[1],1),A}function os(e,t){let n=t(2*e.length,2)>>>0;return(Lt!==null&&Lt.byteLength!==0||(Lt=new Uint16Array(ae.memory.buffer)),Lt).set(e,n/2),_e=e.length,n}function yu(e,t,n,i,o){let r=os(e,ae.__wbindgen_malloc),a=_e,s=os(t,ae.__wbindgen_malloc),A=_e,c=ae.non_maximum_suppression(r,a,s,A,n,i,o);var l,d,m=(l=c[0],d=c[1],l>>>=0,us().subarray(l/4,l/4+d)).slice();return ae.__wbindgen_free(c[0],4*c[1],4),m}async function ds(e){if(ae!==void 0)return ae;if(e!==void 0&&Object.getPrototypeOf(e)===Object.prototype&&({module_or_path:e}=e),e===void 0)throw new Error("scanic: WASM module bytes must be passed to init().");let t=(function(){let o={wbg:{}};return o.wbg.__wbindgen_init_externref_table=function(){let r=ae.__wbindgen_export_0,a=r.grow(4);r.set(0,void 0),r.set(a+0,void 0),r.set(a+1,null),r.set(a+2,!0),r.set(a+3,!1)},o})();(typeof e=="string"||typeof Request=="function"&&e instanceof Request||typeof URL=="function"&&e instanceof URL)&&(e=fetch(e));let{instance:n,module:i}=await(async function(o,r){if(typeof Response=="function"&&o instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(o,r)}catch(s){if(o.headers.get("Content-Type")=="application/wasm")throw s}let a=await o.arrayBuffer();return await WebAssembly.instantiate(a,r)}{let a=await WebAssembly.instantiate(o,r);return a instanceof WebAssembly.Instance?{instance:a,module:o}:a}})(await e,t);return(function(o,r){return ae=o.exports,ds.__wbindgen_wasm_module=r,_t=null,Lt=null,Tt=null,ae.__wbindgen_start(),ae})(n,i)}function Eu(e){if(typeof atob=="function"){let t=atob(e),n=new Uint8Array(t.length);for(let i=0;i<t.length;i++)n[i]=t.charCodeAt(i);return n}return Uint8Array.from(Buffer.from(e,"base64"))}async function bu(){if(!(function(){if(Ki!==null)return Ki;let e=!1;if(typeof WebAssembly=="object"&&typeof WebAssembly.validate=="function"){let t=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]),n=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,111,3,2,1,0,10,6,1,4,0,208,111,11]);try{e=WebAssembly.validate(t)&&WebAssembly.validate(n)}catch{e=!1}}return Ki=e,e})())throw new Error("scanic: WebAssembly features required by the WASM module (reference-types, SIMD) are unavailable in this engine; using the JavaScript fallback.");return await ds({module_or_path:Eu("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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==")})}function Rt(){return Ln||(Ln=bu().catch(e=>{throw Ln=null,e})),Ln}function Bu(e,t,n,i=5,o=0){o===0&&(o=.3*(.5*(i-1)-1)+.8);let r=Math.floor(i/2),a=(function(c,l){let d=new Float32Array(c),m=Math.floor(c/2),h=0;for(let u=0;u<c;u++){let f=u-m;d[u]=Math.exp(-f*f/(2*l*l)),h+=d[u]}for(let u=0;u<c;u++)d[u]/=h;return d})(i,o),s=new Uint8ClampedArray(t*n),A=new Uint8ClampedArray(t*n);for(let c=0;c<n;c++){let l=c*t;for(let d=0;d<t;d++){let m=0;for(let h=-r;h<=r;h++)m+=e[l+Math.min(t-1,Math.max(0,d+h))]*a[r+h];s[l+d]=m}}for(let c=0;c<t;c++)for(let l=0;l<n;l++){let d=0;for(let m=-r;m<=r;m++)d+=s[Math.min(n-1,Math.max(0,l+m))*t+c]*a[r+m];A[l*t+c]=Math.round(d)}return A}function as(e,t,n,i,o){let r=new Uint8Array(t*n),a=[];for(let c=1;c<n-1;c++)for(let l=1;l<t-1;l++){let d=c*t+l,m=e[d];m>=o?(r[d]=2,a.push({x:l,y:c})):r[d]=m>=i?0:1}for(let c=0;c<t;c++)r[c]=1,r[(n-1)*t+c]=1;for(let c=1;c<n-1;c++)r[c*t]=1,r[c*t+t-1]=1;let s=[-1,0,1,-1,1,-1,0,1],A=[-1,-1,-1,0,0,1,1,1];for(;a.length>0;){let{x:c,y:l}=a.pop();for(let d=0;d<8;d++){let m=c+s[d],h=l+A[d],u=h*t+m;r[u]===0&&(r[u]=2,a.push({x:m,y:h}))}}return r}async function Qu(e,t={}){let n=!(!t.debug||t.debug._timingsOnly),i=[],o=performance.now(),r,a,s;if(t.skipGrayscale)r=t.width,a=t.height,s=e,n&&(t.debug.grayscale=s);else{r=e.width,a=e.height;let R=performance.now();s=(function(y){let{width:x,height:N,data:U}=y,M=new Uint8ClampedArray(x*N);for(let B=0,D=0;B<U.length;B+=4,D++)M[D]=54*U[B]+183*U[B+1]+19*U[B+2]>>8;return M})(e);let E=performance.now();i.push({step:"Grayscale",ms:(E-R).toFixed(2)}),n&&(t.debug.grayscale=s)}let A=t.lowThreshold!==void 0?t.lowThreshold:null,c=t.highThreshold!==void 0?t.highThreshold:null;if(A===null||c===null){let E=new Uint32Array(1024),y=0;for(let M=1;M<a-1;M++)for(let B=1;B<r-1;B++){let D=M*r+B,P=-s[D-r-1]+s[D-r+1]-2*s[D-1]+2*s[D+1]-s[D+r-1]+s[D+r+1],H=-s[D-r-1]-2*s[D-r]-s[D-r+1]+s[D+r-1]+2*s[D+r]+s[D+r+1],F=Math.abs(P)+Math.abs(H);F>=1024&&(F=1023),F>0&&(E[F]++,y++)}let x=Math.round(.7*y),N=0,U=75;for(let M=1;M<1024;M++)if(N+=E[M],N>=x){U=M;break}A===null&&(A=Math.max(5,Math.round(.5*U))),c===null&&(c=Math.min(500,Math.round(1.5*U)))}let l=t.kernelSize||5,d=t.sigma||0,m=t.L2gradient!==void 0&&t.L2gradient,h=t.applyDilation===void 0||t.applyDilation,u=t.dilationKernelSize||5,f=t.useWasmHysteresis!==void 0&&t.useWasmHysteresis,p=t.useWasmFullCanny!==void 0&&t.useWasmFullCanny;if(A>=c&&([A,c]=[c,A]),p)try{await Rt();let R=performance.now(),E=new Uint8ClampedArray((function(N,U,M,B,D,P,H,F,G,V){let W=Yi(N,ae.__wbindgen_malloc),z=_e,X=ae.canny_edge_detector_full(W,z,U,M,B,D,P,H,F,G,V);var S=Fn(X[0],X[1]).slice();return ae.__wbindgen_free(X[0],1*X[1],1),S})(s,r,a,A,c,l,d,m,h,u)),y=(performance.now()-R).toFixed(2);i.push({step:"Edge Processing (WASM)",ms:y}),n&&(t.debug.finalEdges=E),t.debug?t.debug.timings=i:t.debug={timings:i};let x=performance.now();return i.unshift({step:"Edge Detection Total",ms:(x-o).toFixed(2)}),E}catch(R){rs||(rs=!0,R instanceof Error?R.message:String(R))}let g,C,w,Q,k,I;g=performance.now();try{await Rt(),w=(function(R,E,y,x,N){let U=Yi(R,ae.__wbindgen_malloc),M=_e,B=ae.blur(U,M,E,y,x,N);var D=Fn(B[0],B[1]).slice();return ae.__wbindgen_free(B[0],1*B[1],1),D})(s,r,a,l,d)}catch{w=Bu(s,r,a,l,d)}C=performance.now(),i.push({step:"Gaussian Blur",ms:(C-g).toFixed(2)}),n&&(t.debug.blurred=w),g=performance.now();{let R=(function(E,y,x){let N=new Int16Array(y*x),U=new Int16Array(y*x);for(let M=1;M<x-1;M++){let B=M*y,D=(M-1)*y,P=(M+1)*y;for(let H=1;H<y-1;H++){let F=B+H,G=E[D+H-1],V=E[D+H],W=E[D+H+1],z=E[B+H-1],X=E[B+H+1],S=E[P+H-1],_=E[P+H],K=E[P+H+1],$=W-G+2*(X-z)+(K-S),T=S+2*_+K-(G+2*V+W);N[F]=$,U[F]=T}}return{dx:N,dy:U}})(w,r,a);Q=R.dx,k=R.dy}C=performance.now(),i.push({step:"Gradients",ms:(C-g).toFixed(2)}),g=performance.now();try{await Rt(),I=await yu(Q,k,r,a,m)}catch{I=(function(R,E,y,x,N){let U=new Float32Array(y*x),M=new Float32Array(y*x);for(let B=0;B<R.length;B++){let D=R[B],P=E[B];U[B]=N?Math.sqrt(D*D+P*P):Math.abs(D)+Math.abs(P)}for(let B=1;B<x-1;B++)for(let D=1;D<y-1;D++){let P=B*y+D,H=U[P];if(H===0){M[P]=0;continue}let F=R[P],G=E[P],V=0,W=0,z=Math.abs(F),X=Math.abs(G);if(X>2.4142*z)V=U[P-y],W=U[P+y];else if(z>2.4142*X)V=U[P-1],W=U[P+1];else{let S=(F^G)<0?-1:1;G>0?(V=U[(B-1)*y+(D-S)],W=U[(B+1)*y+(D+S)]):(V=U[(B+1)*y+(D-S)],W=U[(B-1)*y+(D+S)]),F>0&&G>0||F<0&&G<0?(V=U[(B-1)*y+(D+1)],W=U[(B+1)*y+(D-1)]):(V=U[(B-1)*y+(D-1)],W=U[(B+1)*y+(D+1)])}M[P]=H>=V&&H>=W?H:0}return M})(Q,k,r,a,m)}C=performance.now(),i.push({step:"Non-Max Suppression",ms:(C-g).toFixed(2)}),g=performance.now();let b=m?A*A:A,v=m?c*c:c,O;if(f)try{await Rt(),O=Cu(I,r,a,b,v)}catch{O=as(I,r,a,b,v)}else O=as(I,r,a,b,v);C=performance.now(),i.push({step:"Hysteresis",ms:(C-g).toFixed(2)}),g=performance.now();let L=new Uint8ClampedArray(r*a);for(let R=0;R<O.length;R++)L[R]=O[R]===2?255:0;C=performance.now(),i.push({step:"Binary Image",ms:(C-g).toFixed(2)}),g=performance.now();let q=L;if(h)try{await Rt(),q=(function(R,E,y,x){let N=Yi(R,ae.__wbindgen_malloc),U=_e,M=ae.dilate(N,U,E,y,x);var B=Fn(M[0],M[1]).slice();return ae.__wbindgen_free(M[0],1*M[1],1),B})(L,r,a,u)}catch{q=(function(R,E,y,x=5){let N=Math.floor(x/2),U=new Uint8ClampedArray(E*y),M=new Uint8ClampedArray(E*y);for(let B=0;B<y;B++){let D=B*E;for(let P=0;P<E;P++){let H=0;for(let F=-N;F<=N;F++){let G=P+F;if(G>=0&&G<E){let V=R[D+G];V>H&&(H=V)}}U[D+P]=H}}for(let B=0;B<E;B++)for(let D=0;D<y;D++){let P=0;for(let H=-N;H<=N;H++){let F=D+H;if(F>=0&&F<y){let G=U[F*E+B];G>P&&(P=G)}}M[D*E+B]=P}return M})(L,r,a,u)}if(C=performance.now(),i.push({step:"Dilation",ms:(C-g).toFixed(2)}),n){t.debug.dx=Q,t.debug.dy=k;let R=new Float32Array(r*a);for(let E=0;E<Q.length;E++){let y=Q[E],x=k[E];R[E]=m?Math.sqrt(y*y+x*x):Math.abs(y)+Math.abs(x)}t.debug.magnitude=R,t.debug.suppressed=I,t.debug.edgeMap=O,t.debug.cannyEdges=L,t.debug.finalEdges=q}t.debug?t.debug.timings=i:t.debug||(t.debug={timings:i});let Z=performance.now();return i.unshift({step:"Edge Detection Total",ms:(Z-o).toFixed(2)}),q}function Ft(e){return e<=0?0:e>=1?1:e}function Pt(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function ss(e){return[Pt(e.topLeft,e.topRight),Pt(e.topRight,e.bottomRight),Pt(e.bottomRight,e.bottomLeft),Pt(e.bottomLeft,e.topLeft)]}function Su(e){let t=(function(i){let o=[i.topLeft,i.topRight,i.bottomRight,i.bottomLeft],r=[];for(let a=0;a<o.length;a++){let s=o[(a+o.length-1)%o.length],A=o[a],c=o[(a+1)%o.length],l=s.x-A.x,d=s.y-A.y,m=c.x-A.x,h=c.y-A.y,u=l*m+d*h,f=Math.max(1e-6,Math.hypot(l,d)*Math.hypot(m,h)),p=Math.max(-1,Math.min(1,u/f));r.push(180*Math.acos(p)/Math.PI)}return r})(e),n=0;for(let i of t)n+=Ft(1-Math.abs(i-90)/55);return n/Math.max(1,t.length)}function As(e,t){let n=Number(t.isValid)-Number(e.isValid);if(n!==0)return n;let i=t.confidence-e.confidence;if(!(Math.abs(i)<.015)&&i!==0)return i;let o=Math.abs((e.approxCount??99)-4)-Math.abs((t.approxCount??99)-4);if(o!==0)return o;let r=(t.rightAngleScore??0)-(e.rightAngleScore??0);if(Math.abs(r)>1e-6)return r;let a=Math.abs(1-(e.contourFitRatio??1))-Math.abs(1-(t.contourFitRatio??1));return Math.abs(a)>1e-6?a:i||t.score-e.score||t.coverageRatio-e.coverageRatio||t.area-e.area}function wu(e,t,n,i,o={}){let r=o.epsilon||.02,a=cs(e.points,r).length,s=fu(e,{epsilon:r});if(!s)return{contour:e,corners:null,score:0,confidence:0,isValid:!1,area:e.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:a,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};let A=n*i,c=e.area||0,l=e.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},d=c/Math.max(1,(l.maxX-l.minX+1)*(l.maxY-l.minY+1)),m=(function(F){if(!F)return 0;let G=[F.topLeft,F.topRight,F.bottomRight,F.bottomLeft],V=0;for(let W=0;W<G.length;W++){let z=(W+1)%G.length;V+=G[W].x*G[z].y-G[z].x*G[W].y}return Math.abs(V)/2})(s),h=m/Math.max(1,A),u=ss(s),f=Math.min(...u),p=(u[0]+u[2])/2,g=(u[1]+u[3])/2,C=p>g?p/Math.max(1e-6,g):g/Math.max(1e-6,p),w=(function(F){let G=[F.topLeft,F.topRight,F.bottomRight,F.bottomLeft],V=[];for(let z=0;z<G.length;z++){let X=G[z],S=G[(z+1)%G.length],_=G[(z+2)%G.length],K=(S.x-X.x)*(_.y-S.y)-(S.y-X.y)*(_.x-S.x);Math.abs(K)<1e-6||V.push(Math.sign(K))}if(V.length<3)return!1;let W=V[0];return V.every(z=>z===W)})(s),Q=(function(F,G,V,W){if(!F?.points||F.points.length===0)return 0;let z=Math.max(1,Math.floor(F.points.length/240)),X=0,S=0;for(let _=0;_<F.points.length;_+=z){let K=F.points[_],$=Math.max(0,Math.min(V-1,0|K.x)),T=Math.max(0,Math.min(W-1,0|K.y));X++;let Y=!1;for(let j=-1;j<=1&&!Y;j++){let ie=T+j;if(!(ie<0||ie>=W))for(let ee=-1;ee<=1;ee++){let oe=$+ee;if(!(oe<0||oe>=V)&&G[ie*V+oe]>0){Y=!0;break}}}Y&&S++}return X===0?0:S/X})(e,t,n,i),k=Su(s),I=(function(F){let G=ss(F);return(Math.min(G[0],G[2])/Math.max(1e-6,Math.max(G[0],G[2]))+Math.min(G[1],G[3])/Math.max(1e-6,Math.max(G[1],G[3])))/2})(s),b=c/Math.max(1,m),v=Ft(1-Math.abs(b-1)/.55),O=a===4?1:a===5?.9:a===6?.7:a<=8?.5:.28,L=Ft(c/Math.max(1,.4*A)),q=Ft((d-.08)/.72),Z=Ft((h-.03)/.82),R=o.minDocumentSideRatio!==void 0?o.minDocumentSideRatio:.06,E=o.minDocumentCoverageRatio!==void 0?o.minDocumentCoverageRatio:.04,y=o.maxDocumentAspectRatio!==void 0?o.maxDocumentAspectRatio:8,x=o.minDocumentFillRatio!==void 0?o.minDocumentFillRatio:.07,N=o.minContourFitRatio!==void 0?o.minContourFitRatio:.11,U=o.maxContourFitRatio!==void 0?o.maxContourFitRatio:1.2,M=o.minRightAngleScore!==void 0?o.minRightAngleScore:.42,B=o.minOppositeSideConsistency!==void 0?o.minOppositeSideConsistency:.3,D=Math.min(n,i)*R,P=(function(F,G=6){let V=[F?.topLeft,F?.topRight,F?.bottomRight,F?.bottomLeft];if(V.some(W=>!W||!Number.isFinite(W.x)||!Number.isFinite(W.y)))return!1;for(let W=0;W<V.length;W++)for(let z=W+1;z<V.length;z++)if(Pt(V[W],V[z])<G)return!1;return!0})(s)&&w&&f>=D&&h>=E&&C<=y&&d>=x&&b>=N&&b<=U&&k>=M&&I>=B,H=.22*L+.14*q+.15*O+.08*(w?1:0)+.08*Q+.13*Z+.1*k+.05*I+.05*v;return{contour:e,corners:s,score:H,confidence:P?H:.33*H,isValid:P,area:c,fillRatio:d,coverageRatio:h,cornersArea:m,approxCount:a,convex:w,edgeSupport:Q,aspectRatio:C,minSide:f,rightAngleScore:k,oppositeSideConsistency:I,contourFitRatio:b,contourFitScore:v}}async function ku(e,t,n,i,o={}){let r=o.debug?{}:{_timingsOnly:!0},a=[];r&&!r._timingsOnly&&(r.preprocessing={scaledDimensions:{width:t,height:n},scaleFactor:i,maxProcessingDimension:o.maxProcessingDimension||800});let s=(function(g={}){let C=g.dilationKernelSize||3,w=g.dilationIterations||1,Q=g.applyDilation===void 0||g.applyDilation,k=[{name:"default",lowThreshold:g.lowThreshold,highThreshold:g.highThreshold,dilationKernelSize:C,dilationIterations:w,applyDilation:Q}];if(g.enableDetectionCascade===!1)return k;k.push({name:"connect-edges",lowThreshold:g.lowThreshold,highThreshold:g.highThreshold,dilationKernelSize:Math.max(C,5),dilationIterations:Math.max(w,2),applyDilation:!0}),k.push({name:"no-dilation",lowThreshold:g.lowThreshold,highThreshold:g.highThreshold,dilationKernelSize:C,dilationIterations:w,applyDilation:!1}),g.lowThreshold===void 0&&g.highThreshold===void 0&&k.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:C,dilationIterations:w,applyDilation:Q});let I=[],b=new Set;for(let v of k){let O=[v.lowThreshold,v.highThreshold,v.dilationKernelSize,v.dilationIterations,v.applyDilation].join(":");b.has(O)||(b.add(O),I.push(v))}return I})(o),A=[],c=async(g,C)=>{let w=g.name||`pass-${C+1}`,Q=C===0?"":` (${w})`,k=o.debug?{}:{_timingsOnly:!0},I=await Qu(e,{width:t,height:n,lowThreshold:g.lowThreshold,highThreshold:g.highThreshold,dilationKernelSize:g.dilationKernelSize,dilationIterations:g.dilationIterations,applyDilation:g.applyDilation,debug:k,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:o.useWasmHysteresis,useWasmFullCanny:o.useWasmFullCanny});k.timings&&k.timings.forEach(q=>{q.step!=="Edge Detection Total"&&a.push({step:`${q.step}${Q}`,ms:q.ms})});let b=performance.now(),v=gu(I,{minArea:(o.minArea||1e3)/(i*i),width:t,height:n});a.push({step:`Find Contours${Q}`,ms:(performance.now()-b).toFixed(2)}),b=performance.now();let{best:O,candidates:L}=(function(q,Z,R,E,y={}){let x=y.maxCandidateContours||12,N=q.slice(0,x).map((U,M)=>({rankByArea:M,...wu(U,Z,R,E,y)})).sort(As);return{best:N[0]||null,candidates:N}})(v,I,t,n,o);return a.push({step:`Corner Detection${Q}`,ms:(performance.now()-b).toFixed(2)}),{name:w,params:{lowThreshold:g.lowThreshold,highThreshold:g.highThreshold,dilationKernelSize:g.dilationKernelSize,dilationIterations:g.dilationIterations,applyDilation:g.applyDilation},contours:v,best:O,candidates:L}},l=await c(s[0],0);if(A.push(l),(function(g,C={}){if(C.enableDetectionCascade===!1)return!1;if(!g||!g.corners)return!0;let w=C.minCascadeTriggerConfidence!==void 0?C.minCascadeTriggerConfidence:.68;return!g.isValid||g.confidence<w||g.approxCount>5||g.rightAngleScore<.55||g.contourFitRatio<.14})(l.best,o))for(let g=1;g<s.length;g++)A.push(await c(s[g],g));let d=[];for(let g of A)for(let C of g.candidates)d.push({...C,passName:g.name,passParams:g.params});d.sort(As);let m=d[0]||null,h=d;if(!m||!m.corners)return{success:!1,message:"No document detected",debug:r._timingsOnly?null:r,timings:a};r&&!r._timingsOnly&&(r.passes=A.map(g=>({name:g.name,params:g.params,contourCount:g.contours.length,bestCandidate:g.best?{score:g.best.score,confidence:g.best.confidence,isValid:g.best.isValid,approxCount:g.best.approxCount,coverageRatio:g.best.coverageRatio,fillRatio:g.best.fillRatio,rightAngleScore:g.best.rightAngleScore,contourFitRatio:g.best.contourFitRatio}:null})),r.candidates=h.map(g=>({passName:g.passName,rankByArea:g.rankByArea,area:g.area,fillRatio:g.fillRatio,coverageRatio:g.coverageRatio,cornersArea:g.cornersArea,approxCount:g.approxCount,convex:g.convex,edgeSupport:g.edgeSupport,aspectRatio:g.aspectRatio,minSide:g.minSide,rightAngleScore:g.rightAngleScore,oppositeSideConsistency:g.oppositeSideConsistency,contourFitRatio:g.contourFitRatio,contourFitScore:g.contourFitScore,score:g.score,confidence:g.confidence,isValid:g.isValid})),r.selectedCandidate=h[0]?{passName:h[0].passName,rankByArea:h[0].rankByArea,area:h[0].area,fillRatio:h[0].fillRatio,coverageRatio:h[0].coverageRatio,approxCount:h[0].approxCount,edgeSupport:h[0].edgeSupport,aspectRatio:h[0].aspectRatio,minSide:h[0].minSide,rightAngleScore:h[0].rightAngleScore,oppositeSideConsistency:h[0].oppositeSideConsistency,contourFitRatio:h[0].contourFitRatio,score:h[0].score,confidence:h[0].confidence,isValid:h[0].isValid}:null);let u=m.corners,f=m.contour,p=u;return i!==1&&(p={topLeft:{x:u.topLeft.x*i,y:u.topLeft.y*i},topRight:{x:u.topRight.x*i,y:u.topRight.y*i},bottomRight:{x:u.bottomRight.x*i,y:u.bottomRight.y*i},bottomLeft:{x:u.bottomLeft.x*i,y:u.bottomLeft.y*i}}),{success:!0,contour:f,corners:p,confidence:m.confidence,debug:r._timingsOnly?null:r,timings:a}}function Mu(e,t,n){let{topLeft:i,topRight:o,bottomRight:r,bottomLeft:a}=n,s=Math.hypot(r.x-a.x,r.y-a.y),A=Math.hypot(o.x-i.x,o.y-i.y),c=Math.round(Math.max(s,A)),l=Math.hypot(o.x-r.x,o.y-r.y),d=Math.hypot(i.x-a.x,i.y-a.y),m=Math.round(Math.max(l,d));e.canvas.width=c,e.canvas.height=m,(function(h,u,f,p,g){let C=u&&typeof u.width=="number"&&typeof u.height=="number"&&u.data,w=u.width||u.naturalWidth,Q=u.height||u.naturalHeight,k=document.createElement("canvas");k.width=w,k.height=Q;let I=k.getContext("2d",{willReadFrequently:!0});C?I.putImageData(u,0,0):I.drawImage(u,0,0,w,Q);let b=I.getImageData(0,0,w,Q).data,v=(function(P){let H=P[0][0],F=P[0][1],G=P[0][2],V=P[1][0],W=P[1][1],z=P[1][2],X=P[2][0],S=P[2][1],_=P[2][2],K=W*_-z*S,$=-(V*_-z*X),T=V*S-W*X,Y=-(F*_-G*S),j=H*_-G*X,ie=-(H*S-F*X),ee=F*z-G*W,oe=-(H*z-G*V),le=H*W-F*V,se=H*K+F*$+G*T;if(se===0)throw new Error("Singular matrix");return[[K/se,Y/se,ee/se],[$/se,j/se,oe/se],[T/se,ie/se,le/se]]})(f),O=v[0][0],L=v[0][1],q=v[0][2],Z=v[1][0],R=v[1][1],E=v[1][2],y=v[2][0],x=v[2][1],N=v[2][2],U=h.createImageData(p,g),M=U.data,B=w-1,D=Q-1;for(let P=0;P<g;P++){let H=L*P+q,F=R*P+E,G=x*P+N;for(let V=0;V<p;V++){let W=1/(y*V+G),z=(O*V+H)*W,X=(Z*V+F)*W,S=z<0?0:z>B?B:z,_=X<0?0:X>D?D:X,K=0|S,$=0|_,T=K<B?K+1:K,Y=$<D?$+1:$,j=S-K,ie=_-$,ee=1-j,oe=1-ie,le=ee*oe,se=j*oe,Ae=ee*ie,Ee=j*ie,be=$*w+K<<2,je=$*w+T<<2,Ze=Y*w+K<<2,te=Y*w+T<<2,ne=P*p+V<<2;M[ne]=b[be]*le+b[je]*se+b[Ze]*Ae+b[te]*Ee+.5|0,M[ne+1]=b[be+1]*le+b[je+1]*se+b[Ze+1]*Ae+b[te+1]*Ee+.5|0,M[ne+2]=b[be+2]*le+b[je+2]*se+b[Ze+2]*Ae+b[te+2]*Ee+.5|0,M[ne+3]=255}}h.putImageData(U,0,0)})(e,t,(function(h,u){let f=(function(p,g){let C=p.length,w=p[0].length,Q=p.map(b=>b.slice()),k=g.slice();for(let b=0;b<w;b++){let v=b;for(let O=b+1;O<C;O++)Math.abs(Q[O][b])>Math.abs(Q[v][b])&&(v=O);[Q[b],Q[v]]=[Q[v],Q[b]],[k[b],k[v]]=[k[v],k[b]];for(let O=b+1;O<C;O++){let L=Q[O][b]/Q[b][b];for(let q=b;q<w;q++)Q[O][q]-=L*Q[b][q];k[O]-=L*k[b]}}let I=new Array(w);for(let b=w-1;b>=0;b--){let v=k[b];for(let O=b+1;O<w;O++)v-=Q[b][O]*I[O];I[b]=v/Q[b][b]}return I})((function(p){let g=[];for(let C=0;C<4;C++){let[w,Q]=p[C];g.push([w,Q,1,0,0,0,-w*u[C][0],-Q*u[C][0]]),g.push([0,0,0,w,Q,1,-w*u[C][1],-Q*u[C][1]])}return g})(h),[u[0][0],u[0][1],u[1][0],u[1][1],u[2][0],u[2][1],u[3][0],u[3][1]]);return[[f[0],f[1],f[2]],[f[3],f[4],f[5]],[f[6],f[7],1]]})([[i.x,i.y],[o.x,o.y],[r.x,r.y],[a.x,a.y]],[[0,0],[c-1,0],[c-1,m-1],[0,m-1]]),c,m)}async function gs(e,t={}){let n=[],i=performance.now(),o=t.mode||"detect",r=t.output||"canvas",a=t.maxProcessingDimension||800,s,A,c,l;if((t.detector||"classical")==="ml"){A=performance.now();let{detectDocumentMl:m}=await Promise.resolve().then(()=>(ns(),ts));s=await m(e,t.ml||{}),n.push({step:"ML Detection Total",ms:(performance.now()-A).toFixed(2)}),s.timings&&s.timings.forEach(h=>n.push(h))}else{A=performance.now();let{grayscaleData:m,scaleFactor:h,scaledDimensions:u}=await(async function(f,p=800){let g,C,w=f&&typeof f.width=="number"&&typeof f.height=="number"&&f.data;if(w)g=f.width,C=f.height;else{if(!f)throw new Error("No image provided");g=f.width||f.naturalWidth,C=f.height||f.naturalHeight}let Q=Math.max(g,C),k,I,b;if(Q<=p)k=g,I=C,b=1;else{let E=p/Q;k=Math.round(g*E),I=Math.round(C*E),b=1/E}let v=typeof OffscreenCanvas<"u",O=v?new OffscreenCanvas(k,I):document.createElement("canvas");v||(O.width=k,O.height=I);let L=O.getContext("2d",{willReadFrequently:!0});if(L.imageSmoothingEnabled=!0,L.imageSmoothingQuality="medium",w){let E=v?new OffscreenCanvas(g,C):document.createElement("canvas");v||(E.width=g,E.height=C),E.getContext("2d").putImageData(f,0,0),L.drawImage(E,0,0,g,C,0,0,k,I)}else L.drawImage(f,0,0,g,C,0,0,k,I);let q=L.getImageData(0,0,k,I),Z=q.data,R=new Uint8ClampedArray(k*I);for(let E=0,y=0;E<Z.length;E+=4,y++){let x=54*Z[E]+183*Z[E+1]+19*Z[E+2]>>8;R[y]=x,Z[E]=Z[E+1]=Z[E+2]=x}return{grayscaleData:R,imageData:q,scaleFactor:b,originalDimensions:{width:g,height:C},scaledDimensions:{width:k,height:I}}})(e,a);n.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-A).toFixed(2)}),s=await ku(m,u.width,u.height,h,t),s.timings&&s.timings.forEach(f=>n.push(f))}if(!s.success){let m=performance.now();return n.unshift({step:"Total",ms:(m-i).toFixed(2)}),{output:null,corners:null,contour:null,confidence:s.confidence||null,score:s.score??null,debug:s.debug,success:!1,message:s.message||"No document detected",timings:n}}o==="detect"?l=null:o==="extract"&&(A=performance.now(),c=document.createElement("canvas"),Mu(c.getContext("2d"),e,s.corners),n.push({step:"Perspective Transform",ms:(performance.now()-A).toFixed(2)})),o!=="detect"&&c&&(A=performance.now(),l=r==="canvas"?c:r==="imagedata"?c.getContext("2d").getImageData(0,0,c.width,c.height):r==="dataurl"?c.toDataURL():c,n.push({step:"Output Conversion",ms:(performance.now()-A).toFixed(2)}));let d=performance.now();return n.unshift({step:"Total",ms:(d-i).toFixed(2)}),{output:l,corners:s.corners,contour:s.contour??null,confidence:s.confidence||null,score:s.score??null,debug:s.debug,success:!0,message:"Document detected",timings:n}}var ae,uu,du,Tt,_e,_t,Lt,Ln,rs,Ki,ms=J(()=>{"use strict";uu=1e3,du=10;Tt=null;_e=0;_t=null;Lt=null;Ln=null,rs=!1,Ki=null});var zi={};ue(zi,{DOC_DETECT_MIN_CONFIDENCE:()=>hs,DOC_DETECT_WIDTH:()=>Xe,SCANIC_VERSION:()=>xu,detectQuad:()=>Du});async function Du(e){let t=await gs(e,{mode:"detect",detector:"classical",maxProcessingDimension:Xe});return!t.success||t.corners===null||typeof t.confidence=="number"&&t.confidence<hs?null:t.corners}var xu,hs,Xi=J(()=>{"use strict";ms();xn();xu="1.5.0",hs=.35});var $i={};ue($i,{CAPTURE_CANDIDATE_SPACING_MS:()=>Es,CAPTURE_EXTRA_CANDIDATES:()=>ys,CaptureSessionDoc:()=>ji,DOC_CADENCE_HZ:()=>Is,DOC_SHUTTER_DEFAULTS:()=>Nn,passportBandOf:()=>Cs,resolveDocShutterTuning:()=>Zi,warmDocDetector:()=>Tu});async function vu(e){return Nt===null&&(Nt=(await Promise.resolve().then(()=>(Xi(),zi))).detectQuad),Nt(e)}async function Ru(e){let t=Ei(e);return t===null?null:{topLeft:{x:t.x,y:t.y},topRight:{x:t.x+t.width,y:t.y},bottomRight:{x:t.x+t.width,y:t.y+t.height},bottomLeft:{x:t.x,y:t.y+t.height}}}function Tu(){Nt===null&&Promise.resolve().then(()=>(Xi(),zi)).then(e=>{Nt=e.detectQuad}).catch(()=>{})}function Zi(e){let t=e!==null&&typeof e=="object"?e:{},n=(i,o,r)=>typeof i=="number"&&Number.isFinite(i)&&i>=o&&i<=r?i:void 0;return{manualShutterMs:n(t.manualShutterMs,1e3,6e4)??Nn.manualShutterMs,detectedNoLockMs:n(t.steadyMs,300,3e4)!==void 0?t.steadyMs+(n(t.lockMs,0,1e4)??450):Nn.detectedNoLockMs}}function Cs(e,t,n,i,o){let r=Math.min(i,e.width*1.06*t),a=Math.min(o,Math.max(e.height*1.6*n,r/5)),s=(e.y+e.height/2)*n,A=Math.max(0,Math.min(i-r,(e.x-e.width*.03)*t)),c=Math.max(0,Math.min(o-a,s-a/2));return{x:A,y:c,w:r,h:a}}function ps(e,t){let n=e.x*t.width,i=e.y*t.height,o=(e.x+e.width)*t.width,r=(e.y+e.height)*t.height;return{topLeft:{x:n,y:i},topRight:{x:o,y:i},bottomRight:{x:o,y:r},bottomLeft:{x:n,y:r}}}function _u(e,t,n){let i=Ge(e);return t.width<=0||t.height<=0?0:n==="ID-3"?i.width/t.width:i.width*i.height/(t.width*t.height)}function fs(e,t){let n=e.videoWidth,i=e.videoHeight;if(n===0||i===0)return null;let o=Math.min(1,t/n),r=Math.round(n*o),a=Math.round(i*o),s=document.createElement("canvas");s.width=r,s.height=a;let A=s.getContext("2d",{willReadFrequently:!0});return A===null?null:(n/Math.max(1,r)>4&&(A.imageSmoothingQuality="high"),A.drawImage(e,0,0,r,a),A.getImageData(0,0,r,a))}function Pn(e,t){let n=[t.topLeft.x,t.topRight.x,t.bottomRight.x,t.bottomLeft.x],i=[t.topLeft.y,t.topRight.y,t.bottomRight.y,t.bottomLeft.y],o=Math.max(0,Math.floor(Math.min(...n))),r=Math.max(0,Math.floor(Math.min(...i))),a=Math.min(e.width,Math.ceil(Math.max(...n))),s=Math.min(e.height,Math.ceil(Math.max(...i))),A=Math.max(1,a-o),c=Math.max(1,s-r),l=new Uint8ClampedArray(A*c*4);for(let d=0;d<c;d++){let m=((r+d)*e.width+o)*4;l.set(e.data.subarray(m,m+A*4),d*A*4)}return{data:l,width:A,height:c,colorSpace:e.colorSpace}}function Fu(e,t){return e==="glare"?"glare":e==="too_small"?"too_far":e==="too_big"?"too_close":t?"too_dark":e==="blurry"?"blurry":e==="off_center"?"edge_clipped":e==="no_card"?"sensing":"hold_still"}var Nt,Is,Nn,ji,ys,Es,Lu,Pu,Gn=J(()=>{"use strict";zt();nt();ii();qe();Qa();Ma();xn();bi();Ja();Vi();Ni();Ji();wt();Bn();Nt=null;Is=Object.freeze({LOW:3,MID:5,HIGH:6}),Nn=Object.freeze({manualShutterMs:6e3,detectedNoLockMs:1950});ji=class e{constructor(t){this.torchOn=!1;this.stillRefusals=0;this.zoom=1;this.positioningSince=null;this.detectedSince=null;this.lastSeenAt=null;this.lastGuideQuad=null;this.lastOcrReady=null;this.shutterOffered=!1;this.stats=e.freshStats();this.handlers=new Map;this.stream=null;this.timer=null;this.state="idle";this.lastGuidance=null;this.attempt=0;this.capturing=!1;this.feedback=new wn;this.lastFeedbackKey=null;this.lastQuad=null;this.lastDetect=null;this.opts=t,this.gate=new kn(t.format??"ID-1",t.thresholds);let n=t.deviceClass??rn(on());this.deviceClass=n,this.camera=t.camera??vn,this.shutterTuning=t.shutter??Nn,this.guideTuning=t.guideLock??vt,this.guideLock=new _n(this.guideTuning),this.cadenceMs=1e3/Is[n]}on(t,n){let i=this.handlers.get(t);return i||(i=new Set,this.handlers.set(t,i)),i.add(n),()=>i?.delete(n)}emit(t,n){for(let i of[...this.handlers.get(t)??[]])i(n)}async start(){let t=++this.attempt;this.gate.reset(),this.resetSide(),this.feedback.reset(),this.lastFeedbackKey=null,this.lastGuidance=null,this.capturing=!1,this.setState("preflight");try{let n=this.opts.getUserMedia??(r=>navigator.mediaDevices.getUserMedia(r));this.setState("acquiring");let i=this.opts.enumerateDevices??(this.opts.getUserMedia===void 0&&typeof navigator<"u"&&navigator.mediaDevices?.enumerateDevices?()=>navigator.mediaDevices.enumerateDevices():void 0),o=await za({getUserMedia:n,...i!==void 0?{enumerateDevices:i}:{},lensSelection:this.camera.lensSelection,base:Da});if(this.stream=o.stream,Wt(this.stream),t!==this.attempt){for(let r of this.stream.getTracks())r.stop();return}if(this.opts.upgradeResolution!==!1&&await this.upgradeResolution(),t!==this.attempt||(await this.applyFocusAndZoom(),t!==this.attempt))return;this.opts.video.srcObject=this.stream,await this.opts.video.play().catch(()=>{}),this.setState("positioning"),this.scheduleTick(t)}catch(n){let i=tt(n);this.setState("error"),this.emit("error",{kind:i,retryable:!0})}}rearm(t){t!==void 0&&(this.opts.side=t),this.gate.reset(),this.resetSide(),this.feedback.reset(),this.lastFeedbackKey=null,this.lastGuidance=null,this.capturing=!1,this.stillRefusals=0,this.state==="captured"&&(this.setState("positioning"),this.scheduleTick(this.attempt))}async captureNow(){if(this.state!=="positioning"||this.capturing)return;let t=this.opts.video,n=this.lastDetect?.width??Math.max(1,t.videoWidth),i=this.lastDetect?.height??Math.max(1,t.videoHeight),o=this.lastQuad??this.lastGuideQuad??{topLeft:{x:0,y:0},topRight:{x:n,y:0},bottomRight:{x:n,y:i},bottomLeft:{x:0,y:i}},r=(this.opts.now??(()=>performance.now()))(),a=this.feedback.force("processing",r);this.lastFeedbackKey=a.key,this.emit("feedback",a),await this.fire(this.attempt,this.lastOcrReady!==null?this.lastOcrReady.quad:o,{width:n,height:i,tickSharpness:this.lastDetect?.tickSharpness??0},this.lastOcrReady?.via??"manual")}captureReport(){let t=this.stats;return{...this.opts.side!==void 0?{side:this.opts.side}:{},format:this.opts.format??"ID-1",deviceClass:this.deviceClass,video:{width:this.opts.video.videoWidth||0,height:this.opts.video.videoHeight||0},zoom:this.zoom,...t.zoomFallbackAtMs!==void 0?{zoomFallbackAtMs:t.zoomFallbackAtMs}:{},...t.msToCapture!==void 0?{msToCapture:t.msToCapture}:{},...t.via!==void 0?{via:t.via}:{},...t.shutterAtMs!==void 0?{shutterAtMs:t.shutterAtMs}:{},...t.shutterReason!==void 0?{shutterReason:t.shutterReason}:{},ticks:t.ticks,quadFraming:{...t.quadFraming},qualityBlockers:{...t.qualityBlockers},guideBlockers:{...t.guideBlockers},stillRefusals:t.stillRefusals,...this.ocrReport()}}ocrReport(){let t=this.opts.ocr;if(t===void 0)return{};let n=(this.opts.format??"ID-1")==="ID-3"||this.opts.side==="single"?"single":this.opts.side==="verso"?"verso":"recto",i=t.report(n,this.stats.via,(this.opts.now??(()=>performance.now()))());return i===null?{}:{ocr:i}}static freshStats(){return{ticks:0,quadFraming:{},qualityBlockers:{},guideBlockers:{},stillRefusals:0}}setGuide(t){t===void 0?delete this.opts.guide:this.opts.guide=t,this.guideLock.reset()}guideRegion(t){let n=t.width/Math.max(1,t.height),i=this.opts.guide;if(i!==void 0&&i.viewAspect>0){let s={width:i.viewAspect,height:1},A={x:i.rect.x*i.viewAspect,y:i.rect.y,width:i.rect.width*i.viewAspect,height:i.rect.height};return ja(s,A,n,0)}let o=Yr(this.opts.format??"ID-1").center,r=.86,a=r*n/o;return a>.84&&(a=.84,r=a*o/n),{x:(1-r)/2,y:(1-a)/2,width:r,height:a}}resetSide(){this.positioningSince=null,this.detectedSince=null,this.lastSeenAt=null,this.guideLock.reset(),this.lastGuideQuad=null,this.lastOcrReady=null,this.opts.ocr?.reset(),this.stats=e.freshStats(),this.shutterOffered&&(this.shutterOffered=!1,this.emit("shutter",{available:!1}))}withdrawShutter(){this.shutterOffered&&(this.shutterOffered=!1,this.emit("shutter",{available:!1}))}zoomFallback(t){let n=this.videoTrack();if(n===null||this.zoom<=1)return;let i=this.focusCaps(),o=typeof i?.zoom?.min=="number"?Math.max(i.zoom.min,1):1;this.zoom=o,this.stats.zoomFallbackAtMs=Math.round(t-(this.positioningSince??t)),this.guideLock.reset(),this.gate.reset(),n.applyConstraints({advanced:[{zoom:o}]}).catch(()=>{})}offerShutter(t,n){this.shutterOffered||(this.shutterOffered=!0,this.stats.shutterAtMs=Math.round(n-(this.positioningSince??n)),this.stats.shutterReason=t,this.emit("shutter",{available:!0,reason:t}))}torchAvailable(){try{return this.stream?.getVideoTracks?.()[0]?.getCapabilities?.()?.torch===!0}catch{return!1}}async setTorch(t){this.torchOn=t;try{await this.stream?.getVideoTracks?.()[0]?.applyConstraints({advanced:[{torch:t}]})}catch{}}destroy(){if(this.attempt+=1,this.timer!==null&&(this.opts.clearTimer??clearTimeout)(this.timer),this.timer=null,this.stream)for(let t of this.stream.getTracks())t.stop();this.stream=null,this.opts.video.srcObject=null}async upgradeResolution(){try{let t=this.stream?.getVideoTracks?.()[0];if(t===void 0)return;let n=t.getSettings?.()??{},i=Ta(t.getCapabilities?.(),{width:n.width??0,height:n.height??0},this.deviceClass,{width:this.camera.width,height:this.camera.height});i!==null&&await t.applyConstraints(i)}catch{}}focusCaps(){try{return this.videoTrack()?.getCapabilities?.()??null}catch{return null}}async applyFocusAndZoom(){let t=this.videoTrack();if(t===null)return;let n=this.focusCaps();this.camera.continuousFocus&&Rn(n,"continuous")&&await t.applyConstraints({advanced:[{focusMode:"continuous"}]}).catch(()=>{});let i={width:0,height:0};try{let r=t.getSettings?.()??{};i={width:r.width??0,height:r.height??0}}catch{}let o=Wa(n,i,this.opts.format??"ID-1",this.camera);if(o>1)try{await t.applyConstraints({advanced:[{zoom:o}]}),this.zoom=o}catch{this.zoom=1}}async focusAt(t,n){let i=this.videoTrack(),o=Ui(this.focusCaps(),t,n);if(!(i===null||o===null))try{await i.applyConstraints({advanced:[o]}),(this.opts.setTimer??setTimeout)(()=>{this.restoreContinuous()},1500)}catch{}}async restoreContinuous(){let t=this.videoTrack();t===null||!this.camera.continuousFocus||!Rn(this.focusCaps(),"continuous")||await t.applyConstraints({advanced:[{focusMode:"continuous"}]}).catch(()=>{})}async refocusOn(t,n){let i=this.camera.refocusBeforePhotoMs,o=this.videoTrack();if(i<=0||o===null||n.width<=0||n.height<=0)return;let r=Ge(t),a=Ui(this.focusCaps(),(r.x+r.width/2)/n.width,(r.y+r.height/2)/n.height);if(a!==null)try{await o.applyConstraints({advanced:[a]});let s=this.opts.setTimer??setTimeout;await new Promise(A=>{s(()=>A(),i)})}catch{}}videoTrack(){try{return this.stream?.getVideoTracks?.()[0]??null}catch{return null}}async takeStill(t,n,i){if(this.opts.captureStill!==void 0)return this.opts.captureStill(this.opts.video,t,n);let o=this.opts.format??"ID-1",r=this.videoTrack();if(i&&this.opts.photoCapture!==!1&&this.deviceClass!=="LOW"&&!this.torchOn&&r!==null&&Oa(r)){await this.refocusOn(t,n);let a=await Va(this.opts.video,t,n,o,{track:r,detect:this.detector(),detectWidth:Xe});if(this.restoreContinuous(),a!==null)return a}return Ua(this.opts.video,t,n,o)}detector(){return this.opts.detect??((this.opts.format??"ID-1")==="ID-3"?Ru:vu)}setState(t){this.state=t,this.emit("statechange",{state:t})}scheduleTick(t){let n=this.opts.setTimer??setTimeout;this.timer=n(()=>{this.tick(t)},this.cadenceMs)}async tick(t){if(t!==this.attempt||this.state!=="positioning"||this.capturing)return;let n=this.opts.now??(()=>performance.now()),i=this.opts.grabDetectFrame??fs,o=this.detector(),r=i(this.opts.video,Xe);if(r===null){this.scheduleTick(t);return}let a=null;try{a=await o(r)}catch{a=null}if(t!==this.attempt)return;let s=a!==null?Pn(r,a):r,A=n(),c={sharpness:we(s),exposure:it(s),meanLuma:Ke(s),specularFraction:wa(s)},l=ka({format:this.opts.format??"ID-1",quad:a,frameWidth:r.width,frameHeight:r.height,measures:c,...this.opts.thresholds!==void 0?{thresholds:this.opts.thresholds}:{}}),d=this.gate.tick({timestampMs:A,quad:a,quality:c,frameWidth:r.width,frameHeight:r.height}),h=(this.opts.format??"ID-1")!=="ID-3"?Za(r,this.guideRegion(r),{edgePeakFrac:this.guideTuning.edgePeakFrac}):Dt,u=this.guideLock.tick(h,A);this.lastGuideQuad=u.detected?$a(h):null;let f=this.capturing?null:this.ocrTick(r,a,h,u.detected,l,A);this.positioningSince??(this.positioningSince=A);let p=this.stats;if(p.ticks+=1,p.quadFraming[l.framing]=(p.quadFraming[l.framing]??0)+1,l.framing==="ok"&&!d.ready){let L=l.lighting!=="ok"?l.lighting:l.glare!=="ok"?"glare":l.blur!=="ok"?"blurry":"steadying";p.qualityBlockers[L]=(p.qualityBlockers[L]??0)+1}p.guideBlockers[u.blocker]=(p.guideBlockers[u.blocker]??0)+1,a!==null||u.detected?(this.detectedSince??(this.detectedSince=A),this.lastSeenAt=A):this.detectedSince=null,this.lastSeenAt!==null&&A-this.lastSeenAt<=Pu?A-this.positioningSince>=this.shutterTuning.manualShutterMs?this.offerShutter("timeout",A):f?.suspendQuality!==!0&&this.detectedSince!==null&&A-this.detectedSince>=this.shutterTuning.detectedNoLockMs&&this.offerShutter("detected_no_lock",A):this.withdrawShutter();let w=A-(this.lastSeenAt??this.positioningSince);this.zoom>1&&this.camera.zoomFallbackMs>0&&w>=this.camera.zoomFallbackMs&&this.zoomFallback(A),this.emit("checks",{engine:"docv1",p:d.p,plausible:d.plausible,stableTicks:d.stableTicks,quad:d.quad,frameWidth:r.width,frameHeight:r.height,analysis:l,ready:f?.suspendQuality!==!0&&(d.ready&&a!==null||u.ready&&this.lastGuideQuad!==null)||this.lastOcrReady!==null,guide:{detected:u.detected,blocker:u.blocker,fill:h.fill,shape:h.shape,content:h.content,offsetX:h.offsetX,offsetY:h.offsetY},...f!==null&&f.mode!=="off"?{ocr:{mode:f.mode,...f.mrz?{mrz:f.mrz}:{},...f.lock?{lock:f.lock}:{}}}:f?.mrz?{ocr:{mode:f.mode,mrz:f.mrz}}:{}}),this.lastQuad=d.plausible?a:null,this.lastDetect={width:r.width,height:r.height,tickSharpness:c.sharpness};let Q=Ba(l);l.framing!=="ok"&&u.detected&&(Q=Fu(u.blocker,h.brightness<this.guideTuning.darkBrightness)),Q==="blurry"&&a!==null&&_u(a,r,this.opts.format??"ID-1")>=this.camera.focusFarFillFrac&&(Q="focus_far"),Q==="sensing"&&this.zoom>1&&this.camera.noDocFarHintMs>0&&w>=this.camera.noDocFarHintMs&&(Q="focus_far");let k=this.feedback.tick(Q,A);if(k.key!==this.lastFeedbackKey&&(this.lastFeedbackKey=k.key,this.emit("feedback",k)),d.guidanceKey!==this.lastGuidance&&(this.lastGuidance=d.guidanceKey,this.emit("guidance",{key:d.guidanceKey})),this.capturing)return;let I=f?.suspendQuality!==!0,b=I&&d.ready&&a!==null,v=I&&u.ready&&this.lastGuideQuad!==null,O=this.lastOcrReady;if(O!==null&&this.opts.autoCapture!==!1){let L=this.feedback.force("processing",A);this.lastFeedbackKey=L.key,this.emit("feedback",L);let q=we(Pn(r,O.quad));await this.fire(t,O.quad,{width:r.width,height:r.height,tickSharpness:q},O.via);return}if((b||v)&&this.opts.autoCapture!==!1){let L=this.feedback.force("processing",A);this.lastFeedbackKey=L.key,this.emit("feedback",L);let q=v?this.lastGuideQuad:a,Z=v?u.via==="steady"?"guide_steady":"guide_good":"quad",R=v?we(Pn(r,q)):c.sharpness;await this.fire(t,q,{width:r.width,height:r.height,tickSharpness:R},Z);return}this.scheduleTick(t)}async fire(t,n,i,o){this.capturing=!0;let r=this.opts.grabDetectFrame??fs,a=this.opts.setTimer??setTimeout,s={width:i.width,height:i.height};try{let A={still:await this.takeStill(n,s,!0),sharpness:i.tickSharpness};if(t!==this.attempt)return;let c=A.still.source==="photo"?0:ys;for(let m=0;m<c;m++){if(await new Promise(f=>{a(()=>f(),Es)}),t!==this.attempt)return;let h=r(this.opts.video,Xe);if(h===null)continue;let u=we(Pn(h,n));if(u>A.sharpness*Lu){let f=await this.takeStill(n,s,!1);if(t!==this.attempt)return;A={still:f,sharpness:u}}}if(t!==this.attempt)return;let l=A.still.sharpness;if(this.opts.autoCapture!==!1&&o!=="manual"&&typeof l=="number"&&l>=0&&l<this.camera.stillSharpnessMin&&this.stillRefusals<this.camera.stillRefusalsMax){this.stillRefusals+=1,this.stats.stillRefusals+=1,this.guideLock.reset(),this.lastOcrReady=null,(o==="text_lock"||o==="live_mrz")&&this.opts.ocr?.rearmFace();let m=(this.opts.now??(()=>performance.now()))(),h=this.feedback.force("focus_far",m);this.lastFeedbackKey=h.key,this.emit("feedback",h),this.capturing=!1,this.gate.reset(),this.scheduleTick(t);return}this.stillRefusals=0;let d=(this.opts.now??(()=>performance.now()))();this.stats.via=o,this.stats.msToCapture=Math.round(d-(this.positioningSince??d)),this.shutterOffered&&(this.shutterOffered=!1,this.emit("shutter",{available:!1})),this.setState("captured"),this.emit("artifacts",{keyframe:A.still.blob,previewDataUrl:A.still.previewDataUrl,...this.opts.side!==void 0?{side:this.opts.side}:{},...A.still.docRegion!==void 0?{docRegion:A.still.docRegion}:{},...(()=>{let m=o==="live_mrz"?this.opts.ocr?.liveCapture():null;return m?{liveMrz:m}:{}})()})}catch{if(t!==this.attempt)return;this.capturing=!1,this.gate.reset(),this.guideLock.reset(),this.lastOcrReady=null,(o==="text_lock"||o==="live_mrz")&&this.opts.ocr?.rearmFace(),this.scheduleTick(t)}}ocrTick(t,n,i,o,r,a){let s=this.opts.ocr,A=this.opts.video;if(s===void 0||!s.hasEngine)return this.lastOcrReady=null,null;let c=A.videoWidth,l=A.videoHeight;if(c<=0||l<=0||t.width<=0||t.height<=0)return null;let m=(this.opts.format??"ID-1")==="ID-3",h=this.guideRegion(t),u={x:h.x*c,y:h.y*l,w:h.width*c,h:h.height*l},f=c/t.width,p=l/t.height,g;m&&n!==null?g=Cs(Ge(n),f,p,c,l):g=Aa(u,s.bandTop,l);let C=m?r.glare==="ok":i.cardGlare<=this.guideTuning.glareMax,w=m?r.blur==="ok":i.sharpness>=this.guideTuning.sharpnessMin,Q=s.tick({atMs:a,video:A,mrzFace:m||this.opts.side==="verso"||this.opts.side==="single",present:m||n!==null||o,card:u,band:g,portrait:l>c,glareOk:C,sharpOk:w});if(Q.ready&&Q.via!==void 0){let k=m?n??ps(h,t):this.lastGuideQuad??ps(h,t);this.lastOcrReady={quad:k,via:Q.via}}else this.lastOcrReady=null;return Q}};ys=2,Es=260,Lu=1.08;Pu=1200});var Bs={};ue(Bs,{SAME_FACE_MAX_DROPS:()=>bs,createDocumentCapture:()=>Vu,createDocumentCaptureInternal:()=>On,warmDocumentCapture:()=>Uu});async function Gu(e){let t=await Promise.resolve().then(()=>(Gn(),$i));return new t.CaptureSessionDoc(e)}function Ou(e){return{topLeft:{x:e.x,y:e.y},topRight:{x:e.x+e.width,y:e.y},bottomRight:{x:e.x+e.width,y:e.y+e.height},bottomLeft:{x:e.x,y:e.y+e.height}}}function Hu(e,t,n){let i=[e.topLeft,e.topRight,e.bottomRight,e.bottomLeft],o=0;for(let r=0;r<i.length;r+=1){let a=i[r],s=i[(r+1)%i.length];o+=a.x*s.y-s.x*a.y}return t>0&&n>0?Math.abs(o)/2/(t*n):0}function Uu(){Promise.resolve().then(()=>(Gn(),$i)).then(e=>e.warmDocDetector()).catch(()=>{})}function Vu(e){return On(e,{}).handle}function On(e,t){let n=Pe(),i=at({enabled:e.keepScreenAwake!==!1}),o=t.decode??(S=>createImageBitmap(S)),r=t.blurRefuseSharpnessMax??.16,a=t.now??(()=>performance.now()),s=e.documentType==="passport"||e.side==="single",A=Ci(s?"singlePage":"twoSided",a());if(!s&&(e.side==="recto"||e.side==="verso")){let S=e.side==="recto"?"verso":"recto";A={...A,captured:{[S]:"server"},readSides:[S],current:e.side,phase:"flipCue",restPhase:"flipCue"}}let c="idle",l=null,d=null,m=!0,h=0,u=0,f=!1,p=!1,g="",C=null,w,Q=null,k=[],I=t.webOcr!==void 0?Ca(t.webOcr.captureDocument,{mode:e.liveMrz?.mode??"auto"}):null,b=null,v=I===null||!I.enabled?"off":null,O=null,L=null,q=new WeakMap,Z="";if(I!==null&&I.enabled&&t.webOcr!==void 0){let S=t.webOcr,_=ya(I,{baseUrl:e.liveMrz?.assetBaseUrl??S.baseUrl,salt:S.salt,...e.liveMrz?.workerUrl!==void 0?{workerUrl:e.liveMrz.workerUrl}:{},...S.createWorker!==void 0?{createWorker:S.createWorker}:{}});if(_.ok){b=_.engine;let K=new bn({textLock:I.textLock,liveMrz:I.liveMrz});O=K;let $=_.engine;$.ready.then(T=>{v=T,typeof T!="string"&&m&&K.setEngine($)})}else v=_.reason}let R=S=>{let _=JSON.stringify(S);_!==Z&&(Z=_,n.emit("mrz",S))},E=(S,_)=>{let K=t.webOcr?.reports;if(K===void 0||I===null||S===void 0)return;let $=S.format==="ID-3"||S.side==="single"?"single":S.side==="verso"?"verso":"recto",T=$!=="recto"?I.liveMrzArm??I.frontLockArm:I.frontLockArm;if(T===null||Math.random()>=I.reportSampleRate)return;let Y=S.via==="live_mrz"?L:null,j=()=>{let ie=Y?.value??null;K([Ea({arm:T,capture:$,assist:S.ocr??null,load:T==="control"?"off":v,...S.msToCapture!==void 0?{msToCapture:S.msToCapture}:{},...ie!==null&&ie.stillConfirmed!==void 0?{stillConfirmed:ie.stillConfirmed}:{},..._!==void 0?{typeMismatch:vi(_.format,e.documentType==="passport"?"passport":"card")}:{}})])};Y!==null&&Y.value===null?Promise.race([Y.promise,new Promise(ie=>setTimeout(ie,3e3))]).then(j):j()},y=S=>{!m||S===c||(c=S,i.setActive(S==="starting"||S==="scanning"),n.emit("state",S))},x=(S,_)=>_===void 0?null:s?"single":S.captured.recto===_?"recto":S.captured.verso===_?"verso":null,N=S=>({phase:S.phase,captured:s?S.captured.recto!==void 0?["single"]:[]:["recto","verso"].filter(_=>S.captured[_]!==void 0),expected:s?null:S.current??null,notice:S.notice??null,lastShot:x(S,S.lastShot),manualShutter:S.manualShutter,torchAvailable:l?.torchAvailable()??!1,torch:p}),U=()=>{let S=l;S!==null&&S.captureNow().catch(()=>M({type:"captureFailed",at:a()}))};function M(S){if(!m)return;let _=A;A=ta(A,S),A.phase==="capturing"&&_.phase!=="capturing"&&Promise.resolve().then(U),A.phase==="result"&&_.phase!=="result"&&(y("done"),B());let K=N(A),$=JSON.stringify(K);$!==g&&(g=$,n.emit("scan",K))}function B(){Q!==null&&clearInterval(Q),Q=null;for(let S of k.splice(0))S();l?.destroy(),l=null,i.setActive(!1)}let D=()=>l?.captureReport?.(),P=!1,H=(S,_)=>{if(!(S===void 0||t.onFaceReport===void 0))try{t.onFaceReport(S,_)}catch{}},F=S=>{Z="",!(l===null||A.phase==="reading"||A.phase==="result")&&(P=!1,l.rearm(s?"single":A.current??S))},G=async(S,_,K,$)=>{if(L=null,$!==void 0&&b!==null&&I?.liveMrz?.hint===!0){let ee={promise:ca(b,S,$,{engine:Mt,detectorLimit:I.liveMrz.detectorLimit}).catch(()=>null),value:null};ee.promise.then(oe=>{ee.value=oe}),L=ee}$!==void 0&&vi($.format,e.documentType==="passport"?"passport":"card")&&R({state:"mismatch",format:$.format});let T=D();H(T,"captured"),P=!0,E(T,$);let Y=K===void 0?C:K===null?null:{quad:Ou(K),frameWidth:0,frameHeight:0,inStill:!0},j={decoded:null},ie=()=>(j.decoded??(j.decoded=Promise.resolve().then(()=>o(S)).catch(()=>null)),j.decoded);try{await V(S,_,Y,ie,L)}finally{j.decoded!==null&&(await j.decoded)?.close()}},V=async(S,_,K,$,T)=>{let Y=`shot-${h+=1}`;if(M({type:"captured",id:Y,at:a()}),e.haptics!==!1)try{globalThis.navigator?.vibrate?.(30)}catch{}if(!f&&r>0){let ee=await(t.measureSharpness!==void 0?t.measureSharpness(S,K):$().then(oe=>oe===null?-1:In(oe,kt(K?.quad??null,K?.inStill===!0?oe:{width:K?.frameWidth??0,height:K?.frameHeight??0},oe)))).catch(()=>-1);if(!m)return;if(Number.isFinite(ee)&&ee>=0&&ee<r){f=!0;let oe=s?"recto":A.current??(A.captured.recto===void 0?"recto":"verso");M({type:"readFailed",side:oe,id:Y,issue:"blurry"}),F(oe);return}}f=!1;let j;if(s)j="single";else{let ee=A.current,oe=await(t.classify!==void 0?t.classify(S):$().then(le=>le===null?ee??"recto":K?.inStill===!0?Bi(le,480,null,!0):Bi(le,480,kt(K?.quad??null,{width:K?.frameWidth??0,height:K?.frameHeight??0},le)))).catch(()=>ee??"recto");if(!m)return;if(A.captured[oe]!==void 0&&u<bs){u+=1,M({type:"duplicate",id:Y,side:oe}),F(oe==="recto"?"verso":"recto");return}j=A.captured[oe]!==void 0&&ee!==void 0?ee:oe,u=0,M({type:"classified",id:Y,side:j})}let ie=j==="verso"?"verso":"recto";try{let ee=t.encode!==void 0?await t.encode(S):await $().then(oe=>{if(oe===null)throw new Error("the still could not be decoded");return Xr(oe)});if(!m)return;T!==null&&q.set(ee.blob,T),n.emit("captured",{image:ee.blob,side:j,documentType:e.documentType,...e.issuer!==void 0?{issuer:e.issuer}:{},width:ee.width,height:ee.height,previewDataUrl:_}),t.deferRead!==!0&&M({type:"readOk",side:ie})}catch{M({type:"readFailed",side:ie,id:Y,issue:"technical"}),n.emit("error",{kind:"generic",retryable:!0})}F(ie==="recto"?"verso":"recto")},W=S=>{k.push(S.on("statechange",({state:_})=>{_==="preflight"||_==="acquiring"?y("starting"):_==="positioning"?y("scanning"):_==="captured"?y("captured"):_==="error"&&y("error")}),S.on("feedback",({key:_,reticle:K})=>n.emit("feedback",{key:_,reticle:K})),S.on("checks",_=>{n.emit("gate",{progress:_.p,quad:_.quad,frameWidth:_.frameWidth,frameHeight:_.frameHeight,..._.guide!==void 0?{guide:{detected:_.guide.detected,fill:_.guide.fill,offsetX:_.guide.offsetX??0,offsetY:_.guide.offsetY??0}}:{}});let K=_.ocr?.mrz;K!==void 0&&(K.state==="fallback"?R({state:"fallback",reason:K.reason}):K.state==="valid"?R({state:"valid",format:K.format}):K.state==="reading"?R({state:"reading",...K.format?{format:K.format}:{},...K.coach?{coach:K.coach}:{}}):R({state:"searching"}));let $=_.quad===null?0:Hu(_.quad,_.frameWidth,_.frameHeight);C=_.quad===null?null:{quad:_.quad,frameWidth:_.frameWidth,frameHeight:_.frameHeight},M({type:"report",report:{present:_.quad!==null&&_.plausible||_.guide?.detected===!0,ready:_.ready===!0,locking:_.p>=.5,areaFrac:$},at:a()})}),S.on("error",({kind:_,retryable:K})=>n.emit("error",{kind:Ai(_),retryable:K})),S.on("artifacts",_=>{G(_.keyframe,_.previewDataUrl,_.docRegion,_.liveMrz)}))},z=()=>(d??(d=(async()=>{if(m){if(l===null){let S=await(t.createEngine??Gu)({...t.engineOptions??{},...w!==void 0?{guide:w}:{},video:e.video,format:Kr(e.documentType),side:s?"single":e.side??"recto",autoCapture:!1,...O!==null?{ocr:O}:{}});if(!m){S.destroy();return}l=S,W(S);let _=t.tickMs??500;_>0&&(Q=setInterval(()=>M({type:"tick",at:a()}),_))}M({type:"clockRestart"}),I!==null&&I.liveMrzArm==="live"&&(v==="unsupported"||v==="off")&&R({state:"fallback",reason:v}),await l.start()}})().finally(()=>{d=null})),d);return{handle:{get state(){return c},on:(S,_)=>n.on(S,_),start:z,retry:()=>{if(l===null&&A.phase==="result"){M({type:"retake"}),u=0,f=!1,z();return}if(l!==null&&c!=="error"){M({type:"retake"}),u=0,f=!1,l.rearm(s?"single":void 0);return}z()},setSide:S=>{s||S==="single"||(A.current!==S&&(A={...A,current:S}),M({type:"clockRestart"}),A.phase!=="reading"&&A.phase!=="result"&&l?.rearm(S))},shutter:U,focusAt:(S,_)=>{l?.focusAt?.(S,_)},setGuide:S=>{w=S,l?.setGuide?.(S)},setTorch:S=>{p=S,l?.setTorch(S),M({type:"tick",at:a()})},destroy:()=>{if(m&&l!==null&&c!=="done"){let S=D();!P&&S!==void 0&&S.ticks>0&&H(S,"abandoned"),E(S,void 0)}m=!1,B(),O?.setEngine(null),b?.dispose(),b=null,n.clear()}},setFlowState:S=>{(A.phase==="reading"||A.phase==="result")&&y(S==="done"&&A.phase!=="result"?"scanning":S)},settle:(S,_)=>{let K=S==="verso"?"verso":"recto";M(_.ok?{type:"readOk",side:K}:{type:"readFailed",side:K,issue:_.issue}),_.ok||F(K)},takeDeviceRead:S=>q.get(S.image)?.value??null}}var bs,eo=J(()=>{"use strict";hn();mn();wt();ft();fi();jr();na();ra();Bn();la();ba();bs=2});var Qs,Ss=J(()=>{"use strict";Qs=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW"]});function to(e,t){let n=e.byIssuer?.[t]??e.default;return Ju.filter(i=>n==="*"||n.includes(i))}function ws(e,t=Qs){return[...new Set([...t,...Object.keys(e.byIssuer??{})])].filter(i=>to(e,i).length>0).sort()}function ks(e){if(e.acceptedDocuments)return e.acceptedDocuments;let t=e.acceptedDocumentTypes?.length?[...e.acceptedDocumentTypes]:["carte_identite","passport"];return{default:[],byIssuer:{MR:t}}}var Ju,no=J(()=>{"use strict";Ss();Ju=["carte_identite","passport","residence_permit"]});function Me(e){let t=e?.portrait,n=t?.icao,i=t?.purpose==="id_document";return n==null?i?{policy:"reject",profile:"id_document"}:null:{policy:n.policy==="alert"&&!i?"alert":"reject",profile:i||n.profile==="id_document"?"id_document":"selfie"}}function Hn(e){return{...e.baselineEyeOpenness!==void 0?{baselineEyeOpenness:e.baselineEyeOpenness}:{},criteria:e.verdict??{},...e.backgroundCheck!==void 0?{backgroundCheck:e.backgroundCheck}:{}}}var ut=J(()=>{"use strict"});function xs(e){let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let r of e)r.x<t&&(t=r.x),r.y<n&&(n=r.y),r.x>i&&(i=r.x),r.y>o&&(o=r.y);return e.length===0?{x:0,y:0,width:0,height:0}:{x:t,y:n,width:i-t,height:o-n}}function Vn(e,t,n){if(e.length<468)return null;let i=m=>{let h=e[m];return{x:h.x*t,y:h.y*n}},o=[0,1].map(m=>{let h=e.length>Ms[1]?i(Ms[m]):null,[u,f]=Yu[m];return h??Ds(i(u),i(f))}),r=Ku.map(m=>xs(m.map(i))),a=[];for(let m=0;m<Math.min(e.length,468);m+=1)a.push(i(m));let[s,A]=o,c=s.x>A.x,l=c?A:s,d=c?s:A;return{leftEye:l,rightEye:d,iod:Math.hypot(d.x-l.x,d.y-l.y),box:xs(a),nose:i(qu),leftEyeBox:c?r[1]:r[0],rightEyeBox:c?r[0]:r[1]}}function vs(e,t="column"){if(e.length<16||e.some(m=>!Number.isFinite(m)))return null;let n=(m,h)=>t==="column"?e[h*4+m]:e[m*4+h],i=Math.hypot(n(0,0),n(1,0),n(2,0))||1,o=n(0,0)/i,r=n(1,0)/i,a=n(2,0)/i,s=n(2,1)/i,A=n(2,2)/i,c=Math.asin(Math.max(-1,Math.min(1,-a)))*Un,l=Math.atan2(s,A)*Un,d=Math.atan2(r,o)*Un;return{yaw:c,pitch:l,roll:d}}function Rs(e){return Math.atan2(e.rightEye.y-e.leftEye.y,e.rightEye.x-e.leftEye.x)*Un}function Gt(e){let t=io,n=e.iod>=t.iodMin&&e.iod<=t.iodMax?1:t.iodMin/Math.max(e.iod,1e-6),i=t.width/n,o=t.height/n,r=Ds(e.leftEye,e.rightEye);return{x:r.x-t.eyeX/t.width*i,y:r.y-t.eyeY/t.height*o,width:i,height:o}}function Ts(e,t,n){let i=Math.max(0,-e.x),o=Math.max(0,-e.y),r=Math.max(0,e.x+e.width-t),a=Math.max(0,e.y+e.height-n);return Math.max((i+r)/e.width,(o+a)/e.height)}function _s(e,t,n,i){let o=Gt(e),r=o.x+o.width/2,a=o.y+o.height/2,s=io.width/io.height,A=Math.max(o.height*i.margin,i.minHeight,i.minWidth/s);A=Math.min(A,n,t/s);let c=A*s,l=Math.min(Math.max(r-c/2,0),Math.max(0,t-c)),d=Math.min(Math.max(a-A/2,0),Math.max(0,n-A));return{x:Math.round(l),y:Math.round(d),width:Math.round(c),height:Math.round(A)}}var Ms,Yu,Ku,qu,Ds,Un,io,Jn=J(()=>{"use strict";Ms=[468,473],Yu=[[33,133],[362,263]],Ku=[[33,7,163,144,145,153,154,155,133,173,157,158,159,160,161,246],[362,382,381,380,374,373,390,249,263,466,388,387,386,385,384,398]],qu=1;Ds=(e,t)=>({x:(e.x+t.x)/2,y:(e.y+t.y)/2});Un=180/Math.PI;io={width:480,height:640,eyeX:240,eyeY:289,iodMin:120,iodMax:160}});var Ns={};ue(Ns,{ICAO_GATE_CRITERIA:()=>dt,createIcaoGate:()=>ao,eyeOpenness:()=>ro,judgeIcao:()=>Fs,percentile:()=>Ps,scoreFrame:()=>oo});function Fs(e,t){let n=e.pose,i;if(n!==null){let u=n.pitch-t.pitchOffsetDeg,f=Math.max(Math.abs(n.yaw),Math.abs(u),Math.abs(n.roll));i=Math.abs(n.yaw)<=t.yawDeg&&Math.abs(u)<=t.pitchDeg&&Math.abs(n.roll)<=t.rollDeg?ye(f):he(f,"pose")}else i={...He(!1,"pose"),value:e.eyeLineRoll??null};let o=He(!1,"eyes");if(e.eyes!==null){let u=e.baseline,f=Math.min(e.eyes.left,e.eyes.right),p=Math.max(1-t.eyes.blinkMax,u!==null&&u>0&&u<=1?t.eyes.relativeMin*u:0),g=u!==null&&u>0?f/u:null;o=f>=p-1e-9?ye(g):he(g,"eyes")}let r=He(!1,"mouth");if(e.mouth!==null){let{jawOpen:u,smile:f,pucker:p}=e.mouth,g=Math.max(u/t.mouth.jawOpenMax,f/t.mouth.smileMax,p/t.mouth.puckerMax);r=u<=t.mouth.jawOpenMax&&f<=t.mouth.smileMax&&p<=t.mouth.puckerMax?ye(g):he(g,"mouth")}let a=e.lighting,s=He(!0,"lighting");if(a!==null){let[u,f]=t.lighting.faceLuma,[p,g]=t.lighting.halfRatio;s=a.faceLuma<u||a.faceLuma>f||a.clipped>t.lighting.clippedMax?he(a.faceLuma,"lighting"):a.halfRatio<p||a.halfRatio>g?he(a.halfRatio,"lighting_side"):ye(a.faceLuma)}let A=e.uniformity,c=e.background,l=t.background.required?A!=null&&t.backgroundCheck.enabled?A.uniform?ye(A.colorStd):he(A.colorStd,"background"):c===null?He(!0,"background"):c.luma>=t.background.lumaMin&&c.sd<=t.background.lumaSdMax?ye(c.luma):he(c.luma,"background"):He(!0,"background"),d=t.resolution,m=Math.min(e.frameWidth,e.frameHeight)>=d.minWidth&&Math.max(e.frameWidth,e.frameHeight)>=d.minHeight,h=e.iod>=d.minIodPx&&m?ye(e.iod):he(e.iod,"resolution");return{pose:i,eyes:o,mouth:r,lighting:s,background:l,resolution:h}}function ro(e){let t=e?.eyeBlinkLeft,n=e?.eyeBlinkRight;return typeof t!="number"||typeof n!="number"?null:{left:1-t,right:1-n,blinkLeft:t,blinkRight:n}}function Ps(e,t){if(e.length===0)return null;let n=[...e].sort((o,r)=>o-r),i=Math.min(n.length-1,Math.max(0,Math.ceil(t*n.length)-1));return n[i]}function oo(e,t,n){let i={},o=e.geometry;if(e.faces!==1||o===null){let u=e.faces>1?he(e.faces,"multiple_faces"):he(e.faces,"no_face");for(let f of dt)i[f]=f==="face"?u:He(!1,"no_face");return{results:i,pose:null}}i.face=ye(1);let r=Gt(o),a=Ts(r,e.frameWidth,e.frameHeight);i.framing=r.height>e.frameHeight*1.02||r.width>e.frameWidth*1.02?he(a,"too_close"):a>.02?he(a,"center"):ye(a);let s=e.matrix!=null?vs(e.matrix):null,A=ro(e.blendshapes),c=e.blendshapes,l=e.stats??null,d=Fs({pose:s,eyeLineRoll:Math.abs(Rs(o)),eyes:A,baseline:n,mouth:c==null?null:{jawOpen:c.jawOpen??0,smile:Math.max(c.mouthSmileLeft??0,c.mouthSmileRight??0),pucker:c.mouthPucker??0},lighting:l?.lighting??null,background:l?.background??null,uniformity:e.backgroundCheck??null,iod:o.iod,frameWidth:e.frameWidth,frameHeight:e.frameHeight},t);Object.assign(i,d);let m=l?.eyeSpecular??null;i.glare=m===null?He(!0,"glare"):m<=t.glare.specularMax?ye(m):he(m,"glare");let h=l?.sharpness??null;return i.sharpness=h===null||h>=t.sharpnessMin?ye(h):he(h,"hold_still"),{results:i,pose:s}}function ao(e,t={}){let n=t.policy==="alert",i=new Map,o=0,r=null,a=null,s={},A=[],c=null,l=null,d=m=>{if(A=A.filter(u=>m-u.at<=e.baseline.windowMs),A.length<e.baseline.minSamples)return null;let h=Ps(A.map(u=>u.open),e.baseline.percentile);return h===null||h<=0?null:Math.min(1,h)};return{push(m,h){let u=oo(m,e,null),f=ro(m.blendshapes);f!==null&&u.results.face.pass&&u.results.pose.pass&&A.push({at:h,open:(f.left+f.right)/2});let p=d(h),{results:g,pose:C}=oo(m,e,p);for(let R of dt)g[R].pass&&(R!=="eyes"||p!==null)?i.has(R)||i.set(R,h):i.delete(R);let w=R=>{let E=i.get(R);return E!==void 0&&h-E>=e.holdMs};dt.filter(R=>!Ls.has(R)).every(w)?r??(r=h):r=null;let I=R=>R==="background"&&m.backgroundCheck!=null?e.backgroundCheck.timeoutMs:e.softGraceMs,b=R=>Ls.has(R)&&!g[R].pass&&r!==null&&h-r>=I(R),v=dt.map(R=>({criterion:R,pass:g[R].pass,held:w(R),waived:b(R),value:g[R].value,coach:g[R].pass?null:g[R].coach}));o=v.every(R=>R.pass||R.waived)?o+1:0;let L=v.find(R=>!R.pass&&!R.waived)??null,q=v.filter(R=>R.held||R.waived).length;g.face.pass&&g.framing.pass?a??(a=h):a=null;let Z=v.every(R=>R.held||R.waived)&&o>=e.holdFrames||n&&a!==null&&h-a>=e.alertGraceMs;s={};for(let R of dt){let E=Wu[R];E!==void 0&&g[R].none!==!0&&(s[E]=(s[E]??!0)&&g[R].pass)}return l=m.backgroundCheck??null,c={criteria:v,coach:L?.coach??"hold",failing:L?.criterion??null,progress:q/v.length,ready:Z,baseline:p,pose:C},c},last:()=>c,summary(){let m={criteria:{}};if(c===null)return m;m.verdict={...s},c.baseline!==null&&Math.round(c.baseline*1e3)>0&&(m.baselineEyeOpenness=Math.round(c.baseline*1e3)/1e3);for(let h of c.criteria){let u=h.value===null||!Number.isFinite(h.value)?null:Math.round(h.value*1e3)/1e3;m.criteria[h.criterion]=h.waived?{pass:h.pass,value:u,waived:!0}:{pass:h.pass,value:u}}if(l!==null&&e.background.required){let{pixels:h,...u}=l;m.backgroundCheck=u}return m},reset(){i.clear(),o=0,r=null,a=null,s={},c=null,l=null}}}var dt,Ls,ye,he,He,Wu,so=J(()=>{"use strict";Jn();dt=["face","framing","pose","eyes","mouth","glare","lighting","background","resolution","sharpness"],Ls=new Set(["glare","background"]),ye=e=>({pass:!0,value:e,coach:null}),he=(e,t)=>({pass:!1,value:e,coach:t}),He=(e,t)=>({pass:e,value:null,coach:e?null:t,none:!0});Wu={pose:"pose",eyes:"eyes",mouth:"mouth",glare:"glare",lighting:"lighting",background:"background",framing:"resolution",resolution:"resolution"}});function Xu(e,t,n){let{x:i,y:o,width:r,height:a}=e;if(n)return[{x:i-1.5*r,y:o-.8*a,width:4*r,height:2.8*a}];let s=o-.4*a,A=1.4*a;return[{x:i-.9*r,y:s,width:.75*r,height:A},{x:i+1.15*r,y:s,width:.75*r,height:A}].map(c=>{let l=Math.max(0,c.x),d=Math.min(t.width,c.x+c.width);return{x:l,y:c.y,width:Math.max(0,d-l),height:c.height}})}function Gs(e,t,n,i=Yn){let o=n!==null&&n.width>0&&n.height>0,r=Xu(t,e,o),a=r.reduce((B,D)=>B+Math.max(0,D.width)*Math.max(0,D.height),0);if(a<=0)return null;let s=Math.max(1,Math.floor(Math.sqrt(a/zu))),A=o?n.data instanceof Float32Array?1:1/255:1,c=(B,D)=>{if(!o)return!1;let P=gt(B/e.width*n.width-.5,0,n.width-1),H=gt(D/e.height*n.height-.5,0,n.height-1);return n.data[H*n.width+P]*A>=i.maskThreshold},l=B=>.299*e.data[B]+.587*e.data[B+1]+.114*e.data[B+2],d=0,m=[0,0,0],h=[0,0,0],u=0,f=0,p=0,g=0,C=0,w=0,Q=0,k=0,I=0,b=0,v=Math.min(...r.map(B=>B.x)),O=Math.max(...r.map(B=>B.x+B.width)),L=Math.min(...r.map(B=>B.y)),q=Math.max(...r.map(B=>B.y+B.height)),Z=(v+O)/2,R=(L+q)/2;for(let B of r){let D=gt(B.x,0,e.width),P=gt(B.x+B.width,0,e.width),H=gt(B.y,0,e.height),F=gt(B.y+B.height,0,e.height);for(let G=H;G<F;G+=s)for(let V=D;V<P;V+=s){if(c(V,G))continue;let W=(G*e.width+V)*4;for(let X=0;X<3;X+=1){let S=e.data[W+X];m[X]=m[X]+S,h[X]=h[X]+S*S}d+=1;let z=l(W);V<Z?(p+=z,g+=1):(C+=z,w+=1),G<R?(Q+=z,k+=1):(I+=z,b+=1);for(let[X,S]of[[V+s,G],[V,G+s]])X>=P||S>=F||c(X,S)||(u+=1,Math.abs(l((S*e.width+X)*4)-z)>i.edgeLuma&&(f+=1))}}if(d<i.minPixels)return null;let E=0;for(let B=0;B<3;B+=1){let D=m[B]/d;E+=Math.max(0,h[B]/d-D*D)}let y=Math.sqrt(E/3),x=u===0?0:f/u,N=(B,D)=>D===0?null:B/D,U=(B,D)=>B===null||D===null?0:Math.abs(B-D)/255,M=Math.max(U(N(p,g),N(C,w)),U(N(Q,k),N(I,b)));return{method:o?"segmenter":"strip",uniform:y<=i.maxColorStd&&x<=i.maxEdgeDensity&&M<=i.maxGradient,colorStd:Math.round(y*10)/10,edgeDensity:Math.round(x*1e3)/1e3,gradient:Math.round(M*1e3)/1e3,pixels:d}}function Os(e){let t=e!==null&&typeof e=="object"?e:{},n=Yn,i=(o,r,a,s)=>typeof o=="number"&&Number.isFinite(o)&&o>=a&&o<=s?o:r;return{enabled:typeof t.enabled=="boolean"?t.enabled:n.enabled,hz:i(t.hz,n.hz,.5,15),segmenterTimeoutMs:i(t.segmenterTimeoutMs,n.segmenterTimeoutMs,0,6e4),segmenterBudgetMs:i(t.segmenterBudgetMs,n.segmenterBudgetMs,1,2e3),maskThreshold:i(t.maskThreshold,n.maskThreshold,0,1),maxColorStd:i(t.maxColorStd,n.maxColorStd,0,255),maxEdgeDensity:i(t.maxEdgeDensity,n.maxEdgeDensity,0,1),edgeLuma:i(t.edgeLuma,n.edgeLuma,0,255),maxGradient:i(t.maxGradient,n.maxGradient,0,1),minPixels:i(t.minPixels,n.minPixels,1,1e6),timeoutMs:i(t.timeoutMs,n.timeoutMs,0,6e4)}}var Yn,zu,gt,Ao=J(()=>{"use strict";Yn={enabled:!0,hz:3,segmenterTimeoutMs:8e3,segmenterBudgetMs:120,maskThreshold:.5,maxColorStd:28,maxEdgeDensity:.08,edgeLuma:24,maxGradient:.18,minPixels:300,timeoutMs:4e3},zu=12e3,gt=(e,t,n)=>Math.min(n,Math.max(t,Math.round(e)))});var Hs,Us=J(()=>{"use strict";Hs={id_document:{pose:{yawDeg:7,pitchDeg:7,rollDeg:5,pitchOffsetDeg:4},eyes:{relativeMin:.62,blinkMax:.48},mouth:{jawOpenMax:.13,smileMax:.28,puckerMax:.28},lighting:{faceLuma:[95,185],halfRatio:[.77,1.31],clippedMax:.015},background:{required:!0,lumaMin:165,lumaSdMax:20},resolution:{minIodPx:110,minWidth:480,minHeight:640}},selfie:{pose:{yawDeg:7,pitchDeg:7,rollDeg:7,pitchOffsetDeg:4},eyes:{relativeMin:.62,blinkMax:.48},mouth:{jawOpenMax:.13,smileMax:.28,puckerMax:.28},lighting:{faceLuma:[95,185],halfRatio:[.77,1.31],clippedMax:.015},background:{required:!1,lumaMin:165,lumaSdMax:20},resolution:{minIodPx:100,minWidth:480,minHeight:640}}}});var Ks={};ue(Ks,{ICAO_FALLBACK:()=>Ys,resolveIcaoTuning:()=>co});function Js(e){let t=Hs[e];return{profile:e,backgroundCheck:Yn,...t.pose,holdMs:500,alertGraceMs:3e3,eyes:{...t.eyes},mouth:{...t.mouth},lighting:{...t.lighting,faceLuma:[t.lighting.faceLuma[0],t.lighting.faceLuma[1]],halfRatio:[t.lighting.halfRatio[0],t.lighting.halfRatio[1]]},background:{...t.background},resolution:{...t.resolution},holdFrames:3,cadenceHz:10,baseline:{windowMs:3e3,minSamples:6,percentile:.8},sharpnessMin:.25,glare:{specularMax:.01},softGraceMs:4e3,cropMargin:1.25,camera:{width:1920,height:1080}}}function re(e,t,n,i){return typeof e=="number"&&Number.isFinite(e)&&e>=n&&e<=i?e:t}function Vs(e,t,n,i){if(!Array.isArray(e)||e.length!==2)return[t[0],t[1]];let[o,r]=e,a=re(o,Number.NaN,n,i),s=re(r,Number.NaN,n,i);return Number.isNaN(a)||Number.isNaN(s)||a>s?[t[0],t[1]]:[a,s]}function Le(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{}}function co(e,t){let n=Le(e),i=n.profile==="selfie"?"selfie":"id_document",o=i==="selfie"?Js(i):Ys,r=Le(n.eyes),a=Le(n.mouth),s=Le(n.lighting),A=Le(n.background),c=Le(n.resolution),l=Le(n.baseline),d=Le(n.glare),m=Le(n.camera),h=typeof A.required=="boolean"?A.required:o.background.required,u=Os(n.backgroundCheck);return{profile:i,yawDeg:re(n.yawDeg,o.yawDeg,1,45),pitchDeg:re(n.pitchDeg,o.pitchDeg,1,45),pitchOffsetDeg:re(n.pitchOffsetDeg,o.pitchOffsetDeg,-20,20),rollDeg:re(n.rollDeg,o.rollDeg,1,45),holdMs:re(n.holdMs,o.holdMs,0,5e3),alertGraceMs:re(n.alertGraceMs,o.alertGraceMs,0,6e4),eyes:{relativeMin:re(r.relativeMin,o.eyes.relativeMin,0,1),blinkMax:re(r.blinkMax,o.eyes.blinkMax,0,1)},mouth:{jawOpenMax:re(a.jawOpenMax,o.mouth.jawOpenMax,0,1),smileMax:re(a.smileMax,o.mouth.smileMax,0,1),puckerMax:re(a.puckerMax,o.mouth.puckerMax,0,1)},lighting:{faceLuma:Vs(s.faceLuma,o.lighting.faceLuma,0,255),halfRatio:Vs(s.halfRatio,o.lighting.halfRatio,0,10),clippedMax:re(s.clippedMax,o.lighting.clippedMax,0,1)},background:{required:h,lumaMin:re(A.lumaMin,o.background.lumaMin,0,255),lumaSdMax:re(A.lumaSdMax,o.background.lumaSdMax,0,255)},resolution:{minIodPx:re(c.minIodPx,o.resolution.minIodPx,1,2e3),minWidth:re(c.minWidth,o.resolution.minWidth,1,8e3),minHeight:re(c.minHeight,o.resolution.minHeight,1,8e3)},holdFrames:Math.round(re(n.holdFrames,o.holdFrames,1,60)),cadenceHz:re(n.cadenceHz,o.cadenceHz,1,30),baseline:{windowMs:re(l.windowMs,o.baseline.windowMs,200,3e4),minSamples:Math.round(re(l.minSamples,o.baseline.minSamples,1,300)),percentile:re(l.percentile,o.baseline.percentile,.5,1)},sharpnessMin:re(n.sharpnessMin,o.sharpnessMin,0,1),glare:{specularMax:re(d.specularMax,o.glare.specularMax,0,1)},softGraceMs:re(n.softGraceMs,o.softGraceMs,0,6e4),cropMargin:re(n.cropMargin,o.cropMargin,1,2),camera:{width:Math.round(re(m.width,o.camera.width,320,4096)),height:Math.round(re(m.height,o.camera.height,240,4096))},backgroundCheck:h?u:{...u,enabled:!1},tuningVersion:typeof t=="string"&&ju.test(t)?t:null}}var Ys,ju,lo=J(()=>{"use strict";Ao();Us();Ys=Js("id_document"),ju=/^[A-Za-z0-9._-]{1,64}$/});function qs(e){let{data:t,width:n,height:i}=e,o=new Uint8Array(n*i);for(let r=0,a=0;r<o.length;r+=1,a+=4)o[r]=Math.round(.299*(t[a]??0)+.587*(t[a+1]??0)+.114*(t[a+2]??0));return{data:o,width:n,height:i}}function uo(e,t){return{x0:Math.max(0,Math.floor(e.x)),y0:Math.max(0,Math.floor(e.y)),x1:Math.min(t.width,Math.ceil(e.x+e.width)),y1:Math.min(t.height,Math.ceil(e.y+e.height))}}function Ot(e,t,n){let i=uo(t,e),o=n===void 0?null:uo(n,e),r=0,a=0,s=0,A=0;for(let l=i.y0;l<i.y1;l+=1)for(let d=i.x0;d<i.x1;d+=1){if(o!==null&&d>=o.x0&&d<o.x1&&l>=o.y0&&l<o.y1)continue;let m=e.data[l*e.width+d];r+=1,a+=m,s+=m*m,m>=Zu&&(A+=1)}if(r===0)return{mean:0,sd:0,clipped:0,count:0};let c=a/r;return{mean:c,sd:Math.sqrt(Math.max(0,s/r-c*c)),clipped:A/r,count:r}}function Ws(e){let{box:t}=e,i=(e.leftEye.y+e.rightEye.y)/2-.1*t.height,o=t.y+.85*t.height;return{x:t.x+.15*t.width,y:i,width:.7*t.width,height:Math.max(1,o-i)}}function td(e,t){let n=Ws(t),i=Ot(e,n);if(i.count===0)return null;let o=Math.min(Math.max(t.nose.x,n.x+1),n.x+n.width-1),r=Ot(e,{x:n.x,y:n.y,width:o-n.x,height:n.height}),a=Ot(e,{x:o,y:n.y,width:n.x+n.width-o,height:n.height}),s=a.mean>0?r.mean/a.mean:r.mean>0?Number.POSITIVE_INFINITY:1;return{faceLuma:i.mean,halfRatio:s,clipped:i.clipped}}function nd(e,t){let n=0,i=0;for(let o of[t.leftEyeBox,t.rightEyeBox]){let r=o.width*.15,a=o.height*.5,s=Ot(e,{x:o.x-r,y:o.y-a,width:o.width+2*r,height:o.height+2*a});n+=s.count,i+=s.clipped*s.count}return n===0?null:i/n}function id(e,t){let n=Gt(t),{box:i}=t,o={x:i.x-.2*i.width,y:n.y,width:1.4*i.width,height:i.y+i.height-n.y},r=0,a=0,s=0;for(let c of[n.x,n.x+.8*n.width]){let l=Ot(e,{x:c,y:n.y+.04*n.height,width:.2*n.width,height:.25*n.height},o);r+=l.count,a+=l.mean*l.count,s+=(l.sd*l.sd+l.mean*l.mean)*l.count}if(r===0)return null;let A=a/r;return{luma:A,sd:Math.sqrt(Math.max(0,s/r-A*A)),count:r}}function od(e,t){let n=uo(Ws(t),e),i=Math.max(1,Math.floor(Math.max(n.x1-n.x0,n.y1-n.y0)/ed)),o=(c,l)=>e.data[l*e.width+c],r=0,a=0,s=0;for(let c=n.y0+i;c<n.y1-i;c+=i)for(let l=n.x0+i;l<n.x1-i;l+=i){let d=o(l,c-i)+o(l-i,c)+o(l+i,c)+o(l,c+i)-4*o(l,c);r+=1,a+=d,s+=d*d}if(r===0)return null;let A=a/r;return Math.min(1,Math.max(0,s/r-A*A)/$u)}function zs(e,t){return{lighting:td(e,t),eyeSpecular:nd(e,t),background:id(e,t),sharpness:od(e,t)}}var Zu,$u,ed,Xs=J(()=>{"use strict";Jn();Zu=250,$u=180,ed=96});var $s={};ue($s,{LANDMARKER_INIT_TIMEOUT_MS:()=>go,LANDMARKER_MODEL:()=>js,createFaceLandmarker:()=>mo,facesOf:()=>Zs});function Zs(e){let t=[],n=e.faceLandmarks??[];for(let i=0;i<n.length;i+=1){let o=n[i]??[],r=e.faceBlendshapes?.[i]?.categories,a=null;if(r!==void 0){a={};for(let A of r)a[A.categoryName]=A.score}let s=e.facialTransformationMatrixes?.[i]?.data;t.push({landmarks:o.map(A=>({x:A.x,y:A.y})),blendshapes:a,matrix:s!==void 0&&s.length>=16?[...s]:null})}return t}async function mo(e){let t=e.replace(/\/+$/,""),n=await import("@mediapipe/tasks-vision"),i=await n.FilesetResolver.forVisionTasks(t),o=await n.FaceLandmarker.createFromOptions(i,{baseOptions:{modelAssetPath:`${t}/${js}`,delegate:"CPU"},runningMode:"VIDEO",numFaces:2,outputFaceBlendshapes:!0,outputFacialTransformationMatrixes:!0});return{detect(r,a){try{return Zs(o.detectForVideo(r,a))}catch{return[]}},close(){try{o.close()}catch{}}}}var go,js,ho=J(()=>{"use strict";go=2e4,js="face_landmarker.task"});var nA={};ue(nA,{SEGMENTER_MODEL:()=>eA,createSelfieSegmenter:()=>rd,personMaskOf:()=>tA});function tA(e){if(e===void 0||e.length===0)return null;let t=e.length===1,n=e[0],i=Float32Array.from(n.getAsFloat32Array());if(!t)for(let o=0;o<i.length;o+=1)i[o]=1-i[o];return{data:i,width:n.width,height:n.height}}async function rd(e){let t=e.replace(/\/+$/,""),n=await import("@mediapipe/tasks-vision"),i=await n.FilesetResolver.forVisionTasks(t),o=await n.ImageSegmenter.createFromOptions(i,{baseOptions:{modelAssetPath:`${t}/${eA}`,delegate:"CPU"},runningMode:"VIDEO",outputConfidenceMasks:!0,outputCategoryMask:!1});return{segment(r,a){try{let s=o.segmentForVideo(r,a);try{return tA(s.confidenceMasks)}finally{s.close?.()}}catch{return null}},close(){try{o.close()}catch{}}}}var eA,iA=J(()=>{"use strict";eA="selfie_segmenter.tflite"});var oA={};ue(oA,{createBackgroundMonitor:()=>po});function po(e){let t=e.tuning,n=e.now??(()=>performance.now()),i=null,o=!1,r=!1,a=Number.NEGATIVE_INFINITY,s=null,A=0,c=null,l=null,d=0,m=!1,h=()=>{if(m||!t.enabled)return;m=!0;let u=(e.createSegmenter??(f=>Promise.resolve().then(()=>(iA(),nA)).then(p=>p.createSelfieSegmenter(f))))(e.assetBaseUrl);l=setTimeout(()=>{i===null&&(o=!0)},t.segmenterTimeoutMs),u.then(f=>{l!==null&&clearTimeout(l),r||o?f.close():i=f},()=>{l!==null&&clearTimeout(l),o=!0})};return{measure(u,f,p,g){if(!t.enabled||u.pixels===null)return null;h();let C=n();if(C-a<1e3/t.hz)return s;a=C;let w=u.width/Math.max(1,p),Q=u.height/Math.max(1,g),k={x:f.x*w,y:f.y*Q,width:f.width*w,height:f.height*Q},I=null;if(i!==null&&!o){let b=Math.max(C,A+1);A=b;let v=n();I=i.segment(u.source,b);let O=n()-v;d+=1,d>ad&&(c=c===null?O:c*.7+O*.3),c!==null&&c>t.segmenterBudgetMs&&(o=!0,i.close(),i=null)}return s=Gs(u.pixels,k,I,t),s},close(){r=!0,l!==null&&clearTimeout(l),i?.close(),i=null}}}var ad,fo=J(()=>{"use strict";Ao();ad=2});var bo={};ue(bo,{ANALYSIS_LONG_EDGE:()=>rA,PORTRAIT_JPEG_QUALITY:()=>sA,STILL_MAX_HEIGHT:()=>aA,createPortraitCaptureInternal:()=>Eo,defaultGrabber:()=>AA,observe:()=>cA,warmPortraitCapture:()=>ud});function Io(e){return{width:e.videoWidth||0,height:e.videoHeight||0}}function Co(e,t){if(typeof document<"u"){let n=document.createElement("canvas");return n.width=e,n.height=t,n}return typeof OffscreenCanvas=="function"?new OffscreenCanvas(e,t):null}function AA(){let e=null;return(t,n)=>{let{width:i,height:o}=Io(t);if(i===0||o===0)return null;let r=n===null?1:Math.min(1,n/Math.max(i,o)),a=Math.round(i*r),s=Math.round(o*r),A;n===null?A=Co(a,s):((e===null||e.width!==a||e.height!==s)&&(e=Co(a,s)),A=e);let c=A?.getContext("2d",{willReadFrequently:!0});if(A==null||c==null)return null;c.drawImage(t,0,0,a,s);let l=null;try{l=c.getImageData(0,0,a,s)}catch{l=null}return{source:A,width:a,height:s,pixels:l}}}async function Ad(e,t,n,i){let o=Math.round(n*t.width/t.height),r=Co(o,n),a=r?.getContext("2d");if(r==null||a==null)throw new Error("canvas unavailable");return a.fillStyle="#fff",a.fillRect(0,0,o,n),a.drawImage(e.source,t.x,t.y,t.width,t.height,0,0,o,n),"convertToBlob"in r?r.convertToBlob({type:"image/jpeg",quality:i}):new Promise((s,A)=>{r.toBlob(c=>c===null?A(new Error("encode failed")):s(c),"image/jpeg",i)})}function cd(e,t,n){return new Promise((i,o)=>{let r=setTimeout(()=>{o(new yo(`init exceeded ${t}ms`)),e.then(n,()=>{})},t);e.then(a=>{clearTimeout(r),i(a)},a=>{clearTimeout(r),o(a)})})}function ld(e){let t=tt(e),n=t==="overconstrained"?"generic":t;return{kind:n,retryable:n!=="insecure"&&n!=="unsupported"}}function cA(e,t,n,i){let o=e.length===1?e[0]:void 0,r=o===void 0?null:Vn(o.landmarks,n,i),a=null;if(o!==void 0&&t.pixels!==null){let s=Vn(o.landmarks,t.width,t.height),A=qs(t.pixels);s!==null&&(a=zs(A,s))}return{frameWidth:n,frameHeight:i,faces:e.length,geometry:r,matrix:o?.matrix??null,blendshapes:o?.blendshapes??null,stats:a}}function Eo(e,t={}){let n=co(e.tuning,e.tuningVersion),i=Pe(),o=t.now??(()=>performance.now()),r=t.setTimer??((M,B)=>setTimeout(M,B)),a=t.clearTimer??(M=>clearTimeout(M)),s=t.grabFrame??AA(),A=t.encodeRegion??Ad,c=t.getUserMedia??(M=>navigator.mediaDevices.getUserMedia(M)),l=t.createLandmarker??mo,d=e.assetBaseUrl??sd,m=at({enabled:e.keepScreenAwake!==!1}),h=ao(n,{policy:e.policy??"reject"}),u=e.video,f=po({tuning:n.backgroundCheck,assetBaseUrl:d,...t.createSegmenter!==void 0?{createSegmenter:t.createSegmenter}:{},now:o}),p="idle",g=null,C=null,w=null,Q=!1,k=!1,I=0,b=0,v=[],O=M=>{p===M||k||(p=M,m.setActive(M==="starting"||M==="gating"),i.emit("state",M))},L=()=>{w!==null&&a(w),w=null},q=()=>{L();for(let M of g?.getTracks()??[])M.stop();g=null;try{u.srcObject=null}catch{}},Z=M=>{q(),O("error"),i.emit("error",M)},R=()=>{let M=Math.max(o(),b+1);return b=M,M},E=async M=>{let B=s(u,null),{width:D,height:P}=B??Io(u);if(B===null||C===null){h.reset();return}let H=C.detect(B.source,R()),F=(H.length===1?H:v.length===1?v:[])[0],G=F===void 0?null:Vn(F.landmarks,D,P);if(G===null){h.reset();return}let V=_s(G,D,P,{margin:n.cropMargin,minWidth:n.resolution.minWidth,minHeight:n.resolution.minHeight}),W=Math.max(n.resolution.minHeight,Math.min(V.height,aA)),z=await A(B,V,W,sA);if(k||M!==I)return;let X={image:z,width:Math.round(W*V.width/V.height),height:W,gate:h.summary()};n.tuningVersion!==null&&(X.tuningVersion=n.tuningVersion),L(),O("captured"),i.emit("captured",X)},y=async M=>{if(!(k||M!==I||p!=="gating"||C===null)){if(!Q){Q=!0;try{let B=s(u,rA);if(B!==null){let{width:D,height:P}=Io(u),H=C.detect(B.source,R());v=H;let F=cA(H,B,D||B.width,P||B.height);F.geometry!==null&&n.background.required&&(F.backgroundCheck=f.measure(B,F.geometry.box,D||B.width,P||B.height));let G=h.push(F,o());if(k||M!==I||(i.emit("gate",G),G.ready&&(await E(M),p!=="gating")))return}}catch{}finally{Q=!1}}!k&&M===I&&p==="gating"&&(w=r(()=>{y(M)},1e3/n.cadenceHz))}},x=()=>cd(l(d),2e4,M=>M.close()),N=async()=>{if(k||p==="starting"||p==="gating")return;I+=1;let M=I;if(h.reset(),O("starting"),g===null&&t.getUserMedia===void 0&&(typeof navigator>"u"||typeof navigator.mediaDevices?.getUserMedia!="function")){Z({kind:typeof window<"u"&&window.isSecureContext===!1?"insecure":"unsupported",retryable:!1});return}let B=C!==null?Promise.resolve(C):x();B.catch(()=>{});try{if(g===null){if(g=await c({video:{facingMode:"user",width:{ideal:n.camera.width},height:{ideal:n.camera.height}},audio:!1}),k||M!==I){for(let D of g.getTracks())D.stop();k&&(g=null);return}u.srcObject=g,u.muted=!0,u.playsInline=!0,await u.play().catch(()=>{})}}catch(D){!k&&M===I&&Z(ld(D));return}try{C=await B}catch{!k&&M===I&&Z({kind:"generic",retryable:!0});return}k||M!==I||(O("gating"),y(M))};return{handle:{get state(){return p},on:(M,B)=>i.on(M,B),start:N,retry:()=>{if(!k){if(g!==null&&C!==null&&p!=="error"){I+=1;let M=I;L(),h.reset(),O("gating"),y(M);return}p="idle",N()}},destroy:()=>{k||(I+=1,q(),m.setActive(!1),k=!0,C?.close(),C=null,f.close(),i.clear())}},setFlowState:M=>{(p==="captured"||p==="uploading"||p==="checking"||p==="done"&&M==="done")&&O(M)}}}function ud(){import("@mediapipe/tasks-vision").catch(()=>{})}var sd,rA,aA,sA,yo,Kn=J(()=>{"use strict";mn();nt();Jn();Xs();so();lo();ft();ho();fo();sd="/models-v3",rA=640,aA=1600,sA=.92;yo=class extends Error{}});function md(e,t){try{gA??(gA=document.createElement("canvas"));let n=gA,i=96/Math.max(1,t.width);n.width=Math.max(1,Math.round(t.width*i)),n.height=Math.max(1,Math.round(t.height*i));let o=n.getContext("2d");if(o===null)return dA;o.drawImage(e,t.x,t.y,t.width,t.height,0,0,n.width,n.height);let r=o.getImageData(0,0,n.width,n.height);return{sharpness:we(r),exposure:it(r),meanLuma:Ke(r)}}catch{return dA}}async function hd(e,t){let n=e.source;return"convertToBlob"in n?n.convertToBlob({type:"image/jpeg",quality:t}):new Promise((i,o)=>{n.toBlob(r=>r===null?o(new Error("encode failed")):i(r),"image/jpeg",t)})}function mA(e,t={}){let n=t.now??(()=>performance.now()),i=t.setTimer??((y,x)=>setTimeout(y,x)),o=t.clearTimer??(y=>clearTimeout(y)),r=t.encode??hd,a=t.quality??md,s=e.tuningVersion??null,A=new Set,c=!1,l=e.video??null,d=null,m=t.grabFrame??null,h=null,u=1e3/lA,f=null,p=null,g=!1,C=!1,w=Number.NEGATIVE_INFINITY,Q=null,k=0,I=null,b=null,v=Promise.all([Promise.resolve().then(()=>(so(),Ns)),Promise.resolve().then(()=>(lo(),Ks)),Promise.resolve().then(()=>(Kn(),bo)),Promise.resolve().then(()=>(ho(),$s)),Promise.resolve().then(()=>(fo(),oA))]).then(async([y,x,N,U,M])=>{let B=x.resolveIcaoTuning(e.tuning,e.tuningVersion??void 0);B.background.required&&(p=M.createBackgroundMonitor({tuning:B.backgroundCheck,assetBaseUrl:e.assetBaseUrl??"/models-v3",...t.createSegmenter!==void 0?{createSegmenter:t.createSegmenter}:{},now:n})),d=y.createIcaoGate(B,{policy:e.policy??"reject"}),m??(m=N.defaultGrabber()),h=N.observe,u=1e3/Math.min(lA,B.cadenceHz);let D=(t.createLandmarker??U.createFaceLandmarker)(e.assetBaseUrl??"/models-v3"),P=await new Promise((H,F)=>{let G=setTimeout(()=>{F(new Error("landmarker init timeout")),D.then(V=>V.close(),()=>{})},U.LANDMARKER_INIT_TIMEOUT_MS);D.then(V=>{clearTimeout(G),H(V)},V=>{clearTimeout(G),F(V)})});c?P.close():f=P}).catch(()=>{g=!0}),O=y=>{for(let x of A)x({holding:C||g,update:y})},L=()=>{if(Q=null,!(c||f===null||d===null||m===null||h===null||l===null)){if(n()-w>uA){O(null);return}try{let y=m(l,dd);if(y!==null){let x=Math.max(n(),k+1);k=x;let N=f.detect(y.source,x),U=l.videoWidth||y.width,M=l.videoHeight||y.height,B=h(N,y,U,M);B.geometry!==null&&p!==null&&(B.backgroundCheck=p.measure(y,B.geometry.box,U,M));let D=d.push(B,n());C=D.ready,O(D)}}catch{}Q=i(L,u)}},q=()=>{let y=n()-w>uA;w=n(),y&&(d?.reset(),C=!1,I=null,b=null),Q===null&&f!==null&&!c&&(Q=i(L,0))},Z=()=>{let y=m===null||l===null?null:m(l,null);if(y===null||d===null||Math.max(y.width,y.height)<e.still.minLongSidePx)return Promise.resolve(null);let x=d.summary();return r(y,e.still.jpegQuality).then(N=>({image:N,width:y.width,height:y.height,gate:x}),()=>null)},R=null;return{engineOptions:{measureQuality:(y,x)=>{l=y,q();let N=a(y,x);return C||g?N:{...N,sharpness:0}},telemetry:y=>{if(y.type!=="fired"||c)return;I=Z();let x=R;x!==null&&I.then(N=>N===null?void 0:x(N).catch(()=>{})),C=!1,Q!==null&&o(Q),Q=null,w=Number.NEGATIVE_INFINITY}},decorate:y=>{let x=new WeakMap,N=new Map,U=P=>{let H=x.get(P);return H===void 0&&(H=(async()=>{let F=await Ne(y,"image","image/jpeg",P.image.size,{engine:"portrait"});return await y.uploadToSpaces(F.uploadUrl,P.image,"image/jpeg"),(await y.completeMedia(F.key)).key})(),H.catch(()=>x.delete(P)),x.set(P,H)),H};R=U;let M=async P=>{let H;try{H=await U(P)}catch(F){let G=F?.code;if(typeof G=="string"&&gd.has(G))throw F;return null}return{media:{portrait:H},gate:Hn(P.gate),...s!==null?{tuningVersion:s}:{}}},B=y.submitCheck.bind(y),D=(async(P,H,F)=>{if(P!=="liveness")return B(P,H,F);let G=F?.idempotencyKey,V=G===void 0?void 0:N.get(G);if(V===void 0){let X=I;V=X===null?Promise.resolve(null):X.then(S=>S===null?null:M(S)),G!==void 0&&(N.set(G,V),V.catch(()=>N.delete(G)))}let W=await V;if(W===null)return B("liveness",H,F);let z=await B("liveness",{...H,portraitIcao:W},F);return b=W,z});return new Proxy(y,{get(P,H){if(H==="submitCheck")return D;let F=Reflect.get(P,H);return typeof F=="function"?F.bind(P):F}})},onGate:y=>(A.add(y),()=>A.delete(y)),lastPortraitInput:()=>b,destroy:()=>{c=!0,I=null,b=null,Q!==null&&o(Q),Q=null,A.clear(),v.then(()=>{f?.close(),f=null,p?.close(),p=null})}}}var dd,gd,lA,uA,dA,gA,hA=J(()=>{"use strict";lt();ut();qe();dd=640,gd=new Set(["network_error","timeout","upload_failed","unknown_error","rate_limit_exceeded"]),lA=6,uA=1500,dA={sharpness:1,exposure:1,meanLuma:128},gA=null});function Ue(e){return e.section??yd[e.checkType]??null}function Ed(e){let t={sessionId:e.sessionId,orgName:e.orgName,returning:e.returning===!0,consentRecorded:e.consentRecorded,expiresAt:e.expiresAt,sections:[]};for(let n of e.steps){let i=Ue(n);i!==null&&!t.sections.includes(i)&&t.sections.push(i)}return e.branding!==void 0&&(t.branding=e.branding),t}function bd(e){let t={attemptsRemaining:e.attemptsRemaining,attemptsExhausted:e.attemptsExhausted===!0};return e.reason!==void 0&&(t.reason=e.reason),t}function Bd(e,t){let n=e.otpChoice;if(n===void 0||n.locked||n.selected===null)return;let i=t==="phone_otp"?"email":"phone";return n.options.includes(i)?i:void 0}function Qd(e,t,n,i){let o=t.checkType==="email_otp",r=(o?t.emailOtp:t.otp)??{},a=o?t.emailOtp?.emailSource:t.otp?.numberSource,s=a!==void 0&&Cd.has(a)?a:o?"prefilled_or_entered":"user_entered",A=typeof r.sentToMasked=="string"&&r.sentToMasked.length>0,c=Bd(e,o?"email_otp":"phone_otp"),l={key:t.checkType,context:n,section:Ue(t),phase:A?"verify":"send",canSwitch:c!==void 0,...i},d=o?{kind:"email_otp",...l,emailSource:s,needsEmail:s!=="prefilled"}:{kind:"phone_otp",...l,numberSource:s,needsPhone:s!=="prefilled",channels:(t.otp?.channels??[]).filter(m=>m==="whatsapp"||m==="sms")};return c!==void 0&&(d.switchChannel=c),A&&(d.sentToMasked=r.sentToMasked),!o&&t.otp?.channel!==void 0&&(d.channel=t.otp.channel),r.expiresAt!==void 0&&(d.codeExpiresAt=r.expiresAt),r.resendAvailableAt!==void 0&&(d.resendAvailableAt=r.resendAvailableAt),d}function Sd(e,t,n,i){let o=e.nniBound===!0?"bound":t.nniFromDocument===!0?"document":"typed",r=o==="typed"&&t.state==="input_required"&&t.reason==="nni_recheck",a=t.reason==="nni_not_found"&&t.state==="input_required"&&!i.attemptsExhausted&&e.methodChoice?.available===!0&&e.methodChoice.options.includes("document_photo");return{kind:"registry",key:"registry",context:n,section:Ue(t),state:t.state==="input_required"?"input_required":"pending",source:o,recheck:r,canUseDocument:a,...i}}function wd(e,t,n,i){let o=[...t.acceptedSides??[]];return{kind:"document",key:"document",context:n,section:Ue(t),side:o.includes("recto")?"verso":"recto",acceptedSides:o,documents:ks(e),...i}}function kd(e){let t=e.steps.find(n=>n.checkType==="liveness");return t?.state==="passed"||t?.state==="review"}function pA(e,t,n,i,o){let r=t.icao?.report;return{kind:"portrait",key:`portrait:${o}`,context:n,section:Ue(t),phase:o,report:Array.isArray(r)?r:null,review:t.state==="review",tuning:e.capture?.icao??null,tuningVersion:e.capture?.tuningVersion??null,icao:Me(e),retakeOnly:o==="capture"&&t.state==="input_required"&&e.capture?.livePhoto?.oneCapture===!0&&kd(e),...i}}function Md(e,t){let n=e.capture?.livePhoto;if(n?.oneCapture!==!0)return null;let i=e.steps.find(r=>r.checkType==="portrait_icao"),o=n.still??Bo;return{icao:t==="liveness"&&Me(e)!==null&&i!==void 0&&i.state==="pending"&&i.reason===void 0,still:{minLongSidePx:o.minLongSidePx??Bo.minLongSidePx,jpegQuality:o.jpegQuality??Bo.jpegQuality}}}function xd(e,t,n,i){let o=t.eid,r=Ue(t);if(o===void 0||o.challenge!=="app_code")return{kind:"unsupported",key:"unsupported:eid_auth",context:n,section:r,checkType:"eid_auth",reason:"update_required"};let a=e.methodChoice,s=a?.available===!0?a.options.find(l=>fd.includes(l)):void 0,A=s!==void 0&&t.state==="input_required"&&(t.reason!==void 0&&Id.has(t.reason)||t.attemptsExhausted===!0||t.attemptsRemaining===0||t.reason==="eid_resend_limit"&&o.awaiting!=="code"),c={kind:"eid",key:"eid",context:n,section:r,provider:o.provider,providerName:o.providerName,country:o.country,challenge:"app_code",phase:o.awaiting==="code"?"code":"identifier",identifierBound:o.identifierBound===!0,canUseCamera:A,afterPass:o.afterPass==="continue"?"continue":"end",...i};return A&&(c.cameraMethod=s),o.expiresAt!==void 0&&(c.codeExpiresAt=o.expiresAt),o.resendAvailableAt!==void 0&&(c.resendAvailableAt=o.resendAvailableAt),o.resendsRemaining!==void 0&&(c.resendsRemaining=o.resendsRemaining),o.codeAttemptsRemaining!==void 0&&(c.codeAttemptsRemaining=o.codeAttemptsRemaining),c}function Dd(e,t){if(t.checkType!=="face_match"||t.reason!==void 0)return null;let n=e.steps.find(i=>i.checkType==="portrait_icao");return n!==void 0&&(n.state==="passed"||n.state==="review")?n:null}function vd(e){return e.steps.some(t=>t.attemptsExhausted===!0)}function Rd(e,t){let n=e.failureReason,i;n===fA?i="platform_unsupported":e.status==="expired"?i="expired":e.status==="review_pending"?i="review":e.status==="completed"&&e.outcome==="approved"?i="approved":e.status==="completed"&&e.outcome==="review"?i="review":n==="device_cooldown"?i="cooldown":n!==void 0?i="policy_stop":vd(e)?i="attempts_exhausted":i="rejected";let o=i==="platform_unsupported"?{sessionId:e.sessionId,status:"unavailable"}:We(e,{autoRetry:!1}),r={kind:"result",key:"result",context:t,section:null,display:i,result:o};return n!==void 0&&(r.failureReason=n),e.retryAfter!==void 0&&(r.retryAfter=e.retryAfter),r}function Td(e,t){let n=e.identitySummary;if(n==null)return null;let i={kind:"identity_summary",key:"identity_summary",context:t,section:"identity",summaryKind:n.kind==="partial"?"partial":n.kind??"full",source:n.source,portraitAvailable:n.portrait?.available===!0,retakeAvailable:n.retakeAvailable===!0};for(let o of _d){let r=n[o];typeof r=="string"&&r!==""&&(i[o]=r)}return i}function Fe(e,t={}){let n=Ed(e);if(pe(e)||e.failureReason===fA)return Rd(e,n);let i=Td(e,n);if(i!==null)return i;let o=Re(e);if(o!==null){let c=o.options.filter(d=>pd.includes(d));if(c.length===0)return{kind:"unsupported",key:"unsupported:method",context:n,section:"identity",checkType:"method",reason:"platform_unsupported"};let l={kind:"method",key:"method",context:n,section:"identity",options:c};return c.includes("national_eid")&&o.nationalEid!==void 0&&(l.nationalEid=o.nationalEid),l}let r=Ie(e);if(r===void 0){let c=e.steps.find(l=>l.state==="processing");return{kind:"processing",key:"processing",context:n,section:c===void 0?null:Ue(c),stalled:!1}}let a=bd(r),s=r.checkType,A=Ue(r);switch(s){case"phone_otp":case"email_otp":{let c=e.otpChoice;return c!==void 0&&c.selected===null&&!c.locked?{kind:"contact_choice",key:"contact_choice",context:n,section:A,options:c.options.filter(l=>l==="phone"||l==="email"),selected:null,locked:!1}:Qd(e,r,n,a)}case"population_registry":return Sd(e,r,n,a);case"eid_auth":return xd(e,r,n,a);case"doc_ocr":return wd(e,r,n,a);case"portrait_icao":return pA(e,r,n,a,"capture");case"liveness":case"face_match":{let c=Dd(e,r);if(c!==null)return pA(e,c,n,a,"match");let l=r.requiresMobile===!0,d=Me(e);return l&&t.isMobile===!1?{kind:"mobile_required",key:"mobile_required",context:n,section:A,checkType:s}:{kind:"liveness",key:"biometric",context:n,section:A,mode:s==="face_match"?"selfie":"liveness",requiresMobile:l,instructions:d===null?"standard":"icao",icao:d,livePhoto:Md(e,s),...a}}default:return{kind:"unsupported",key:`unsupported:${s}`,context:n,section:A,checkType:s,reason:s==="nfc_chip"?"platform_unsupported":"update_required"}}}var pd,fd,Id,fA,Cd,yd,Bo,_d,qn=J(()=>{"use strict";ut();no();bt();pd=["national_number","document_photo","national_eid"],fd=["national_number","document_photo"],Id=new Set(["eid_not_enrolled","eid_unavailable","eid_locked"]),fA="platform_unsupported",Cd=new Set(["prefilled","user_entered","prefilled_or_entered"]),yd={phone_otp:"contact",email_otp:"contact",eid_auth:"identity",doc_ocr:"identity",nfc_chip:"identity",population_registry:"identity",liveness:"live_photo",portrait_icao:"live_photo",face_match:"live_photo"};Bo={minLongSidePx:1280,jpegQuality:.95};_d=["fullName","birthDate","birthYear","nationality","documentType","documentNumberMasked","nniMasked","expiryDate","retakeTarget"]});function IA(e){let t=null,n=Promise.resolve(),i=!1,o=null,r=null,a=null,s=!1,A=()=>{t?.controller.handle.destroy(),t=null},c=()=>{let h=e.currentView(),u=h===null?null:Fe(h,{isMobile:e.isMobile()});return u?.kind==="portrait"?u:null},l=async(h,u)=>{if(e.destroyed())return;u.setFlowState("uploading"),i=!1;let f=null;try{await e.runner().submit("portrait_icao",async(g,C)=>{if(f===null){let Q=await Ne(g,"image","image/jpeg",h.image.size,{engine:"portrait"});await g.uploadToSpaces(Q.uploadUrl,h.image,"image/jpeg"),f=(await g.completeMedia(Q.key)).key}u.setFlowState("checking");let w={media:{portrait:f},gate:Hn(h.gate),...h.tuningVersion!==void 0?{tuningVersion:h.tuningVersion}:{}};return g.submitCheck("portrait_icao",w,{idempotencyKey:C})},()=>{o=f})}catch{i=!0}if(u.setFlowState("done"),e.destroyed())return;let p=c();(p===null||p.phase!=="capture")&&t?.controller===u&&A(),e.runner().republish()},d=h=>e.runner().submit("face_match",(u,f)=>u.submitCheck("face_match",o!==null?{imageKey:o}:{},{idempotencyKey:f})).then(()=>{},()=>{i=!0,h()});return{bind:(h,u)=>{if(h.phase==="match")return A(),r!==h.attemptsRemaining&&!i&&(r=h.attemptsRemaining,d(u)),{...h,uploadFailed:i,resubmit:()=>(i=!1,r=h.attemptsRemaining,u(),d(u)),capture:()=>{throw new Error("the portrait was already accepted")}};r=null;let f=e.keptPortraitInput?.()??null;return f!==null&&(s||f!==a&&h.report===null&&h.reason===void 0&&!h.retakeOnly)?(s||(a=f,s=!0,e.runner().submit("portrait_icao",(p,g)=>p.submitCheck("portrait_icao",f,{idempotencyKey:g}),()=>{o=f.media.portrait}).catch(()=>{}).finally(()=>{s=!1,u()})),{kind:"processing",key:"processing",context:h.context,section:h.section,stalled:!1,refresh:()=>Promise.resolve()}):{...h,uploadFailed:i,resubmit:()=>Promise.resolve(),capture:p=>{if(t!==null&&t.video===p.video)return t.controller.handle;A(),i=!1;let g=Eo({video:p.video,tuning:h.tuning,tuningVersion:h.tuningVersion,...h.icao!=null?{policy:h.icao.policy}:{},...p.keepScreenAwake!==void 0?{keepScreenAwake:p.keepScreenAwake}:{},...p.assetBaseUrl!==void 0?{assetBaseUrl:p.assetBaseUrl}:{}},e.internals);return t={video:p.video,controller:g},g.handle.on("captured",C=>{n=n.then(()=>l(C,g)).catch(()=>{})}),g.handle}}},destroy:A}}var CA=J(()=>{"use strict";ut();Kn();lt();qn()});var de,xe,Qo=J(()=>{"use strict";de=class extends Error{constructor(t,n){super(`invalid ${t} (${n})`),this.name="InvalidInputError",this.field=t,this.kind=n}},xe=class extends Error{constructor(t,n){super(`invalid ${t} (${n})`),this.name="OtpInputError",this.field=t,this.kind=n}}});function So(e){return/^\d{10}$/.test(e)&&Number(e)%97===1}function wo(e){let t="";for(let n of e){let i=n.codePointAt(0)??0;i>=1632&&i<=1641?t+=String(i-1632):i>=1776&&i<=1785?t+=String(i-1776):n!==" "&&n!=="-"&&n!=="\xA0"&&(t+=n)}return t}var yA=J(()=>{"use strict";Qo()});function bA(e){let t=!1,n=null,i="",o=!1,r=!1,a=!1,s={},A={},c=new Set,l=!1,d=null,m="idle",h=new Map,u=new Map,f=(E,y,x)=>{let N=`${E}.${y}`,U=h.get(N);if(U!==void 0)return U;let M=u.get(E),B=(M===void 0?x():M.then(x)).finally(()=>{h.delete(N)});h.set(N,B);let D=B.then(()=>{},()=>{});return u.set(E,D),D.then(()=>{u.get(E)===D&&u.delete(E)}),B},p=async(E,y,x)=>{await e.ensureConsent();try{await ct(e.runtime,y)}catch(N){if(N instanceof ce&&EA.has(N.code)){await e.refreshView();return}throw N}x?.(),e.destroyed()||await e.refreshView()},g=async E=>{await e.ensureConsent();let y;try{try{y=await E(e.runtime.client)}catch(x){if(!(x instanceof ce)||x.code!=="consent_required")throw x;await e.runtime.ensureConsent({force:!0}),y=await E(e.runtime.client)}}catch(x){if(x instanceof ce&&EA.has(x.code)){await e.refreshView();return}throw x}e.destroyed()||(y!==void 0&&e.setView!==void 0?e.setView(y):await e.refreshView())},C=E=>f("contact",`select:${E}`,()=>g(y=>y.selectContact===void 0?Promise.reject(new Error("contact choice is not available in this build")):y.selectContact(E))),w=E=>f("identity",E,()=>g(y=>y.confirmIdentity===void 0?Promise.reject(new Error("identity confirmation is not available in this build")):y.confirmIdentity(E))),Q=async E=>{await e.ensureConsent();try{await e.selectMethod(E)}catch(y){if(!(y instanceof ce)||y.code!=="consent_required")throw y;await e.runtime.ensureConsent({force:!0}),await e.selectMethod(E)}},k=(E,y)=>{let x=E.kind,N=x==="phone_otp",U=N?"phone":"email",M={action:"send"};if(N?E.needsPhone:E.needsEmail){let B=y[U]??A[x],D=N?B?.replace(/[\s().-]/g,""):B?.trim();if(D===void 0||!(N?Pd:Od).test(D))return Promise.reject(N?new de("phone","format"):new xe("email","format"));M[U]=D}if(N){let B=E.channels,D=y.channel??(B.length===1?B[0]:void 0);if(B.length>0){if(D===void 0)return Promise.reject(new xe("channel","required"));if(!B.includes(D))return Promise.reject(new xe("channel","unavailable"))}D!==void 0&&(M.channel=D)}return f(x,"send",()=>p(x,(B,D)=>B.submitCheck(x,M,{idempotencyKey:D}),()=>{s[x]=e.now(),M[U]!==void 0&&(A[x]=M[U])}))},I=(E,y)=>Nd.test(y)?f(E,"verify",()=>p(E,(x,N)=>x.submitCheck(E,{action:"verify",code:y},{idempotencyKey:N}))):Promise.reject(new de("code","format")),b=(E,y)=>f("eid_auth",E,()=>p("eid_auth",(x,N)=>x.submitCheck("eid_auth",y,{idempotencyKey:N}))),v=(E,y)=>{if(E.identifierBound)return b("start",{action:"start"});let x=wo(y??"");if(E.country==="MR"){if(!/^\d{10}$/.test(x))return Promise.reject(new de("nni","format"));if(!So(x))return Promise.reject(new de("nni","check_digit"))}else if(x==="")return Promise.reject(new de("nni","format"));return b("start",{action:"start",identifier:x})},O=E=>{switch(E.kind){case"phone_otp":case"email_otp":{let y={...E,send:(N={})=>k(E,N),verify:N=>I(E.kind,N),switchTo:()=>E.canSwitch&&E.switchChannel!==void 0?C(E.switchChannel):Promise.reject(new RangeError("this session has no other contact option"))},x=s[E.kind];return y.resendAvailableAt===void 0&&x!==void 0&&(y.resendAvailableAt=new Date(x+Fd).toISOString()),y}case"eid":return{...E,start:y=>v(E,y),verify:y=>Gd.test(y)?b("verify",{action:"verify",code:y}):Promise.reject(new de("code","format")),resend:()=>E.resendsRemaining===0?Promise.reject(new RangeError("no new code can be sent for this session")):b("resend",{action:"resend"}),useCamera:()=>E.canUseCamera&&E.cameraMethod!==void 0?f("method","useCamera",()=>Q(E.cameraMethod)):Promise.reject(new RangeError("the camera path is not offered"))};case"method":return{...E,select:y=>E.options.includes(y)?f("method","select",()=>Q(y)):Promise.reject(new RangeError(`method ${String(y)} is not offered`))};case"registry":return{...E,submitNni:y=>{if(E.source!=="typed")return Promise.reject(new RangeError("this session already holds the NNI"));let x=wo(y);return/^\d{10}$/.test(x)?So(x)?f("population_registry","submitNni",()=>p("population_registry",(N,U)=>N.submitCheck("population_registry",{nni:x},{idempotencyKey:U}),()=>{d=`\u2022\u2022\u2022\u2022\u2022\u2022${x.slice(-4)}`})):Promise.reject(new de("nni","check_digit")):Promise.reject(new de("nni","format"))},confirm:()=>f("population_registry","confirm",()=>p("population_registry",(y,x)=>y.submitCheck("population_registry",{},{idempotencyKey:x}))),useDocument:()=>E.canUseDocument?f("method","useDocument",()=>Q("document_photo")):Promise.reject(new RangeError("the document method is not offered"))};case"document":return e.bindDocument!==void 0?e.bindDocument(E,R):{...E,issuer:null,documentType:null,captureSide:null,selectDocument:()=>{throw new Error("document capture is not available in this build")},capture:()=>{throw new Error("document capture is not available in this build")}};case"portrait":return e.bindPortrait!==void 0?e.bindPortrait(E,R):{...E,uploadFailed:!1,resubmit:()=>Promise.resolve(),capture:()=>{throw new Error("portrait capture is not available in this build")}};case"contact_choice":return{...E,select:y=>E.options.includes(y)?C(y):Promise.reject(new RangeError(`contact ${String(y)} is not offered`))};case"identity_summary":return{...E,...E.nniMasked===void 0&&E.summaryKind==="partial"&&d!==null?{nniMasked:d}:{},portrait:async()=>{let y=e.runtime.client;if(!E.portraitAvailable||y.identityPortrait===void 0)return null;try{return await y.identityPortrait()}catch{return null}},confirm:()=>w("confirm"),retake:()=>E.retakeAvailable?w("retake"):Promise.reject(new RangeError("no retake is left"))};case"liveness":return{...E,capture:y=>e.liveness(y),onLivePhoto:y=>E.livePhoto?.icao===!0&&e.onLivePhoto!==void 0?e.onLivePhoto(y):()=>{}};case"mobile_required":case"processing":return{...E,refresh:async()=>{o=!1,await e.refreshView()}};case"unsupported":case"result":return{...E};default:{let y=E;throw new Error(`runner: unhandled step ${JSON.stringify(y)}`)}}},L=async()=>{if(!r){r=!0;try{for(let E of Ld){if(await e.sleep(E),!t||e.destroyed())return;let y=await e.refreshView().catch(()=>null);if(y!==null&&Fe(y,{isMobile:e.isMobile()}).kind!=="processing")return}o=!0,R()}finally{r=!1}}},q=E=>{if(E.kind!=="liveness"||E.mode!=="selfie")return null;let y={kind:"processing",key:"processing",context:E.context,section:E.section,stalled:!1};if(m==="inflight")return y;if(!l||m==="done")return null;let x=e.keptFaceKey?.()??null;return x===null?null:(m="inflight",p("face_match",(N,U)=>N.submitCheck("face_match",{imageKey:x},{idempotencyKey:U}),()=>{m="done"}).then(()=>{m==="inflight"&&(m="done",R())},()=>{m="done",R()}),y)},Z=(E,y=!1)=>{if(!t||e.destroyed()||e.chainBusy())return;let x=Fe(E,{isMobile:e.isMobile()});x.kind==="registry"&&x.recheck&&(l=!0,m="idle"),x=q(x)??x,x.kind==="processing"?x.stalled=o:o=!1;let N=O(x),U=JSON.stringify(N);x.kind==="registry"&&x.source==="document"&&x.state==="pending"&&!c.has("registry")&&(c.add("registry"),N.confirm().catch(M=>{(!(M instanceof ce)||Hd.has(M.code))&&c.delete("registry")})),!(!y&&U===i)&&(i=U,n=N,e.emitStep(N),x.kind==="processing"&&!o&&m!=="inflight"&&L(),x.kind==="result"&&!a&&(a=!0,e.emitResult(x.result)))};function R(){let E=e.currentView();E!==null&&Z(E,!0)}return{run:async()=>{if(e.destroyed())throw new Error("verification destroyed");t=!0;let E=await e.ensureView();return n===null&&Z(E),n??O(Fe(E,{isMobile:e.isMobile()}))},current:()=>n,onView:E=>Z(E),onChainIdle:()=>{let E=e.currentView();E!==null&&Z(E)},republish:R,submit:p}}var Ld,Fd,Pd,Nd,Gd,Od,EA,Hd,BA=J(()=>{"use strict";st();lt();yA();qn();Ld=[1e3,2e3,4e3,8e3,15e3],Fd=3e4,Pd=/^\+[1-9]\d{7,14}$/,Nd=/^\d{6}$/,Gd=/^\d{6}$/,Od=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,EA=new Set(["session_not_active","check_not_found","check_already_finalized","check_out_of_order","method_required","contact_locked","identity_confirm_required","identity_confirm_locked"]),Hd=new Set(["network_error","timeout","upload_failed","unknown_error","rate_limit_exceeded"])});var Ht,QA=J(()=>{"use strict";Ht={fp12:"08390000c48a",engine:"sekyro-ocr-1",precision:"fp32",files:{"sekyro-ocr.wasm":{bytes:3550608,sha256:"c15968a6de3d2225e2fdbf36d71a9214c2910419056c6878444fd2d0567bb748",tier:"live",contentType:"application/wasm"},"sekyro-ocr.mjs":{bytes:4270,sha256:"209a78d96ca53344996a0c2300aed4ff8a5c69e142713216975a2840eec08cac",tier:"bundled",contentType:"text/javascript"},"det.param":{bytes:24252,sha256:"c39ba0b1195e8ad37cfc5bdd7acedcfc1d9cb901e7b8eb1c9c4f6e5a66c04eb3",tier:"live",contentType:"text/plain"},"det.bin":{bytes:4685856,sha256:"652bafe366565109a1a5766caf482bc46f01481f8044d3a785bd9a1be67c63bb",tier:"live",contentType:"application/octet-stream"},"mrz-rec.param":{bytes:3510,sha256:"bc69b1b9683e35f6605b21001fadeb81468063459c00c0fc83c67c139f23df01",tier:"live",contentType:"text/plain"},"mrz-rec.bin":{bytes:494196,sha256:"de93a2aa2f08670cc7dedd17ba378d2f5d7cf6ae409054a9eac863a02c2febae",tier:"live",contentType:"application/octet-stream"},"mrz_dict.txt":{bytes:73,sha256:"b19858a4de2ccbbbdd4b53982188ea2c7664013183bbd1ae9d20ab52c661f97f",tier:"live",contentType:"text/plain"},"latin-rec.param":{bytes:19602,sha256:"2ae30dfdc7ee482c6cbbc0419c16ee125e880e9eaf69053d61953694bb0fcf4c",tier:"lazy",contentType:"text/plain"},"latin-rec.bin":{bytes:10750388,sha256:"f91ebdcf4d6b58c58a87704160e59d07ae56bc2d5021eae09d095c5a20bf7525",tier:"lazy",contentType:"application/octet-stream"},"ppocr_keys_v1.txt":{bytes:26249,sha256:"28b2362ad4ab2dc38769aa72feb535e3a9ddb3fd2a7585a05920e6393b1dc7f7",tier:"lazy",contentType:"text/plain"},"arabic-rec.param":{bytes:9858,sha256:"4e5cc85667dfaaa0c67d3f308400645a578c08bd43f952cab6c55b7bce143ea9",tier:"lazy",contentType:"text/plain"},"arabic-rec.bin":{bytes:8853572,sha256:"5acc3265a1738dc31316258383830d5dbdfa5e8ebc2e710f9001f832ecfbffb0",tier:"lazy",contentType:"application/octet-stream"},"arabic_dict.txt":{bytes:405,sha256:"637c27c88512c22089bef927b34ada08f748dc132ac70facd68d8202384c2726",tier:"lazy",contentType:"text/plain"}}}});function SA(e,t){return e==="hosted"?"/models-ocr":t==="live"?"https://assets.sekyro.ai/sdk/web/ocr":"https://assets-staging.sekyro.ai/sdk/web/ocr"}var Pp,Np,wA=J(()=>{"use strict";QA();Pp=Object.keys(Ht.files).filter(e=>Ht.files[e].tier==="live"),Np=Object.keys(Ht.files).filter(e=>Ht.files[e].tier==="lazy")});var MA={};ue(MA,{createPlanRunner:()=>Vd,sdkAssetBase:()=>kA});function Ud(e){let t=e;if(typeof t.apiOrigin!="string"||typeof t.sessionToken!="string")return;let n=`${t.apiOrigin}/api/v2/hosted/capture-reports`,i=t.sessionToken;return o=>{try{fetch(n,{method:"POST",headers:{"content-type":"application/json","x-session-token":i},body:JSON.stringify({reports:o}),keepalive:!0}).catch(()=>{})}catch{}}}function kA(e){let t=e.apiOrigin;return SA("sdk",typeof t=="string"&&/staging|sandbox|localhost/.test(t)?"sandbox":"live")}function Vd(e){let t=null,n=null,i=null,o=Promise.resolve(),r=()=>{i?.flow.handle.destroy(),i=null},a=async(p,g)=>{if(e.destroyed())return;g.setFlowState("uploading");let C=null,w,Q=!1;try{await t.submit("doc_ocr",async(v,O)=>{if(C===null){let L=await Ne(v,"image","image/jpeg",p.image.size,{engine:"document"});await v.uploadToSpaces(L.uploadUrl,p.image,"image/jpeg"),C=(await v.completeMedia(L.key)).key}return g.setFlowState("checking"),w===void 0&&(w=g.takeDeviceRead(p)),v.submitCheck("doc_ocr",{imageKey:C,side:p.side,...w!==null?{deviceRead:w}:{}},{idempotencyKey:O})})}catch{Q=!0}finally{g.setFlowState("done")}if(e.destroyed())return;if(Q){g.settle(p.side,{ok:!1,issue:"technical"});return}let k=e.currentView(),I=k===null?null:Fe(k,{isMobile:e.isMobile()});if(I?.kind!=="document"){g.settle(p.side,{ok:!0}),i?.flow===g?r():g.handle.destroy();return}if(I.reason==="document_type_not_accepted"){n=null,i?.flow===g&&r(),t.republish();return}p.side==="single"||I.acceptedSides.includes(p.side)||I.reason==="side_missing"?(g.settle(p.side,{ok:!0}),n?.documentType!=="passport"&&g.handle.setSide(I.side)):g.settle(p.side,{ok:!1,issue:"reread"})},s=(p,g)=>({...p,issuer:n?.issuer??null,documentType:n?.documentType??null,captureSide:n===null?null:n.documentType==="passport"?"single":p.side,selectDocument:(C,w)=>{if(!ws(p.documents).includes(C)||!to(p.documents,C).includes(w))throw new RangeError(`${w} from ${C} is not accepted`);(n?.issuer!==C||n.documentType!==w)&&r(),n={issuer:C,documentType:w},g()},capture:C=>{if(n===null)throw new Error("selectDocument() first");if(i!==null&&i.video===C.video)return i.flow.handle;r();let w=n,Q=w.documentType==="passport"?"single":p.acceptedSides.length>0?p.side:void 0,k=On({video:C.video,documentType:w.documentType,issuer:w.issuer,...Q!==void 0?{side:Q}:{},...C.keepScreenAwake!==void 0?{keepScreenAwake:C.keepScreenAwake}:{},...C.liveMrz!==void 0?{liveMrz:C.liveMrz}:{}},{...e.documentInternals??{},...(()=>{let I=e.currentView()?.capture?.document,b=e.documentInternals?.blurRefuseSharpnessMax??I?.scan?.blurRefuseSharpnessMax;return{engineOptions:{camera:qa(I?.camera),shutter:Zi(I?.scan),guideLock:es(I?.guide),...e.documentInternals?.engineOptions??{}},...typeof b=="number"&&Number.isFinite(b)&&b>=0&&b<=1?{blurRefuseSharpnessMax:b}:{}}})(),deferRead:!0,...(()=>{let I=e.currentView();if(I===null||e.documentInternals?.webOcr!==void 0)return{};let b=Ud(e.runtime.client);return{webOcr:{captureDocument:I.capture?.document,salt:I.sessionId,baseUrl:kA(e.runtime.client),...b!==void 0?{reports:b}:{}}}})()});return i={video:C.video,flow:k},k.handle.on("captured",I=>{o=o.then(()=>a(I,k)).catch(()=>{})}),k.handle}}),A=null,c=null,l=new Set,d=e.runtime.client;e.runtime.client=new Proxy(d,{get(p,g){if(g==="submitCheck")return(c??p).submitCheck.bind(c??p);let C=Reflect.get(p,g);return typeof C=="function"?C.bind(p):C}});let m=()=>{A?.destroy(),A=null,c=null},h=p=>{let g=e.currentView(),C=g===null?null:Fe(g,{isMobile:e.isMobile()});if(g===null||C?.kind!=="liveness"||C.livePhoto?.icao!==!0)return;if(A===null){let I=mA({tuning:g.capture?.icao??null,tuningVersion:g.capture?.tuningVersion??null,...C.icao!=null?{policy:C.icao.policy}:{},still:C.livePhoto.still,...p.assetBaseUrl!==void 0?{assetBaseUrl:p.assetBaseUrl}:{}},e.livePhotoInternals);A=I,c=I.decorate(d),I.onGate(b=>{for(let v of l)v(b)})}let w=A,Q=e.baseCapture??{},k=Q.engineOptions?.telemetry;return{...Q,engineOptions:{...Q.engineOptions??{},measureQuality:w.engineOptions.measureQuality,telemetry:I=>{k?.(I),w.engineOptions.telemetry(I)}}}},u=IA({keptPortraitInput:()=>A?.lastPortraitInput()??null,runner:()=>t,currentView:e.currentView,destroyed:e.destroyed,isMobile:e.isMobile,...e.portraitInternals!==void 0?{internals:e.portraitInternals}:{}}),f=bA({...e,bindDocument:s,bindPortrait:u.bind,onLivePhoto:p=>(l.add(p),()=>l.delete(p))});return t=f,{...f,captureInternals:h,destroy:()=>{r(),u.destroy(),m(),l.clear()}}}var xA=J(()=>{"use strict";eo();no();Vi();Gn();Ji();hA();CA();lt();BA();qn();wA()});var xg={};ue(xg,{DEFAULT_API_ORIGIN:()=>ko,DOCUMENT_TYPE_ORDER:()=>hg,HostedApiError:()=>ce,ISSUER_CODES:()=>Wn,InvalidInputError:()=>de,KNOWN_CODES:()=>ui,OtpInputError:()=>xe,PLATFORM_UNSUPPORTED:()=>Xn,SEKYRO_EVENTS:()=>Ro,WEB_IDENTITY_METHODS:()=>vo,acceptedIssuers:()=>fg,acceptedTypesFor:()=>pg,createDocumentCapture:()=>yg,createLivenessCapture:()=>xr,createPortraitCapture:()=>bg,createVerification:()=>DA,deriveStep:()=>FA,flagOf:()=>Cg,getLivenessAssetsStatus:()=>br,hasMultipleCameras:()=>Tr,icaoPolicyOf:()=>Me,isKnownCode:()=>_r,isValidNni:()=>vA,normalizeNni:()=>RA,openHosted:()=>VA,preloadLivenessAssets:()=>Er,queryCameraPermission:()=>vr,releaseLivenessAssets:()=>Qr,resolveAcceptedDocuments:()=>Ig,sectionOf:()=>De,subscribeCameraPermission:()=>Rr,subscribeLivenessAssets:()=>Br,warmDocumentCapture:()=>Eg,warmPortraitCapture:()=>Bg});module.exports=ZA(xg);hn();si();async function Dr(){try{return typeof navigator>"u"||typeof navigator.permissions?.query!="function"?null:await navigator.permissions.query({name:"camera"})}catch{return null}}function li(e){return e==="granted"||e==="prompt"||e==="denied"?e:"unknown"}async function vr(){let e=await Dr();return e===null?"unknown":li(e.state)}function Rr(e){let t=!1,n=null,i=()=>{!t&&n!==null&&e(li(n.state))};return Dr().then(o=>{t||(n=o,e(o===null?"unknown":li(o.state)),o?.addEventListener?.("change",i))}),()=>{t=!0,n?.removeEventListener?.("change",i)}}async function Tr(){if(typeof navigator>"u")return!1;let e=String(navigator.userAgent??"");if(/Android|iPhone|iPad|iPod/i.test(e)||/Macintosh/.test(e)&&(navigator.maxTouchPoints??0)>1)return!0;try{return(await navigator.mediaDevices?.enumerateDevices?.()??[]).filter(n=>n.kind==="videoinput").length>=2}catch{return!1}}st();gi();Yt();hn();ft();lt();bt();var ko="https://api.sekyro.ai",Jd=5e3,Yd=1500,Kd=10;function qd(e){return new Promise(t=>setTimeout(t,e))}function Wd(){let e=globalThis.crypto;if(e!==void 0&&typeof e.randomUUID=="function")return e.randomUUID();let t=new Uint8Array(16);if(e!==void 0&&typeof e.getRandomValues=="function")e.getRandomValues(t);else for(let i=0;i<16;i+=1)t[i]=Math.floor(Math.random()*256);t[6]=(t[6]??0)&15|64,t[8]=(t[8]??0)&63|128;let n=[...t].map(i=>i.toString(16).padStart(2,"0")).join("");return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}function DA(e){return zd(e,{})}function zd(e,t){let n=e.apiOrigin??ko,i=e.autoRetry??!0,o=e.rearm??"auto",r=t.client??new pn({apiOrigin:n,sessionToken:e.clientToken,...e.fetch!==void 0?{fetch:e.fetch}:{}}),a=t.sleep??qd,s=t.uuid??Wd,A=t.getTurnstileToken??((T,Y)=>Promise.resolve().then(()=>(Jr(),Vr)).then(j=>j.executeTurnstile(T,Y))),c=Pe(),l=null,d=null,m=!1,h=new AbortController,u=null,f=null,p=T=>{u=T,c.emit("view",T),l?.onView(T)},g=()=>u!==null?Promise.resolve(u):(f??(f=r.getSession().then(T=>(p(T),T)).finally(()=>{f=null})),f),C=async()=>{let T=await r.getSession();return p(T),T},w=(T,Y)=>{u!==null&&p(Fr(u,T,Y))},Q=null,k=async T=>{let Y=await g();!T&&Y.consentRecorded||(await r.recordConsent(e.locale),u!==null&&p({...u,consentRecorded:!0}))},I=T=>T?.force===!0?k(!0):(Q??(Q=k(!1).finally(()=>{Q=null})),Q),b={client:r,ensureConsent:T=>I(T),sleep:a,uuid:s,onBusy:T=>{m||c.emit("busy",T)}},v=!1,O=null,L=T=>{if(T.status==="approved"||T.status==="rejected"||T.status==="review"){if(v)return;v=!0}O=JSON.stringify(T),c.emit("result",T)},q=T=>{O!==JSON.stringify(T)&&L(T)},Z=async T=>{let Y=u;T&&(Y=await C().catch(()=>u));let j=Y===null?null:Re(Y);return j!==null&&!m&&c.emit("method",j),j!==null},R=null,E=!1,y=!1,x=()=>ct(b,(T,Y)=>T.submitCheck("population_registry",{},{idempotencyKey:Y})),N=T=>T.nniBound===!0||Te(T,"population_registry")?.nniFromDocument===!0,U=async()=>{try{let T=await g();if(pe(T)||Re(T)!==null||Ie(T)?.checkType!=="population_registry")return;if(!N(T)&&Te(T,"population_registry")?.nniFromDocument===void 0&&(T=await C()),!N(T)){y=!0;return}await I(),w(await x(),"population_registry");let Y=u===null?void 0:Te(u,"population_registry");if(Y?.state==="input_required"&&Y.reason==="registry_unavailable"&&Y.attemptsRemaining>0){if(await a(Jd),m)return;w(await x(),"population_registry")}}catch(T){if(T instanceof ce&&T.code==="method_required"){await C().catch(()=>{});return}E=!0;return}u!==null&&pe(u)&&L(We(u,{autoRetry:i}))},M=()=>(R??(R=U()),R),B=async()=>{let Y=(await g()).turnstileSiteKey;return Y===null?{sandbox:!0}:{channel:"hosted_web",siteKey:Y,turnstileToken:await A(Y,{signal:h.signal})}},D=null,P=Promise.resolve(),H=0,F=async()=>{let T=await g();for(let Y=0;Y<Kd&&!m&&!pe(T)&&Ie(T)===void 0&&T.steps.some(j=>j.state==="processing")&&(await a(Yd),!m);Y+=1)T=await C();return T},G=async(T,Y,j)=>{let{capture:ie}=T,ee=()=>m,oe=()=>T.alive&&T.attempt===j,le=Ae=>{oe()&&ie.setFlowState(Ae)},se=Ae=>{if(!ee()&&(L(Ae),!!oe())){if(Ae.status==="retry"&&o==="auto"){ie.handle.retry();return}ie.setFlowState("done")}};if(Y.degraded==="NO_RECORDER"){let Ae=u?.sessionId??(await g().catch(()=>null))?.sessionId??"";se(ke(Ae,"no_recorder"));return}le("uploading");try{if(await M(),ee())return;let Ae=await g();if(!pe(Ae)&&Re(Ae)!==null){await Z(!1),se(ke(Ae.sessionId,"method_required"));return}if(!pe(Ae)){if(Ie(Ae)?.checkType==="population_registry"){se(ke(Ae.sessionId,y?"nni_unbound":E?"network":"registry_unavailable"));return}if(await I(),ee())return;let Ee=await Gr({...b,artifacts:Y,getAttestation:B,getView:()=>u??Ae,refreshView:C,applySubmit:w,onPhase:le,isCancelled:ee,onKeyframePromoted:be=>{d=be}});if(ee())return;if(Ee.kind==="unavailable"){if(Ee.reason==="method_required"&&await Z(!0),ee())return;se(ke(Ae.sessionId,Ee.reason));return}Ee.kind==="resync"&&await C(),Ae=await F()}se(We(Ae,{autoRetry:i}))}catch{if(ee())return;se(ke(u?.sessionId??"","network"))}},V=(T,Y)=>{let j=T.attempt;H>0&&T.alive&&T.capture.setFlowState("uploading"),H+=1,P=P.then(()=>G(T,Y,j)).finally(()=>{H-=1,H===0&&l?.onChainIdle()}).catch(()=>{})},W=T=>{D?.capture.handle.destroy(),D!==null&&(D.alive=!1);let Y=ci(T,l?.captureInternals?.(T)??t.capture,()=>u?.capture?.liveness?.keyframe?.rank===!0),j={capture:Y,alive:!0,attempt:0};D=j,Y.handle.on("state",ee=>{ee==="starting"&&(j.attempt+=1)}),Y.handle.on("captured",ee=>{Promise.resolve().then(()=>V(j,ee))});let ie=Y.handle;return{get state(){return ie.state},on:(ee,oe)=>ie.on(ee,oe),start:ee=>ie.start(ee),retry:()=>ie.retry(),switchCamera:()=>ie.switchCamera(),destroy:()=>{j.alive=!1,D===j&&(D=null),ie.destroy()}}},z=async()=>{if(m)return null;try{let T=await g();return m?null:Re(T)}catch{return null}},X=async()=>{if(m)return!1;try{let T=await g();if(m||pe(T))return!1;let Y=Te(T,"liveness");return Et(Y)&&Y?.requiresMobile===!0&&!Ve()}catch{return!1}},S=async()=>{if(m)return!1;try{let T=await g();return!m&&T.returning===!0}catch{return!1}},_=async T=>{let Y=await r.selectMethod(T);m||p(Y)},K=null,$=()=>(K??(K=Promise.resolve().then(()=>(xA(),MA)).then(T=>{let Y=T.createPlanRunner({runtime:b,currentView:()=>u,ensureView:g,refreshView:C,ensureConsent:()=>I(),selectMethod:_,liveness:W,chainBusy:()=>H>0,destroyed:()=>m,sleep:a,isMobile:Ve,now:t.now??Date.now,keptFaceKey:()=>d,setView:p,baseCapture:t.capture,emitStep:j=>{m||c.emit("step",j)},emitResult:q,...t.document!==void 0?{documentInternals:t.document}:{},...t.portrait!==void 0?{portraitInternals:t.portrait}:{},livePhotoInternals:t.livePhoto});return l=Y,Y})),K);return{consent:()=>I(),startRegistry:M,methodChoice:z,selectMethod:_,mobileRequired:X,returning:S,liveness:W,run:async()=>{if(m)throw new Error("verification destroyed");return(await $()).run()},currentStep:()=>l?.current()??null,voiceClips:async()=>{if(m)return null;try{let T=await g();return m?null:T.voice??null}catch{return null}},on:(T,Y)=>c.on(T,Y),destroy:()=>{m=!0,h.abort(),l?.destroy(),D!==null&&(D.alive=!1,D.capture.handle.destroy(),D=null),c.clear()}}}Qo();function vA(e){return/^\d{10}$/.test(e)&&Number(e)%97===1}function RA(e){let t="";for(let n of e){let i=n.codePointAt(0)??0;i>=1632&&i<=1641?t+=String(i-1632):i>=1776&&i<=1785?t+=String(i-1776):n!==" "&&n!=="-"&&n!=="\xA0"&&(t+=n)}return t}ut();var Wn=["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW"];var Mo=["carte_identite","passport","residence_permit"];function xo(e,t){let n=e.byIssuer?.[t]??e.default;return Mo.filter(i=>n==="*"||n.includes(i))}function TA(e,t=Wn){return[...new Set([...t,...Object.keys(e.byIssuer??{})])].filter(i=>xo(e,i).length>0).sort()}function zn(e){if(e.acceptedDocuments)return e.acceptedDocuments;let t=e.acceptedDocumentTypes?.length?[...e.acceptedDocumentTypes]:["carte_identite","passport"];return{default:[],byIssuer:{MR:t}}}function _A(e){return/^[A-Z]{2}$/.test(e)?String.fromCodePoint(...[...e].map(t=>127462+t.charCodeAt(0)-65)):""}bt();var vo=["national_number","document_photo","national_eid"],jd=["national_number","document_photo"],Zd=new Set(["eid_not_enrolled","eid_unavailable","eid_locked"]),Xn="platform_unsupported",$d=new Set(["prefilled","user_entered","prefilled_or_entered"]),eg={phone_otp:"contact",email_otp:"contact",eid_auth:"identity",doc_ocr:"identity",nfc_chip:"identity",population_registry:"identity",liveness:"live_photo",portrait_icao:"live_photo",face_match:"live_photo"};function De(e){return e.section??eg[e.checkType]??null}function tg(e){let t={sessionId:e.sessionId,orgName:e.orgName,returning:e.returning===!0,consentRecorded:e.consentRecorded,expiresAt:e.expiresAt,sections:[]};for(let n of e.steps){let i=De(n);i!==null&&!t.sections.includes(i)&&t.sections.push(i)}return e.branding!==void 0&&(t.branding=e.branding),t}function ng(e){let t={attemptsRemaining:e.attemptsRemaining,attemptsExhausted:e.attemptsExhausted===!0};return e.reason!==void 0&&(t.reason=e.reason),t}function ig(e,t){let n=e.otpChoice;if(n===void 0||n.locked||n.selected===null)return;let i=t==="phone_otp"?"email":"phone";return n.options.includes(i)?i:void 0}function og(e,t,n,i){let o=t.checkType==="email_otp",r=(o?t.emailOtp:t.otp)??{},a=o?t.emailOtp?.emailSource:t.otp?.numberSource,s=a!==void 0&&$d.has(a)?a:o?"prefilled_or_entered":"user_entered",A=typeof r.sentToMasked=="string"&&r.sentToMasked.length>0,c=ig(e,o?"email_otp":"phone_otp"),l={key:t.checkType,context:n,section:De(t),phase:A?"verify":"send",canSwitch:c!==void 0,...i},d=o?{kind:"email_otp",...l,emailSource:s,needsEmail:s!=="prefilled"}:{kind:"phone_otp",...l,numberSource:s,needsPhone:s!=="prefilled",channels:(t.otp?.channels??[]).filter(m=>m==="whatsapp"||m==="sms")};return c!==void 0&&(d.switchChannel=c),A&&(d.sentToMasked=r.sentToMasked),!o&&t.otp?.channel!==void 0&&(d.channel=t.otp.channel),r.expiresAt!==void 0&&(d.codeExpiresAt=r.expiresAt),r.resendAvailableAt!==void 0&&(d.resendAvailableAt=r.resendAvailableAt),d}function rg(e,t,n,i){let o=e.nniBound===!0?"bound":t.nniFromDocument===!0?"document":"typed",r=o==="typed"&&t.state==="input_required"&&t.reason==="nni_recheck",a=t.reason==="nni_not_found"&&t.state==="input_required"&&!i.attemptsExhausted&&e.methodChoice?.available===!0&&e.methodChoice.options.includes("document_photo");return{kind:"registry",key:"registry",context:n,section:De(t),state:t.state==="input_required"?"input_required":"pending",source:o,recheck:r,canUseDocument:a,...i}}function ag(e,t,n,i){let o=[...t.acceptedSides??[]];return{kind:"document",key:"document",context:n,section:De(t),side:o.includes("recto")?"verso":"recto",acceptedSides:o,documents:zn(e),...i}}function sg(e){let t=e.steps.find(n=>n.checkType==="liveness");return t?.state==="passed"||t?.state==="review"}function LA(e,t,n,i,o){let r=t.icao?.report;return{kind:"portrait",key:`portrait:${o}`,context:n,section:De(t),phase:o,report:Array.isArray(r)?r:null,review:t.state==="review",tuning:e.capture?.icao??null,tuningVersion:e.capture?.tuningVersion??null,icao:Me(e),retakeOnly:o==="capture"&&t.state==="input_required"&&e.capture?.livePhoto?.oneCapture===!0&&sg(e),...i}}var Do={minLongSidePx:1280,jpegQuality:.95};function Ag(e,t){let n=e.capture?.livePhoto;if(n?.oneCapture!==!0)return null;let i=e.steps.find(r=>r.checkType==="portrait_icao"),o=n.still??Do;return{icao:t==="liveness"&&Me(e)!==null&&i!==void 0&&i.state==="pending"&&i.reason===void 0,still:{minLongSidePx:o.minLongSidePx??Do.minLongSidePx,jpegQuality:o.jpegQuality??Do.jpegQuality}}}function cg(e,t,n,i){let o=t.eid,r=De(t);if(o===void 0||o.challenge!=="app_code")return{kind:"unsupported",key:"unsupported:eid_auth",context:n,section:r,checkType:"eid_auth",reason:"update_required"};let a=e.methodChoice,s=a?.available===!0?a.options.find(l=>jd.includes(l)):void 0,A=s!==void 0&&t.state==="input_required"&&(t.reason!==void 0&&Zd.has(t.reason)||t.attemptsExhausted===!0||t.attemptsRemaining===0||t.reason==="eid_resend_limit"&&o.awaiting!=="code"),c={kind:"eid",key:"eid",context:n,section:r,provider:o.provider,providerName:o.providerName,country:o.country,challenge:"app_code",phase:o.awaiting==="code"?"code":"identifier",identifierBound:o.identifierBound===!0,canUseCamera:A,afterPass:o.afterPass==="continue"?"continue":"end",...i};return A&&(c.cameraMethod=s),o.expiresAt!==void 0&&(c.codeExpiresAt=o.expiresAt),o.resendAvailableAt!==void 0&&(c.resendAvailableAt=o.resendAvailableAt),o.resendsRemaining!==void 0&&(c.resendsRemaining=o.resendsRemaining),o.codeAttemptsRemaining!==void 0&&(c.codeAttemptsRemaining=o.codeAttemptsRemaining),c}function lg(e,t){if(t.checkType!=="face_match"||t.reason!==void 0)return null;let n=e.steps.find(i=>i.checkType==="portrait_icao");return n!==void 0&&(n.state==="passed"||n.state==="review")?n:null}function ug(e){return e.steps.some(t=>t.attemptsExhausted===!0)}function dg(e,t){let n=e.failureReason,i;n===Xn?i="platform_unsupported":e.status==="expired"?i="expired":e.status==="review_pending"?i="review":e.status==="completed"&&e.outcome==="approved"?i="approved":e.status==="completed"&&e.outcome==="review"?i="review":n==="device_cooldown"?i="cooldown":n!==void 0?i="policy_stop":ug(e)?i="attempts_exhausted":i="rejected";let o=i==="platform_unsupported"?{sessionId:e.sessionId,status:"unavailable"}:We(e,{autoRetry:!1}),r={kind:"result",key:"result",context:t,section:null,display:i,result:o};return n!==void 0&&(r.failureReason=n),e.retryAfter!==void 0&&(r.retryAfter=e.retryAfter),r}function gg(e,t){let n=e.identitySummary;if(n==null)return null;let i={kind:"identity_summary",key:"identity_summary",context:t,section:"identity",summaryKind:n.kind==="partial"?"partial":n.kind??"full",source:n.source,portraitAvailable:n.portrait?.available===!0,retakeAvailable:n.retakeAvailable===!0};for(let o of mg){let r=n[o];typeof r=="string"&&r!==""&&(i[o]=r)}return i}var mg=["fullName","birthDate","birthYear","nationality","documentType","documentNumberMasked","nniMasked","expiryDate","retakeTarget"];function FA(e,t={}){let n=tg(e);if(pe(e)||e.failureReason===Xn)return dg(e,n);let i=gg(e,n);if(i!==null)return i;let o=Re(e);if(o!==null){let c=o.options.filter(d=>vo.includes(d));if(c.length===0)return{kind:"unsupported",key:"unsupported:method",context:n,section:"identity",checkType:"method",reason:"platform_unsupported"};let l={kind:"method",key:"method",context:n,section:"identity",options:c};return c.includes("national_eid")&&o.nationalEid!==void 0&&(l.nationalEid=o.nationalEid),l}let r=Ie(e);if(r===void 0){let c=e.steps.find(l=>l.state==="processing");return{kind:"processing",key:"processing",context:n,section:c===void 0?null:De(c),stalled:!1}}let a=ng(r),s=r.checkType,A=De(r);switch(s){case"phone_otp":case"email_otp":{let c=e.otpChoice;return c!==void 0&&c.selected===null&&!c.locked?{kind:"contact_choice",key:"contact_choice",context:n,section:A,options:c.options.filter(l=>l==="phone"||l==="email"),selected:null,locked:!1}:og(e,r,n,a)}case"population_registry":return rg(e,r,n,a);case"eid_auth":return cg(e,r,n,a);case"doc_ocr":return ag(e,r,n,a);case"portrait_icao":return LA(e,r,n,a,"capture");case"liveness":case"face_match":{let c=lg(e,r);if(c!==null)return LA(e,c,n,a,"match");let l=r.requiresMobile===!0,d=Me(e);return l&&t.isMobile===!1?{kind:"mobile_required",key:"mobile_required",context:n,section:A,checkType:s}:{kind:"liveness",key:"biometric",context:n,section:A,mode:s==="face_match"?"selfie":"liveness",requiresMobile:l,instructions:d===null?"standard":"icao",icao:d,livePhoto:Ag(e,s),...a}}default:return{kind:"unsupported",key:`unsupported:${s}`,context:n,section:A,checkType:s,reason:s==="nfc_chip"?"platform_unsupported":"update_required"}}}var hg=Mo,pg=xo,fg=TA,Ig=zn,Cg=_A;var PA=()=>Promise.resolve().then(()=>(eo(),Bs));function NA(e){let t=null,n=null,i=!1,o=null,r=null,a=[],s=(c,l)=>{c.off=l.on(c.event,c.handler)},A=()=>(n??(n=PA().then(c=>{if(i)return null;let l=c.createDocumentCaptureInternal(e,{}).handle;for(let d of a)d.removed||s(d,l);return o!==null&&l.setSide(o),r!==null&&l.setGuide(r.guide),t=l,l})),n);return{get state(){return t?.state??"idle"},on:(c,l)=>{let d={event:c,handler:l,off:null,removed:!1};return a.push(d),t!==null&&s(d,t),()=>{d.removed=!0,d.off?.()}},start:async()=>{let c=await A();c!==null&&!i&&await c.start()},retry:()=>{t!==null?t.retry():A().then(c=>c?.start())},setSide:c=>{t!==null?t.setSide(c):o=c},shutter:()=>t?.shutter(),setTorch:c=>t?.setTorch(c),focusAt:(c,l)=>t?.focusAt(c,l),setGuide:c=>{t!==null?t.setGuide(c):r={guide:c}},destroy:()=>{i=!0,t?.destroy(),t=null,a.length=0}}}function GA(){PA().then(e=>e.warmDocumentCapture()).catch(()=>{})}function yg(e){return NA(e)}function Eg(){GA()}var OA=()=>Promise.resolve().then(()=>(Kn(),bo));function HA(e){let t=null,n=null,i=!1,o=[],r=(s,A)=>{s.off=A.on(s.event,s.handler)},a=()=>(n??(n=OA().then(s=>{if(i)return null;let A=s.createPortraitCaptureInternal(e).handle;for(let c of o)c.removed||r(c,A);return t=A,A})),n);return{get state(){return t?.state??"idle"},on:(s,A)=>{let c={event:s,handler:A,off:null,removed:!1};return o.push(c),t!==null&&r(c,t),()=>{c.removed=!0,c.off?.()}},start:async()=>{let s=await a();s!==null&&!i&&await s.start()},retry:()=>{t!==null?t.retry():a().then(s=>s?.start())},destroy:()=>{i=!0,t?.destroy(),t=null,o.length=0}}}function UA(){OA().then(e=>e.warmPortraitCapture()).catch(()=>{})}function bg(e){return HA(e)}function Bg(){UA()}var Ro=["session.completed","session.failed","session.review_pending","session.expired","session.cancelled"],Qg="sekyro-verify",Sg="width=480,height=720,noopener=false",wg=new Set(Ro);function kg(e){if(e===null||typeof e!="object")return!1;let t=e;return t.source==="sekyro"&&t.version===1&&typeof t.sessionId=="string"&&typeof t.event=="string"&&wg.has(t.event)}function Mg(e){let t=new URL(e.hostedUrl).origin,n=window.open(e.hostedUrl,Qg,Sg);if(!n)return{error:"popup_blocked"};let i=o=>{if(o.source!==n||o.origin!==t||!kg(o.data))return;let{source:r,version:a,event:s,sessionId:A}=o.data;e.onEvent({source:r,version:a,event:s,sessionId:A})};return window.addEventListener("message",i),{close(){window.removeEventListener("message",i),n.close()}}}function VA(e,t){return t.mode==="redirect"?(window.location.assign(e),{close(){}}):Mg({hostedUrl:e,onEvent:t.onEvent??(()=>{})})}st();ut();0&&(module.exports={DEFAULT_API_ORIGIN,DOCUMENT_TYPE_ORDER,HostedApiError,ISSUER_CODES,InvalidInputError,KNOWN_CODES,OtpInputError,PLATFORM_UNSUPPORTED,SEKYRO_EVENTS,WEB_IDENTITY_METHODS,acceptedIssuers,acceptedTypesFor,createDocumentCapture,createLivenessCapture,createPortraitCapture,createVerification,deriveStep,flagOf,getLivenessAssetsStatus,hasMultipleCameras,icaoPolicyOf,isKnownCode,isValidNni,normalizeNni,openHosted,preloadLivenessAssets,queryCameraPermission,releaseLivenessAssets,resolveAcceptedDocuments,sectionOf,subscribeCameraPermission,subscribeLivenessAssets,warmDocumentCapture,warmPortraitCapture});