joopjs 2.0.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.claude/skills/auth.md +235 -0
  2. package/.claude/skills/banking.md +377 -0
  3. package/.claude/skills/encryption.md +265 -0
  4. package/.claude/skills/finance.md +248 -0
  5. package/.claude/skills/observables.md +270 -0
  6. package/.claude/skills/security.md +240 -0
  7. package/.claude/skills/setup.md +196 -0
  8. package/.cursor/rules/joopjs.mdc +150 -0
  9. package/.github/copilot-instructions.md +143 -0
  10. package/.windsurf/rules/joopjs.md +226 -0
  11. package/CHANGELOG.md +81 -0
  12. package/README.md +47 -7
  13. package/ai-rules/AGENTS.md +241 -0
  14. package/ai-rules/GEMINI.md +183 -0
  15. package/dist/ai/index.js +15 -3
  16. package/dist/ai/index.js.map +1 -1
  17. package/dist/ai/index.mjs +15 -3
  18. package/dist/ai/index.mjs.map +1 -1
  19. package/dist/analytics/index.js +10 -2
  20. package/dist/analytics/index.js.map +1 -1
  21. package/dist/analytics/index.mjs +10 -2
  22. package/dist/analytics/index.mjs.map +1 -1
  23. package/dist/angular/index.d.mts +98 -27
  24. package/dist/angular/index.d.ts +98 -27
  25. package/dist/angular/index.js +44 -0
  26. package/dist/angular/index.js.map +1 -1
  27. package/dist/angular/index.mjs +39 -1
  28. package/dist/angular/index.mjs.map +1 -1
  29. package/dist/api/index.js +15 -3
  30. package/dist/api/index.js.map +1 -1
  31. package/dist/api/index.mjs +15 -3
  32. package/dist/api/index.mjs.map +1 -1
  33. package/dist/auth/index.js +15 -3
  34. package/dist/auth/index.js.map +1 -1
  35. package/dist/auth/index.mjs +15 -3
  36. package/dist/auth/index.mjs.map +1 -1
  37. package/dist/banking/index.js +15 -3
  38. package/dist/banking/index.js.map +1 -1
  39. package/dist/banking/index.mjs +15 -3
  40. package/dist/banking/index.mjs.map +1 -1
  41. package/dist/cache/index.js +15 -3
  42. package/dist/cache/index.js.map +1 -1
  43. package/dist/cache/index.mjs +15 -3
  44. package/dist/cache/index.mjs.map +1 -1
  45. package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
  46. package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
  47. package/dist/core/index.d.mts +34 -1
  48. package/dist/core/index.d.ts +34 -1
  49. package/dist/core/index.js +56 -5
  50. package/dist/core/index.js.map +1 -1
  51. package/dist/core/index.mjs +54 -6
  52. package/dist/core/index.mjs.map +1 -1
  53. package/dist/deeplink/index.js +15 -3
  54. package/dist/deeplink/index.js.map +1 -1
  55. package/dist/deeplink/index.mjs +15 -3
  56. package/dist/deeplink/index.mjs.map +1 -1
  57. package/dist/device/index.js +15 -3
  58. package/dist/device/index.js.map +1 -1
  59. package/dist/device/index.mjs +15 -3
  60. package/dist/device/index.mjs.map +1 -1
  61. package/dist/forms/index.js +15 -3
  62. package/dist/forms/index.js.map +1 -1
  63. package/dist/forms/index.mjs +15 -3
  64. package/dist/forms/index.mjs.map +1 -1
  65. package/dist/i18n/index.js +15 -3
  66. package/dist/i18n/index.js.map +1 -1
  67. package/dist/i18n/index.mjs +15 -3
  68. package/dist/i18n/index.mjs.map +1 -1
  69. package/dist/index.d.mts +2 -2
  70. package/dist/index.d.ts +2 -2
  71. package/dist/index.js +50 -8
  72. package/dist/index.js.map +1 -1
  73. package/dist/index.mjs +50 -8
  74. package/dist/index.mjs.map +1 -1
  75. package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
  76. package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
  77. package/dist/native-bridge/index.js +10 -2
  78. package/dist/native-bridge/index.js.map +1 -1
  79. package/dist/native-bridge/index.mjs +10 -2
  80. package/dist/native-bridge/index.mjs.map +1 -1
  81. package/dist/network/index.js +15 -3
  82. package/dist/network/index.js.map +1 -1
  83. package/dist/network/index.mjs +15 -3
  84. package/dist/network/index.mjs.map +1 -1
  85. package/dist/observability/index.js +15 -3
  86. package/dist/observability/index.js.map +1 -1
  87. package/dist/observability/index.mjs +15 -3
  88. package/dist/observability/index.mjs.map +1 -1
  89. package/dist/pwa/index.js +15 -3
  90. package/dist/pwa/index.js.map +1 -1
  91. package/dist/pwa/index.mjs +15 -3
  92. package/dist/pwa/index.mjs.map +1 -1
  93. package/dist/react/index.d.mts +2 -2
  94. package/dist/react/index.d.ts +2 -2
  95. package/dist/react/index.js +15 -3
  96. package/dist/react/index.js.map +1 -1
  97. package/dist/react/index.mjs +15 -3
  98. package/dist/react/index.mjs.map +1 -1
  99. package/dist/router/index.js +15 -3
  100. package/dist/router/index.js.map +1 -1
  101. package/dist/router/index.mjs +15 -3
  102. package/dist/router/index.mjs.map +1 -1
  103. package/dist/security/index.js +15 -3
  104. package/dist/security/index.js.map +1 -1
  105. package/dist/security/index.mjs +15 -3
  106. package/dist/security/index.mjs.map +1 -1
  107. package/dist/session/index.js +15 -3
  108. package/dist/session/index.js.map +1 -1
  109. package/dist/session/index.mjs +15 -3
  110. package/dist/session/index.mjs.map +1 -1
  111. package/dist/state/index.js +15 -3
  112. package/dist/state/index.js.map +1 -1
  113. package/dist/state/index.mjs +15 -3
  114. package/dist/state/index.mjs.map +1 -1
  115. package/dist/storage/index.js +15 -3
  116. package/dist/storage/index.js.map +1 -1
  117. package/dist/storage/index.mjs +15 -3
  118. package/dist/storage/index.mjs.map +1 -1
  119. package/dist/sync/index.js +15 -3
  120. package/dist/sync/index.js.map +1 -1
  121. package/dist/sync/index.mjs +15 -3
  122. package/dist/sync/index.mjs.map +1 -1
  123. package/dist/theme/index.js +15 -3
  124. package/dist/theme/index.js.map +1 -1
  125. package/dist/theme/index.mjs +15 -3
  126. package/dist/theme/index.mjs.map +1 -1
  127. package/dist/ui/index.js +15 -3
  128. package/dist/ui/index.js.map +1 -1
  129. package/dist/ui/index.mjs +15 -3
  130. package/dist/ui/index.mjs.map +1 -1
  131. package/dist/utilities/index.js +46 -4
  132. package/dist/utilities/index.js.map +1 -1
  133. package/dist/utilities/index.mjs +46 -4
  134. package/dist/utilities/index.mjs.map +1 -1
  135. package/dist/vue/index.d.mts +2 -2
  136. package/dist/vue/index.d.ts +2 -2
  137. package/dist/vue/index.js +15 -3
  138. package/dist/vue/index.js.map +1 -1
  139. package/dist/vue/index.mjs +15 -3
  140. package/dist/vue/index.mjs.map +1 -1
  141. package/dist/workflow/index.js +15 -3
  142. package/dist/workflow/index.js.map +1 -1
  143. package/dist/workflow/index.mjs +15 -3
  144. package/dist/workflow/index.mjs.map +1 -1
  145. package/package.json +96 -32
  146. package/scripts/setup-ai.mjs +133 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/models/error.models.ts","../../src/api/http/http-client.ts","../../src/events/index.ts","../../src/constants/index.ts","../../src/utilities/common.utility.ts","../../src/api/request.service.ts","../../src/api/http/interceptor.ts","../../src/api/http/retry.ts","../../src/api/http/circuit-breaker.ts","../../src/api/http/offline-queue.service.ts","../../src/api/http/polling.service.ts","../../src/api/http/file-saver.service.ts","../../src/api/response-mapper.ts","../../src/api/export.service.ts","../../src/api/webhook-verifier.ts","../../src/platform/platform.ts","../../src/api/idempotency.service.ts","../../src/api/http/http-client-extended.ts","../../src/api/http/interceptors.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type JoopErrorType = 'screen' | 'popup' | 'quiet' | 'inline';\n\nexport interface JoopError {\n status?: number;\n title?: string;\n message?: string;\n description?: string;\n icon?: string;\n style?: string;\n isTimeout?: boolean;\n type?: JoopErrorType;\n customData?: any;\n buttons?: JoopErrorButton[];\n}\n\nexport interface JoopErrorButton {\n label: string;\n action?: string;\n style?: string;\n actionData?: any;\n}\n\nexport class JoopHttpError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly statusText: string,\n public readonly body?: any\n ) {\n super(`HTTP ${statusCode}: ${statusText}`);\n this.name = 'JoopHttpError';\n }\n}\n\nexport class JoopEncryptionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JoopEncryptionError';\n }\n}\n","import { JoopHttpError } from '../../models/error.models';\nimport { JoopHttpMethod } from '../../enums';\n\nexport interface JoopFetchOptions {\n headers?: Record<string, string>;\n body?: any;\n signal?: AbortSignal;\n timeout?: number;\n}\n\n/**\n * Thin fetch wrapper — no Angular, no RxJS.\n * Use directly or extend for request/response interceptors.\n */\nexport class JoopHttpClient {\n\n async request<T = any>(method: JoopHttpMethod, url: string, options: JoopFetchOptions = {}): Promise<T> {\n const { headers = {}, body, timeout } = options;\n\n let signal = options.signal;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (timeout && !signal) {\n const controller = new AbortController();\n signal = controller.signal;\n timeoutId = setTimeout(() => controller.abort(), timeout);\n }\n\n const isFormData = body instanceof FormData;\n const fetchInit: RequestInit = {\n method,\n signal,\n headers: isFormData ? headers : { 'Content-Type': 'application/json', ...headers },\n body: body === undefined || body === null\n ? undefined\n : isFormData\n ? body\n : JSON.stringify(body),\n };\n\n try {\n const res = await fetch(url, fetchInit);\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { /* ignore */ }\n throw new JoopHttpError(res.status, res.statusText, errorBody);\n }\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n }\n\n get<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Get, url, options);\n }\n\n post<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Post, url, { ...options, body });\n }\n\n put<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Put, url, { ...options, body });\n }\n\n patch<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Patch, url, { ...options, body });\n }\n\n delete<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Delete, url, options);\n }\n\n /** Upload files with progress via XMLHttpRequest (fetch does not expose upload progress). */\n uploadWithProgress<T = any>(\n url: string,\n formData: FormData,\n onProgress: (percent: number) => void,\n headers: Record<string, string> = {}\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n Object.entries(headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText ? JSON.parse(xhr.responseText) : undefined);\n } else {\n reject(new JoopHttpError(xhr.status, xhr.statusText));\n }\n };\n xhr.onerror = () => reject(new JoopHttpError(0, 'Network error'));\n xhr.send(formData);\n });\n }\n}\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","export const DEFAULT_REQUEST_TIMEOUT = 30000;\nexport const DEFAULT_SESSION_TIMEOUT = 300000;\nexport const DEFAULT_SESSION_WAIT_TIMEOUT = 60000;\nexport const PAGE_TOKEN_KEY = 'pageToken';\nexport const DECRYPTION_FAILED = 'Response decryption failed';\nexport const SESSION_STORAGE_KEY = 'joopSession';\n","/** Remove a trailing slash from a URL string. */\nexport function removeTrailingSlash(url: string): string {\n return url?.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** Serialize a plain object to a URL-encoded query string. */\nexport function objectToQueryString(obj: Record<string, any>): string {\n return Object.entries(obj)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n}\n\n/** Deep-clone a JSON-serializable object. */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/** Check if a value is a plain object (not an array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Generate a random alphanumeric string of a given length. */\nexport function randomString(length: number, charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/** Convert a string to its hex representation. */\nexport function stringToHex(input: string): string {\n let result = '';\n for (let i = 0; i < input.length; i++) {\n result += input.charCodeAt(i).toString(16).slice(-4);\n }\n return result;\n}\n\n/** Convert an ArrayBuffer to a lowercase hex string. */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n return [...new Uint8Array(buffer)]\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/** Serialize a nested object into flat form-data-style string segments. */\nexport function flattenObject(obj: Record<string, any>, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (isPlainObject(value)) {\n Object.assign(result, flattenObject(value as Record<string, any>, fullKey));\n } else {\n result[fullKey] = String(value);\n }\n }\n return result;\n}\n","import { JoopHttpClient, JoopFetchOptions } from './http/http-client';\nimport { JoopClientProfile } from '../profile/client-profile.service';\nimport { JoopAesService } from '../encryption/aes.service';\nimport { JoopConfigService } from '../core/config/config.service';\nimport { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopRequestOptions } from '../models/api.models';\nimport { JoopHttpError, JoopEncryptionError } from '../models/error.models';\nimport { DECRYPTION_FAILED } from '../constants';\nimport { objectToQueryString, removeTrailingSlash } from '../utilities/common.utility';\nimport { JoopHttpMethod } from '../enums';\n\nexport type JoopLoadingState = { active: boolean; count: number };\n\n/**\n * High-level service request dispatcher.\n *\n * - Serialises request data\n * - Optionally encrypts (AES E2E)\n * - Tracks concurrent requests for loader visibility\n * - Decrypts encrypted responses\n */\nexport class JoopRequestService {\n private readonly _loading$ = new JoopBehaviorSubject<JoopLoadingState>({ active: false, count: 0 });\n private _requestCount = 0;\n\n constructor(\n private readonly _http: JoopHttpClient,\n private readonly _config: JoopConfigService,\n private readonly _profile: JoopClientProfile,\n private readonly _aes: JoopAesService\n ) {}\n\n /** Observable loading state — subscribe in any framework to drive a spinner. */\n loading$(): JoopObservable<JoopLoadingState> {\n return this._loading$.asObservable();\n }\n\n isLoading(): boolean {\n return this._loading$.getValue().active;\n }\n\n /**\n * Send a service request to the configured base URL.\n * @param serviceId Service/endpoint identifier appended to the base URL\n * @param data Request payload\n * @param options Loader, error, method overrides\n */\n async send<T = any>(serviceId: string, data: Record<string, any> = {}, options: JoopRequestOptions = {}): Promise<T> {\n const { useLoader = true, method = JoopHttpMethod.Post, headers = {} } = options;\n\n if (useLoader) this._incrementLoader();\n\n try {\n const url = this._buildUrl(serviceId);\n const body = await this._prepareBody(data);\n const fetchOpts: JoopFetchOptions = {\n headers,\n timeout: this._config.requestTimeout,\n };\n\n let response: any;\n if (method === JoopHttpMethod.Get) {\n const qs = objectToQueryString(body);\n response = await this._http.get<any>(`${url}?${qs}`, fetchOpts);\n } else {\n response = await this._http.post<any>(url, body, fetchOpts);\n }\n\n return await this._handleResponse<T>(response);\n } finally {\n if (useLoader) this._decrementLoader();\n }\n }\n\n /** Upload a file with progress. */\n async upload<T = any>(serviceId: string, formData: FormData, onProgress: (pct: number) => void): Promise<T> {\n const url = this._buildUrl(serviceId);\n this._incrementLoader();\n try {\n const res = await this._http.uploadWithProgress<any>(url, formData, onProgress);\n return await this._handleResponse<T>(res);\n } finally {\n this._decrementLoader();\n }\n }\n\n private _buildUrl(serviceId: string): string {\n const base = removeTrailingSlash(this._config.baseUrl);\n return `${base}/${serviceId}`;\n }\n\n private async _prepareBody(data: Record<string, any>): Promise<Record<string, any>> {\n if (!this._aes.isE2EEnabled(this._profile.isInitialRequest)) {\n return data;\n }\n const serialized = objectToQueryString(data);\n const encrypted = await this._aes.processEncryption(serialized, this._profile.pageToken);\n return encrypted;\n }\n\n private async _handleResponse<T>(response: any): Promise<T> {\n if (response?.encrypted && response?.encryptedData) {\n try {\n const decrypted = await this._aes.decryptResponse(response.encryptedData);\n return JSON.parse(decrypted) as T;\n } catch {\n throw new JoopEncryptionError(DECRYPTION_FAILED);\n }\n }\n return response as T;\n }\n\n private _incrementLoader(): void {\n this._requestCount++;\n this._loading$.next({ active: true, count: this._requestCount });\n }\n\n private _decrementLoader(): void {\n this._requestCount = Math.max(0, this._requestCount - 1);\n this._loading$.next({ active: this._requestCount > 0, count: this._requestCount });\n }\n}\n\n/** Convenience: catch JoopHttpError by status code. */\nexport function isHttpError(err: unknown, status?: number): err is JoopHttpError {\n return err instanceof JoopHttpError && (status === undefined || err.statusCode === status);\n}\n","export interface JoopRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n [key: string]: unknown;\n}\n\nexport interface JoopResponse<T = unknown> {\n status: number;\n headers: Record<string, string>;\n data: T;\n url: string;\n}\n\nexport type JoopRequestInterceptor = (req: JoopRequest) => JoopRequest | Promise<JoopRequest>;\nexport type JoopResponseInterceptor = (res: JoopResponse) => JoopResponse | Promise<JoopResponse>;\nexport type JoopErrorInterceptor = (err: unknown) => unknown | Promise<unknown>;\n\nexport class JoopInterceptorPipeline {\n private _req: JoopRequestInterceptor[] = [];\n private _res: JoopResponseInterceptor[] = [];\n private _err: JoopErrorInterceptor[] = [];\n\n addRequestInterceptor(fn: JoopRequestInterceptor): () => void {\n this._req.push(fn);\n return () => { this._req = this._req.filter(i => i !== fn); };\n }\n\n addResponseInterceptor(fn: JoopResponseInterceptor): () => void {\n this._res.push(fn);\n return () => { this._res = this._res.filter(i => i !== fn); };\n }\n\n addErrorInterceptor(fn: JoopErrorInterceptor): () => void {\n this._err.push(fn);\n return () => { this._err = this._err.filter(i => i !== fn); };\n }\n\n async processRequest(req: JoopRequest): Promise<JoopRequest> {\n let cur = req;\n for (const fn of this._req) cur = await fn(cur);\n return cur;\n }\n\n async processResponse(res: JoopResponse): Promise<JoopResponse> {\n let cur = res;\n for (const fn of this._res) cur = await fn(cur);\n return cur;\n }\n\n async processError(err: unknown): Promise<unknown> {\n let cur = err;\n for (const fn of this._err) cur = await fn(cur);\n return cur;\n }\n\n clear(): void { this._req = []; this._res = []; this._err = []; }\n}\n","export interface JoopRetryConfig {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n retryOn?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULTS: JoopRetryConfig = {\n maxAttempts: 3,\n baseDelayMs: 500,\n maxDelayMs: 30_000,\n jitter: true,\n};\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: Partial<JoopRetryConfig> = {}\n): Promise<T> {\n const cfg = { ...DEFAULTS, ...config };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= cfg.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt === cfg.maxAttempts) break;\n if (cfg.retryOn && !cfg.retryOn(err, attempt)) break;\n await _sleep(_calcDelay(attempt, cfg));\n }\n }\n throw lastError;\n}\n\nfunction _calcDelay(attempt: number, cfg: JoopRetryConfig): number {\n const exp = Math.min(cfg.baseDelayMs * Math.pow(2, attempt - 1), cfg.maxDelayMs);\n return cfg.jitter ? Math.floor(Math.random() * exp) : exp;\n}\n\nfunction _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","export type JoopCircuitState = 'closed' | 'open' | 'half-open';\n// Alias kept for back-compat\nexport type JoopCircuitBreakerState = JoopCircuitState;\n\nexport interface JoopCircuitBreakerConfig {\n name?: string;\n failureThreshold?: number;\n successThreshold?: number;\n timeoutMs?: number;\n volumeThreshold?: number;\n onStateChange?: (from: JoopCircuitState, to: JoopCircuitState, name: string) => void;\n}\n\nexport interface JoopCircuitBreakerStats {\n state: JoopCircuitState;\n failures: number;\n successes: number;\n totalCalls: number;\n lastFailureAt?: number;\n openedAt?: number;\n nextAttemptAt?: number;\n}\n\nexport class JoopCircuitBreakerOpenError extends Error {\n readonly nextAttemptAt: number;\n constructor(name: string, nextAttemptAt: number) {\n super(`Circuit \"${name}\" is OPEN. Retry after ${new Date(nextAttemptAt).toISOString()}`);\n this.name = 'JoopCircuitBreakerOpenError';\n this.nextAttemptAt = nextAttemptAt;\n }\n}\n\nexport class JoopCircuitBreaker {\n private readonly _name: string;\n private readonly failureThreshold: number;\n private readonly successThreshold: number;\n private readonly timeoutMs: number;\n private readonly volumeThreshold: number;\n private readonly onStateChangeFn?: JoopCircuitBreakerConfig['onStateChange'];\n\n private _state: JoopCircuitState = 'closed';\n private _failures = 0;\n private _successes = 0;\n private _totalCalls = 0;\n private _lastFailureAt?: number;\n private _openedAt?: number;\n\n constructor(nameOrConfig: string | (JoopCircuitBreakerConfig & { name: string }), config: JoopCircuitBreakerConfig = {}) {\n const merged = typeof nameOrConfig === 'string'\n ? { name: nameOrConfig, ...config }\n : { ...nameOrConfig, ...config };\n this._name = merged.name ?? 'default';\n this.failureThreshold = merged.failureThreshold ?? 5;\n this.successThreshold = merged.successThreshold ?? 2;\n this.timeoutMs = merged.timeoutMs ?? 30_000;\n this.volumeThreshold = merged.volumeThreshold ?? 1;\n this.onStateChangeFn = merged.onStateChange;\n }\n\n get state(): JoopCircuitState { return this._state; }\n get name(): string { return this._name; }\n\n private setState(to: JoopCircuitState): void {\n if (to === this._state) return;\n const from = this._state;\n this._state = to;\n if (to === 'open') this._openedAt = Date.now();\n this.onStateChangeFn?.(from, to, this._name);\n }\n\n private recordSuccess(): void {\n this._successes++;\n this._failures = 0;\n if (this._state === 'half-open' && this._successes >= this.successThreshold) {\n this._successes = 0;\n this.setState('closed');\n }\n }\n\n private recordFailure(): void {\n this._failures++;\n this._lastFailureAt = Date.now();\n this._successes = 0;\n if (this._state === 'half-open') {\n this.setState('open');\n } else if (\n this._state === 'closed' &&\n this._totalCalls >= this.volumeThreshold &&\n this._failures >= this.failureThreshold\n ) {\n this.setState('open');\n }\n }\n\n private canAttempt(): boolean {\n if (this._state !== 'open') return true;\n if (Date.now() - (this._openedAt ?? 0) >= this.timeoutMs) {\n this.setState('half-open');\n this._successes = 0;\n return true;\n }\n return false;\n }\n\n /** Primary execution method — throws JoopCircuitBreakerOpenError when open. */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.canAttempt()) {\n throw new JoopCircuitBreakerOpenError(this._name, (this._openedAt ?? 0) + this.timeoutMs);\n }\n this._totalCalls++;\n try {\n const result = await fn();\n this.recordSuccess();\n return result;\n } catch (err) {\n this.recordFailure();\n throw err;\n }\n }\n\n /** Alias kept for back-compat with original `call()` interface. */\n async call<T>(fn: () => Promise<T>): Promise<T> { return this.execute(fn); }\n\n async executeWithFallback<T>(fn: () => Promise<T>, fallback: () => Promise<T> | T): Promise<T> {\n try { return await this.execute(fn); }\n catch { return fallback(); }\n }\n\n getState(): JoopCircuitState { return this._state; }\n\n getStats(): JoopCircuitBreakerStats {\n return {\n state: this._state,\n failures: this._failures,\n successes: this._successes,\n totalCalls: this._totalCalls,\n lastFailureAt: this._lastFailureAt,\n openedAt: this._openedAt,\n nextAttemptAt: this._openedAt ? this._openedAt + this.timeoutMs : undefined,\n };\n }\n\n reset(): void {\n this._state = 'closed';\n this._failures = 0;\n this._successes = 0;\n this._totalCalls = 0;\n this._lastFailureAt = undefined;\n this._openedAt = undefined;\n }\n\n forceOpen(): void { this.setState('open'); }\n forceClose(): void { this._failures = 0; this.setState('closed'); }\n}\n\nexport class JoopCircuitBreakerRegistry {\n private static readonly store = new Map<string, JoopCircuitBreaker>();\n\n static get(name: string, config?: JoopCircuitBreakerConfig): JoopCircuitBreaker {\n if (!this.store.has(name)) this.store.set(name, new JoopCircuitBreaker(name, config));\n return this.store.get(name)!;\n }\n\n static getAll(): Map<string, JoopCircuitBreaker> { return new Map(this.store); }\n\n static reset(name?: string): void {\n if (name) { this.store.get(name)?.reset(); }\n else { this.store.forEach(cb => cb.reset()); }\n }\n}\n","export interface JoopQueuedRequest {\n id: string;\n fn: () => Promise<unknown>;\n resolve: (v: unknown) => void;\n reject: (e: unknown) => void;\n timestamp: number;\n}\n\nexport class JoopOfflineQueue {\n private _queue: JoopQueuedRequest[] = [];\n private _online = typeof navigator !== 'undefined' ? navigator.onLine : true;\n private _draining = false;\n\n constructor() {\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => this._onOnline());\n window.addEventListener('offline', () => { this._online = false; });\n }\n }\n\n isOnline(): boolean { return this._online; }\n queueLength(): number { return this._queue.length; }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({\n id: crypto.randomUUID(),\n fn: fn as () => Promise<unknown>,\n resolve: resolve as (v: unknown) => void,\n reject,\n timestamp: Date.now(),\n });\n });\n }\n\n async drainNow(): Promise<void> {\n if (this._draining) return;\n this._draining = true;\n while (this._queue.length > 0) {\n const entry = this._queue.shift()!;\n try { entry.resolve(await entry.fn()); } catch (err) { entry.reject(err); }\n }\n this._draining = false;\n }\n\n clear(): void {\n this._queue.forEach(e => e.reject(new Error('Queue cleared')));\n this._queue = [];\n }\n\n private _onOnline(): void {\n this._online = true;\n this.drainNow().catch(() => {});\n }\n}\n","import { JoopSubject } from '../../events';\n\nexport interface JoopPollConfig<T> {\n fn: () => Promise<T>;\n intervalMs: number;\n immediate?: boolean;\n stopWhen?: (result: T) => boolean;\n onError?: (err: unknown) => void;\n}\n\nexport class JoopPollingService {\n private _timers = new Map<string, ReturnType<typeof setInterval>>();\n private _subjects = new Map<string, JoopSubject<unknown>>();\n\n start<T>(id: string, config: JoopPollConfig<T>): JoopSubject<T> {\n this.stop(id);\n const subject = new JoopSubject<T>();\n this._subjects.set(id, subject as JoopSubject<unknown>);\n\n const run = async () => {\n try {\n const result = await config.fn();\n subject.next(result);\n if (config.stopWhen?.(result)) this.stop(id);\n } catch (err) {\n config.onError?.(err);\n }\n };\n\n if (config.immediate) run();\n this._timers.set(id, setInterval(run, config.intervalMs));\n return subject;\n }\n\n stop(id: string): void {\n const timer = this._timers.get(id);\n if (timer) { clearInterval(timer); this._timers.delete(id); }\n this._subjects.delete(id);\n }\n\n stopAll(): void { [...this._timers.keys()].forEach(id => this.stop(id)); }\n isPolling(id: string): boolean { return this._timers.has(id); }\n}\n","export interface JoopDownloadOptions {\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n body?: string | FormData;\n iosHandlerName?: string;\n}\n\nexport const IOS_WEBVIEW_MIME: Record<string, string> = {\n xls: 'data:application/xls;base64,',\n csv: 'data:text/xml;base64,',\n pdf: 'data:application/pdf;base64,',\n xlsx: 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,',\n doc: 'data:application/msword;base64,',\n docx: 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,',\n};\n\nconst MIME_TYPES: Record<string, string> = {\n txt: 'text/plain', pdf: 'application/pdf', csv: 'text/csv',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',\n};\n\nexport class JoopFileSaverService {\n isIosWebView(handlerName = 'mxDownloadPdf'): boolean {\n return !!(window as Record<string, any>)?.['webkit']?.['messageHandlers']?.[handlerName];\n }\n\n async download(url: string, options: JoopDownloadOptions = {}): Promise<void> {\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: options.headers,\n body: options.body,\n });\n\n if (!res.ok) throw new Error(`Download failed: ${res.status}`);\n\n const blob = await res.blob();\n const fileName = this._fileNameFromHeaders(res.headers) ?? 'download';\n\n if (options.iosHandlerName && this.isIosWebView(options.iosHandlerName)) {\n await this._sendToIos(blob, fileName, options.iosHandlerName);\n } else {\n this.saveBlob(blob, fileName);\n }\n }\n\n saveBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n getMimeType(fileName: string): string {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n return MIME_TYPES[ext] ?? 'application/octet-stream';\n }\n\n typedBlob(blob: Blob, fileName: string): Blob {\n return new Blob([blob], { type: this.getMimeType(fileName) });\n }\n\n private async _sendToIos(blob: Blob, fileName: string, handlerName: string): Promise<void> {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n const prefix = IOS_WEBVIEW_MIME[ext] ?? '';\n const base64 = await this.blobToBase64(blob);\n const parts = base64.split('base64,');\n const payload = prefix + (parts.length > 1 ? parts[1] : parts[0]);\n (window as Record<string, any>)['webkit']['messageHandlers'][handlerName].postMessage(payload);\n }\n\n private _fileNameFromHeaders(headers: Headers): string | null {\n const cd = headers.get('Content-Disposition') ?? '';\n const match = /filename=([^;]+)/i.exec(cd);\n return match ? match[1].trim().replace(/['\"]/g, '') : null;\n }\n}\n","export interface JoopRawComponent6 {\n compKey: string;\n compValue: string;\n}\n\nexport interface JoopRawResponse6 {\n scrId?: string;\n scrid?: string;\n compDet?: JoopRawComponent6[];\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopRawResponse {\n scrid?: string;\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n components?: Record<string, string>;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopMappedComponent {\n key: string;\n value: string;\n scope: string;\n dataKey: string;\n}\n\nexport interface JoopMappedResponse {\n scrid: string;\n segments: string;\n mxenc: string;\n mxencres: string;\n components: Record<string, string>;\n componentList: JoopMappedComponent[];\n errorCode?: string;\n errorDesc?: string;\n hasError: boolean;\n}\n\nconst SCOPE_PREFIXES: Record<string, string> = {\n M: 'M', O: 'O', N: 'N', S: 'S',\n};\n\nexport class JoopResponseMapper {\n /** Normalize a v6 or v7+ raw API response into a typed mapped response */\n map(raw: JoopRawResponse | JoopRawResponse6): JoopMappedResponse {\n const v7 = this._isV7(raw) ? raw as JoopRawResponse : this._convertV6ToV7(raw as JoopRawResponse6);\n\n const components = v7.components ?? {};\n const componentList = Object.entries(components).map(([key, value]) => ({\n key,\n value,\n scope: this.extractScope(key),\n dataKey: this.extractDataKey(key),\n }));\n\n return {\n scrid: v7.scrid ?? '',\n segments: v7.segments ?? '',\n mxenc: v7.mxenc ?? '',\n mxencres: v7.mxencres ?? '',\n components,\n componentList,\n errorCode: v7.errorCode,\n errorDesc: v7.errorDesc,\n hasError: !!(v7.errorCode && v7.errorCode !== '0' && v7.errorCode !== ''),\n };\n }\n\n /** Extract scope prefix from a component key (first char: M/O/N/S) */\n extractScope(key: string): string {\n const first = key.charAt(0).toUpperCase();\n return SCOPE_PREFIXES[first] ?? 'M';\n }\n\n /** Extract data key portion (everything after the first character) */\n extractDataKey(key: string): string {\n return key.length > 1 ? key.slice(1) : key;\n }\n\n /**\n * Build a property map from component list — groups by scope prefix.\n * e.g. \"MUserName\" → { scope: 'M', dataKey: 'UserName', value: '...' }\n */\n buildScopedMap(response: JoopMappedResponse): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n for (const comp of response.componentList) {\n if (!result[comp.scope]) result[comp.scope] = {};\n result[comp.scope][comp.dataKey] = comp.value;\n }\n return result;\n }\n\n /** Get a single component value from a mapped response */\n getComponent(response: JoopMappedResponse, key: string): string | null {\n return response.components[key] ?? null;\n }\n\n /** Check if the raw payload looks like a v7+ response (has 'components' key) */\n private _isV7(raw: JoopRawResponse | JoopRawResponse6): boolean {\n return 'components' in raw && raw.components != null;\n }\n\n private _convertV6ToV7(raw: JoopRawResponse6): JoopRawResponse {\n const components: Record<string, string> = {};\n for (const item of raw.compDet ?? []) {\n if (item.compKey) components[item.compKey] = item.compValue ?? '';\n }\n return {\n scrid: raw.scrid ?? raw.scrId,\n segments: raw.segments,\n mxenc: raw.mxenc,\n mxencres: raw.mxencres,\n components,\n errorCode: raw.errorCode,\n errorDesc: raw.errorDesc,\n };\n }\n}\n","export interface JoopCsvOptions {\n delimiter?: string;\n headers?: string[];\n includeHeaders?: boolean;\n bom?: boolean; // Excel BOM (UTF-8 with BOM)\n nullValue?: string;\n}\n\nexport class JoopExportService {\n /** Convert an array of objects to a CSV string */\n toCsv(data: Record<string, unknown>[], options: JoopCsvOptions = {}): string {\n if (!data.length) return '';\n const {\n delimiter = ',',\n headers,\n includeHeaders = true,\n bom = false,\n nullValue = '',\n } = options;\n\n const cols = headers ?? Object.keys(data[0]);\n const escape = (v: unknown): string => {\n const s = v == null ? nullValue : String(v);\n return s.includes(delimiter) || s.includes('\"') || s.includes('\\n')\n ? `\"${s.replace(/\"/g, '\"\"')}\"`\n : s;\n };\n\n const rows: string[] = [];\n if (includeHeaders) rows.push(cols.map(escape).join(delimiter));\n for (const row of data) rows.push(cols.map(k => escape(row[k])).join(delimiter));\n const csv = rows.join('\\r\\n');\n return bom ? '' + csv : csv;\n }\n\n /** Trigger browser download of a CSV string */\n downloadCsv(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, options);\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Download Excel-compatible CSV (with BOM so Excel reads UTF-8 correctly) */\n downloadExcel(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, { ...options, bom: true, delimiter: ',' });\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Convert data to a JSON string and download */\n downloadJson(data: unknown, filename: string, indent = 2): void {\n const json = JSON.stringify(data, null, indent);\n this._download(json, filename.endsWith('.json') ? filename : `${filename}.json`, 'application/json');\n }\n\n /** Download a plain-text file */\n downloadText(content: string, filename: string): void {\n this._download(content, filename, 'text/plain;charset=utf-8;');\n }\n\n /** Convert a 2D array (table) to CSV */\n tableToCsv(rows: unknown[][], headers?: string[], delimiter = ','): string {\n const esc = (v: unknown) => {\n const s = v == null ? '' : String(v);\n return s.includes(delimiter) || s.includes('\"') ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const lines: string[] = [];\n if (headers) lines.push(headers.map(esc).join(delimiter));\n for (const row of rows) lines.push(row.map(esc).join(delimiter));\n return lines.join('\\r\\n');\n }\n\n private _download(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n}\n","export type JoopWebhookProvider = 'stripe' | 'github' | 'generic';\n\nexport interface JoopWebhookOptions {\n toleranceSeconds?: number; // default: 300 (5 min)\n algorithm?: 'SHA-256' | 'SHA-1' | 'SHA-512';\n}\n\nexport class JoopWebhookVerifier {\n private _provider: JoopWebhookProvider = 'generic';\n\n for(provider: JoopWebhookProvider): JoopWebhookVerifier {\n const clone = new JoopWebhookVerifier();\n clone._provider = provider;\n return clone;\n }\n\n async verify(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n switch (this._provider) {\n case 'stripe': return this.verifyStripe(payload, signature, secret, opts);\n case 'github': return this.verifyGitHub(payload, signature, secret, opts);\n default: return this.verifyGeneric(payload, signature, secret, opts);\n }\n }\n\n /** Stripe: `Stripe-Signature: t=...,v1=...` */\n async verifyStripe(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));\n const t = parts['t'];\n const v1 = parts['v1'];\n if (!t || !v1) return false;\n\n if (!this.verifyTimestamp(parseInt(t, 10), opts.toleranceSeconds ?? 300)) return false;\n\n const signed = `${t}.${payload}`;\n const expected = await _hmac('SHA-256', secret, signed);\n return _safeEqual(expected, v1);\n }\n\n /** GitHub: `X-Hub-Signature-256: sha256=...` */\n async verifyGitHub(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const prefix = 'sha256=';\n if (!header.startsWith(prefix)) return false;\n const provided = header.slice(prefix.length);\n const expected = await _hmac('SHA-256', secret, payload);\n return _safeEqual(expected, provided);\n }\n\n /** Generic HMAC verification. signature is a hex string. */\n async verifyGeneric(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const algo = opts.algorithm ?? 'SHA-256';\n const expected = await _hmac(algo as AlgorithmIdentifier, secret, payload);\n return _safeEqual(expected, signature);\n }\n\n /** Returns true if the timestamp is within tolerance of now */\n verifyTimestamp(timestamp: number, toleranceSeconds = 300): boolean {\n const diff = Math.abs(Math.floor(Date.now() / 1000) - timestamp);\n return diff <= toleranceSeconds;\n }\n\n /** Compute the expected HMAC for a payload (for testing) */\n async sign(payload: string, secret: string, algo: AlgorithmIdentifier = 'SHA-256'): Promise<string> {\n return _hmac(algo, secret, payload);\n }\n}\n\nasync function _hmac(algorithm: AlgorithmIdentifier, secret: string, payload: string): Promise<string> {\n const enc = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw', enc.encode(secret),\n { name: 'HMAC', hash: algorithm },\n false, ['sign'],\n );\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(payload));\n return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction _safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopIdempotencyConfig {\n storage?: JoopStorageAdapter;\n ttlMs?: number; // default: 24 hours\n prefix?: string;\n}\n\ninterface _IdempotencyEntry {\n key: string;\n createdAt: number;\n expiresAt: number;\n}\n\nexport class JoopIdempotencyService {\n private _storage: JoopStorageAdapter;\n private _ttlMs: number;\n private _prefix: string;\n /** Internal key registry used for clearAll() and gc() (avoids requiring Storage.length/key()) */\n private _keys = new Set<string>();\n\n constructor(config: JoopIdempotencyConfig = {}) {\n this._ttlMs = config.ttlMs ?? 24 * 60 * 60 * 1000;\n this._prefix = config.prefix ?? 'joop_idem_';\n this._storage = config.storage ?? JoopPlatform.getStorage();\n }\n\n /**\n * Generate and store an idempotency key for the given operation.\n * Returns an existing (non-expired) key if one already exists.\n */\n generate(operationKey: string): string {\n const storageKey = this._prefix + operationKey;\n const existing = this.get(operationKey);\n if (existing) {\n this._keys.add(storageKey); // ensure clearAll() covers pre-existing keys\n return existing;\n }\n\n const key = _generateKey();\n const entry: _IdempotencyEntry = { key, createdAt: Date.now(), expiresAt: Date.now() + this._ttlMs };\n this._storage.setItem(storageKey, JSON.stringify(entry));\n this._keys.add(storageKey);\n return key;\n }\n\n /** Get the stored key for an operation, or null if expired/not found */\n get(operationKey: string): string | null {\n const storageKey = this._prefix + operationKey;\n const raw = this._storage.getItem(storageKey);\n if (!raw) return null;\n try {\n const entry: _IdempotencyEntry = JSON.parse(raw);\n if (Date.now() > entry.expiresAt) {\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n return null;\n }\n return entry.key;\n } catch {\n return null;\n }\n }\n\n /** Remove the key for an operation (e.g. after successful completion) */\n clear(operationKey: string): void {\n const storageKey = this._prefix + operationKey;\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n }\n\n /** Clear all idempotency keys managed by this instance */\n clearAll(): void {\n for (const k of this._keys) this._storage.removeItem(k);\n this._keys.clear();\n }\n\n /**\n * Wrap a fetch-based function with automatic idempotency key injection.\n * Clears the key on success; keeps it on failure so retries reuse the same key.\n */\n async wrap<T>(operationKey: string, fn: (idempotencyKey: string) => Promise<T>): Promise<T> {\n const key = this.generate(operationKey);\n try {\n const result = await fn(key);\n this.clear(operationKey);\n return result;\n } catch (e) {\n throw e;\n }\n }\n\n /** Remove all expired entries */\n gc(): void {\n const now = Date.now();\n for (const k of [...this._keys]) {\n const raw = this._storage.getItem(k);\n if (!raw) { this._keys.delete(k); continue; }\n try {\n const e: _IdempotencyEntry = JSON.parse(raw);\n if (now > e.expiresAt) { this._storage.removeItem(k); this._keys.delete(k); }\n } catch { this._storage.removeItem(k); this._keys.delete(k); }\n }\n }\n}\n\nfunction _generateKey(): string {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n return Array.from(buf).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n","// Extended HTTP client — parallel, race, deduplication, queue, typed wrappers\n// Builds on top of JoopHttpClient (no duplication of base logic)\n\nimport { JoopHttpClient, type JoopFetchOptions } from './http-client';\nimport { withRetry, type JoopRetryConfig } from './retry';\n\nexport interface JoopParallelResult<T> {\n index: number;\n url: string;\n data?: T;\n error?: Error;\n ok: boolean;\n ms: number;\n}\n\nexport interface JoopRequestQueueConfig {\n concurrency: number; // max parallel inflight, default 4\n onDrain?: () => void;\n}\n\ntype QueueEntry = { fn: () => Promise<any>; resolve: (v: any) => void; reject: (e: any) => void };\n\n/** Request deduplication cache — ongoing identical GET requests share one fetch */\nconst _inFlight = new Map<string, Promise<any>>();\n\nexport class JoopHttpClientExtended extends JoopHttpClient {\n // ── Parallel requests ───────────────────────────────────────────────────────\n\n /** Fire multiple GETs at once, collect all results (never throws). */\n async getAll<T = any>(\n urls: string[],\n options?: JoopFetchOptions,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n urls.map(async (url, index) => {\n const t0 = Date.now();\n try {\n const data = await this.get<T>(url, options);\n return { index, url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Post to multiple URLs in parallel (fire-and-collect). */\n async postAll<T = any>(\n requests: Array<{ url: string; body?: any; options?: JoopFetchOptions }>,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n requests.map(async (req, index) => {\n const t0 = Date.now();\n try {\n const data = await this.post<T>(req.url, req.body, req.options);\n return { index, url: req.url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url: req.url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Race multiple GET requests — resolves with the first successful response. */\n async race<T = any>(urls: string[], options?: JoopFetchOptions): Promise<{ data: T; url: string; ms: number }> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const errors: Error[] = [];\n urls.forEach(url => {\n const t0 = Date.now();\n this.get<T>(url, options).then(data => {\n if (!settled) { settled = true; resolve({ data, url, ms: Date.now() - t0 }); }\n }).catch(err => {\n errors.push(err);\n if (errors.length === urls.length) reject(errors[0]);\n });\n });\n });\n }\n\n /** Sequential requests — each result fed to a mapper for the next URL. */\n async chain<T = any>(\n steps: Array<(prevResult: T | undefined) => { url: string; body?: any; method?: 'GET' | 'POST' }>,\n options?: JoopFetchOptions,\n ): Promise<T[]> {\n const results: T[] = [];\n let prev: T | undefined;\n for (const step of steps) {\n const { url, body, method = 'GET' } = step(prev);\n prev = method === 'POST' ? await this.post<T>(url, body, options) : await this.get<T>(url, options);\n results.push(prev);\n }\n return results;\n }\n\n // ── Deduplication ─────────────────────────────────────────────────────────\n\n /** GET with request deduplication — concurrent identical URLs share one network call. */\n getDedup<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n const key = url + JSON.stringify(options?.headers ?? {});\n if (_inFlight.has(key)) return _inFlight.get(key) as Promise<T>;\n const promise = this.get<T>(url, options).finally(() => _inFlight.delete(key));\n _inFlight.set(key, promise);\n return promise;\n }\n\n // ── Retry wrapper ─────────────────────────────────────────────────────────\n\n /** GET with automatic retry on failure. */\n getWithRetry<T = any>(url: string, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.get<T>(url, options), retry);\n }\n\n postWithRetry<T = any>(url: string, body?: any, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.post<T>(url, body, options), retry);\n }\n\n // ── Request queue ──────────────────────────────────────────────────────────\n\n createQueue(config: JoopRequestQueueConfig = { concurrency: 4 }): JoopRequestQueue {\n return new JoopRequestQueue(config);\n }\n\n // ── Typed response helpers ────────────────────────────────────────────────\n\n /** GET that throws if the response does not pass a validator. */\n async getValidated<T>(\n url: string,\n validate: (data: unknown) => data is T,\n options?: JoopFetchOptions,\n ): Promise<T> {\n const data = await this.get<unknown>(url, options);\n if (!validate(data)) throw new TypeError(`JoopHttp: response from ${url} failed type validation`);\n return data;\n }\n\n /** GET with fallback value on error (never throws). */\n async getSafe<T>(url: string, fallback: T, options?: JoopFetchOptions): Promise<T> {\n try { return await this.get<T>(url, options); } catch { return fallback; }\n }\n\n /** POST with fallback on error. */\n async postSafe<T>(url: string, body?: any, fallback?: T, options?: JoopFetchOptions): Promise<T | undefined> {\n try { return await this.post<T>(url, body, options); } catch { return fallback; }\n }\n\n // ── Timeout helper ────────────────────────────────────────────────────────\n\n /** Set a default timeout on all subsequent requests. */\n withTimeout(ms: number): JoopHttpClientExtended {\n const child = new JoopHttpClientExtended();\n const orig = child.request.bind(child);\n child.request = (method, url, opts = {}) => orig(method, url, { timeout: ms, ...opts });\n return child;\n }\n\n // ── Sync-style callback wrapper ───────────────────────────────────────────\n\n /** \"Sync-style\" GET — callback-based wrapper (JS is single-threaded; true sync fetch doesn't exist).\n * Use only in contexts where you cannot use async/await (e.g., legacy callbacks). */\n getCallback<T = any>(\n url: string,\n onSuccess: (data: T) => void,\n onError: (err: Error) => void,\n options?: JoopFetchOptions,\n ): void {\n this.get<T>(url, options).then(onSuccess).catch(onError);\n }\n\n /** Batch multiple operations with concurrency limit. */\n async batch<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n concurrency = 4,\n ): Promise<Array<{ item: T; result?: R; error?: Error; ok: boolean }>> {\n const results: Array<{ item: T; result?: R; error?: Error; ok: boolean }> = [];\n for (let i = 0; i < items.length; i += concurrency) {\n const slice = items.slice(i, i + concurrency);\n const batch = await Promise.all(\n slice.map(async (item, idx) => {\n try {\n const result = await fn(item, i + idx);\n return { item, result, ok: true };\n } catch (e: any) {\n return { item, error: e, ok: false };\n }\n }),\n );\n results.push(...batch);\n }\n return results;\n }\n}\n\n// ── Request Queue ──────────────────────────────────────────────────────────────\n\nexport class JoopRequestQueue {\n private _queue: QueueEntry[] = [];\n private _running = 0;\n private readonly _config: JoopRequestQueueConfig;\n\n constructor(config: JoopRequestQueueConfig) {\n this._config = { concurrency: config.concurrency ?? 4, onDrain: config.onDrain };\n }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({ fn, resolve, reject });\n this._tick();\n });\n }\n\n get size(): number { return this._queue.length; }\n get inflight(): number { return this._running; }\n\n private _tick(): void {\n while (this._running < this._config.concurrency && this._queue.length > 0) {\n const entry = this._queue.shift()!;\n this._running++;\n entry.fn().then(entry.resolve, entry.reject).finally(() => {\n this._running--;\n this._tick();\n if (this._running === 0 && this._queue.length === 0) this._config.onDrain?.();\n });\n }\n }\n}\n","// Pre-built interceptors — attach to JoopInterceptorPipeline\nimport type { JoopRequestInterceptor, JoopResponseInterceptor, JoopErrorInterceptor } from './interceptor';\n\n// ── Auth Bearer interceptor ───────────────────────────────────────────────────\n\n/** Injects Authorization: Bearer <token> from a synchronous token getter. */\nexport function bearerAuthInterceptor(getToken: () => string | null | undefined): JoopRequestInterceptor {\n return req => {\n const token = getToken();\n if (token) {\n return { ...req, headers: { ...req.headers, Authorization: `Bearer ${token}` } };\n }\n return req;\n };\n}\n\n// ── Logging interceptor ───────────────────────────────────────────────────────\n\nexport interface JoopLogInterceptorOptions {\n logRequest?: boolean;\n logResponse?: boolean;\n logErrors?: boolean;\n logger?: { log: (...a: any[]) => void; warn: (...a: any[]) => void; error: (...a: any[]) => void };\n}\n\nexport function loggingRequestInterceptor(opts: JoopLogInterceptorOptions = {}): JoopRequestInterceptor {\n const log = opts.logger ?? console;\n return req => {\n if (opts.logRequest !== false) {\n log.log(`[JoopHTTP] ➜ ${req.method} ${req.url}`, req.body ? { body: req.body } : '');\n }\n return req;\n };\n}\n\nexport function loggingResponseInterceptor(opts: JoopLogInterceptorOptions = {}): JoopResponseInterceptor {\n const log = opts.logger ?? console;\n return res => {\n if (opts.logResponse !== false) {\n log.log(`[JoopHTTP] ✓ ${res.status}`, res.data);\n }\n return res;\n };\n}\n\nexport function loggingErrorInterceptor(opts: JoopLogInterceptorOptions = {}): JoopErrorInterceptor {\n const log = opts.logger ?? console;\n return err => {\n if (opts.logErrors !== false) {\n const e = err as any;\n log.error(`[JoopHTTP] ✗ ${e?.status ?? 0} ${e?.message}`, err);\n }\n return err;\n };\n}\n\n// ── Correlation ID interceptor ────────────────────────────────────────────────\n\n/** Injects X-Correlation-ID / X-Request-ID headers for distributed tracing. */\nexport function correlationInterceptor(\n getCorrelationId?: () => string,\n): JoopRequestInterceptor {\n const getId = getCorrelationId ?? (() => crypto.randomUUID?.() ?? Math.random().toString(36).slice(2));\n return req => ({\n ...req,\n headers: {\n ...req.headers,\n 'X-Correlation-ID': getId(),\n 'X-Request-ID': getId(),\n },\n });\n}\n\n// ── Base URL interceptor ──────────────────────────────────────────────────────\n\n/** Prepends a base URL to all relative request URLs. */\nexport function baseUrlInterceptor(baseUrl: string): JoopRequestInterceptor {\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return req => ({\n ...req,\n url: req.url.startsWith('http') ? req.url : `${base}${req.url.startsWith('/') ? '' : '/'}${req.url}`,\n });\n}\n\n// ── Retry-on-error interceptor ────────────────────────────────────────────────\n\nexport interface JoopRetryInterceptorOptions {\n maxRetries?: number; // default 2\n retryOn?: number[]; // HTTP status codes to retry, default [429, 502, 503, 504]\n backoffMs?: number; // base delay ms, default 300\n onRetry?: (attempt: number, err: any) => void;\n}\n\n/** Returns a JoopErrorInterceptor that re-throws after exponential back-off retries.\n * Wire this into JoopInterceptorPipeline.addErrorInterceptor().\n * Note: the interceptor itself can't retry transparently — callers use withRetry() wrapper instead.\n * This interceptor adds retry metadata to errors for upstream use.\n */\nexport function retryErrorInterceptor(opts: JoopRetryInterceptorOptions = {}): JoopErrorInterceptor {\n const maxRetries = opts.maxRetries ?? 2;\n const retryOn = opts.retryOn ?? [429, 502, 503, 504];\n return err => {\n const e = err as any;\n const shouldRetry = retryOn.includes(e?.status ?? 0);\n return Object.assign(e ?? {}, { _joopShouldRetry: shouldRetry, _joopMaxRetries: maxRetries });\n };\n}\n\n// ── Cache interceptor ─────────────────────────────────────────────────────────\n\nconst _cache = new Map<string, { data: any; expiresAt: number }>();\n\nexport interface JoopCacheInterceptorOptions {\n ttlMs?: number; // default 60_000 (1 minute)\n methods?: string[]; // default ['GET']\n}\n\nexport function cacheResponseInterceptor(opts: JoopCacheInterceptorOptions = {}): JoopResponseInterceptor {\n const ttl = opts.ttlMs ?? 60_000;\n const methods = (opts.methods ?? ['GET']).map(m => m.toUpperCase());\n return res => {\n if (methods.includes((res as any)._requestMethod?.toUpperCase() ?? 'GET')) {\n _cache.set((res as any)._requestUrl ?? '', { data: res.data, expiresAt: Date.now() + ttl });\n }\n return res;\n };\n}\n\nexport function cacheRequestInterceptor(): JoopRequestInterceptor {\n return req => {\n const cached = _cache.get(req.url);\n if (cached && cached.expiresAt > Date.now()) {\n // Signal to skip the real request by attaching pre-resolved data\n return Object.assign(req, { _cacheHit: true, _cachedData: cached.data });\n }\n return req;\n };\n}\n\nexport function clearCache(url?: string): void {\n url ? _cache.delete(url) : _cache.clear();\n}\n"]}
1
+ {"version":3,"sources":["../../src/models/error.models.ts","../../src/api/http/http-client.ts","../../src/events/index.ts","../../src/constants/index.ts","../../src/utilities/common.utility.ts","../../src/api/request.service.ts","../../src/api/http/interceptor.ts","../../src/api/http/retry.ts","../../src/api/http/circuit-breaker.ts","../../src/api/http/offline-queue.service.ts","../../src/api/http/polling.service.ts","../../src/api/http/file-saver.service.ts","../../src/api/response-mapper.ts","../../src/api/export.service.ts","../../src/api/webhook-verifier.ts","../../src/platform/platform.ts","../../src/api/idempotency.service.ts","../../src/api/http/http-client-extended.ts","../../src/api/http/interceptors.ts"],"names":[],"mappings":";AAsBO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,WAAA,CACkB,UAAA,EACA,UAAA,EACA,IAAA,EAChB;AACA,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQ,UAAU,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAJzB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AAAA,EANkB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAKpB,CAAA;AAEO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF,CAAA;;;ACxBO,IAAM,iBAAN,MAAqB;AAAA,EAE1B,MAAM,OAAA,CAAiB,MAAA,EAAwB,GAAA,EAAa,OAAA,GAA4B,EAAC,EAAe;AACtG,IAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAG,IAAA,EAAM,SAAQ,GAAI,OAAA;AAExC,IAAA,IAAI,SAAS,OAAA,CAAQ,MAAA;AACrB,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,OAAA,IAAW,CAAC,MAAA,EAAQ;AACtB,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAA,GAAS,UAAA,CAAW,MAAA;AACpB,MAAA,SAAA,GAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,aAAa,IAAA,YAAgB,QAAA;AACnC,IAAA,MAAM,SAAA,GAAyB;AAAA,MAC7B,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,UAAA,GAAa,OAAA,GAAU,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAAA,MACjF,IAAA,EAAM,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,GACjC,SACA,UAAA,GACE,IAAA,GACA,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC3B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,SAAS,CAAA;AACtC,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI;AAAE,UAAA,SAAA,GAAY,MAAM,IAAI,IAAA,EAAK;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAe;AAC3D,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,YAAY,SAAS,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAS,KAAA,CAAA;AAAA,IACxC,CAAA,SAAE;AACA,MAAA,IAAI,SAAA,KAAc,MAAA,EAAW,YAAA,CAAa,SAAS,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,GAAA,CAAa,KAAa,OAAA,EAAwC;AAChE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAA,KAAA,YAA+B,GAAA,EAAK,OAAO,CAAA;AAAA,EACzD;AAAA,EAEA,IAAA,CAAc,GAAA,EAAa,IAAA,EAAY,OAAA,EAAwC;AAC7E,IAAA,OAAO,KAAK,OAAA,CAAA,MAAA,aAAgC,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACvE;AAAA,EAEA,GAAA,CAAa,GAAA,EAAa,IAAA,EAAY,OAAA,EAAwC;AAC5E,IAAA,OAAO,KAAK,OAAA,CAAA,KAAA,YAA+B,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACtE;AAAA,EAEA,KAAA,CAAe,GAAA,EAAa,IAAA,EAAY,OAAA,EAAwC;AAC9E,IAAA,OAAO,KAAK,OAAA,CAAA,OAAA,cAAiC,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACxE;AAAA,EAEA,MAAA,CAAgB,KAAa,OAAA,EAAwC;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAA,QAAA,eAAkC,GAAA,EAAK,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,mBACE,GAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,GAAkC,EAAC,EACvB;AACZ,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,MAAM,GAAA,GAAM,IAAI,cAAA,EAAe;AAC/B,MAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,GAAG,CAAA;AACpB,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAA,CAAI,gBAAA,CAAiB,CAAA,EAAG,CAAC,CAAC,CAAA;AACtE,MAAA,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,CAAC,CAAA,KAAM;AAC7B,QAAA,IAAI,CAAA,CAAE,gBAAA,EAAkB,UAAA,CAAW,IAAA,CAAK,KAAA,CAAO,EAAE,MAAA,GAAS,CAAA,CAAE,KAAA,GAAS,GAAG,CAAC,CAAA;AAAA,MAC3E,CAAA;AACA,MAAA,GAAA,CAAI,SAAS,MAAM;AACjB,QAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AACzC,UAAA,OAAA,CAAQ,IAAI,YAAA,GAAe,IAAA,CAAK,MAAM,GAAA,CAAI,YAAY,IAAI,MAAS,CAAA;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAI,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,QACtD;AAAA,MACF,CAAA;AACA,MAAA,GAAA,CAAI,UAAU,MAAM,MAAA,CAAO,IAAI,aAAA,CAAc,CAAA,EAAG,eAAe,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AACF;;;AC3FA,IAAI,gBAAA,GAA6C,CAAC,KAAA,KAAU;AAE1D,EAAA,OAAA,CAAQ,KAAA,CAAM,wDAAwD,KAAK,CAAA;AAC7E,CAAA;AAWO,IAAM,cAAN,MAAqB;AAAA,EAClB,aAA4B,EAAC;AAAA,EAErC,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAgB;AAInB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AACxC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAqC,WAAA,CAAe;AAAA,EACjD,MAAA;AAAA,EAER,YAAY,YAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,KAAK,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAAA,EAES,UAAU,QAAA,EAAoC;AACrD,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,EACjC;AAAA,EAES,YAAA,GAAkC;AACzC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAwB;AAAA,EAC7B,YAAoB,YAAA,EAAsD;AAAtD,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAAuD;AAAA,EAAvD,YAAA;AAAA,EAEpB,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,KAAK;AAAE,MAAA,MAAA,GAAS,CAAA;AAAA,IAAG,CAAC,CAAA;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACnGO,IAAM,iBAAA,GAAoB,4BAAA;;;ACH1B,SAAS,oBAAoB,GAAA,EAAqB;AACvD,EAAA,OAAO,GAAA,EAAK,SAAS,GAAG,CAAA,GAAI,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACjD;AAGO,SAAS,oBAAoB,GAAA,EAAkC;AACpE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAI,EAC/C,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA,CAC3E,KAAK,GAAG,CAAA;AACb;;;ACUO,IAAM,qBAAN,MAAyB;AAAA,EAI9B,WAAA,CACmB,KAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAChB;AAAA,EAJgB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EAPF,SAAA,GAAY,IAAI,mBAAA,CAAsC,EAAE,QAAQ,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA;AAAA,EAC1F,aAAA,GAAgB,CAAA;AAAA;AAAA,EAUxB,QAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,UAAU,YAAA,EAAa;AAAA,EACrC;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS,CAAE,MAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAc,SAAA,EAAmB,IAAA,GAA4B,EAAC,EAAG,OAAA,GAA8B,EAAC,EAAe;AACnH,IAAA,MAAM,EAAE,SAAA,GAAY,IAAA,EAAM,4BAA8B,OAAA,GAAU,IAAG,GAAI,OAAA;AAEzE,IAAA,IAAI,SAAA,OAAgB,gBAAA,EAAiB;AAErC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,MAAM,SAAA,GAA8B;AAAA,QAClC,OAAA;AAAA,QACA,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,OACxB;AAEA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,MAAA,KAAA,KAAA,YAA+B;AACjC,QAAA,MAAM,EAAA,GAAK,oBAAoB,IAAI,CAAA;AACnC,QAAA,QAAA,GAAW,MAAM,KAAK,KAAA,CAAM,GAAA,CAAS,GAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAU,GAAA,EAAK,MAAM,SAAS,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAmB,QAAQ,CAAA;AAAA,IAC/C,CAAA,SAAE;AACA,MAAA,IAAI,SAAA,OAAgB,gBAAA,EAAiB;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,CAAgB,SAAA,EAAmB,QAAA,EAAoB,UAAA,EAA+C;AAC1G,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACpC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAM,kBAAA,CAAwB,GAAA,EAAK,UAAU,UAAU,CAAA;AAC9E,MAAA,OAAO,MAAM,IAAA,CAAK,eAAA,CAAmB,GAAG,CAAA;AAAA,IAC1C,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,UAAU,SAAA,EAA2B;AAC3C,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrD,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,aAAa,IAAA,EAAyD;AAClF,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,aAAa,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,oBAAoB,IAAI,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAkB,UAAA,EAAY,IAAA,CAAK,SAAS,SAAS,CAAA;AACvF,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAmB,QAAA,EAA2B;AAC1D,IAAA,IAAI,QAAA,EAAU,SAAA,IAAa,QAAA,EAAU,aAAA,EAAe;AAClD,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,MAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,SAAS,aAAa,CAAA;AACxE,QAAA,OAAO,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,oBAAoB,iBAAiB,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,aAAA,EAAA;AACL,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,EAAQ,MAAM,KAAA,EAAO,IAAA,CAAK,eAAe,CAAA;AAAA,EACjE;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACvD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,gBAAgB,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,aAAA,EAAe,CAAA;AAAA,EACnF;AACF;AAGO,SAAS,WAAA,CAAY,KAAc,MAAA,EAAuC;AAC/E,EAAA,OAAO,GAAA,YAAe,aAAA,KAAkB,MAAA,KAAW,MAAA,IAAa,IAAI,UAAA,KAAe,MAAA,CAAA;AACrF;;;AC3GO,IAAM,0BAAN,MAA8B;AAAA,EAC3B,OAAiC,EAAC;AAAA,EAClC,OAAkC,EAAC;AAAA,EACnC,OAA+B,EAAC;AAAA,EAExC,sBAAsB,EAAA,EAAwC;AAC5D,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,uBAAuB,EAAA,EAAyC;AAC9D,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,oBAAoB,EAAA,EAAsC;AACxD,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,eAAe,GAAA,EAAwC;AAC3D,IAAA,IAAI,GAAA,GAAM,GAAA;AACV,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,IAAA,EAAM,GAAA,GAAM,MAAM,GAAG,GAAG,CAAA;AAC9C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,GAAA,EAA0C;AAC9D,IAAA,IAAI,GAAA,GAAM,GAAA;AACV,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,IAAA,EAAM,GAAA,GAAM,MAAM,GAAG,GAAG,CAAA;AAC9C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,GAAA,EAAgC;AACjD,IAAA,IAAI,GAAA,GAAM,GAAA;AACV,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,IAAA,EAAM,GAAA,GAAM,MAAM,GAAG,GAAG,CAAA;AAC9C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,OAAO,EAAC;AAAG,IAAA,IAAA,CAAK,OAAO,EAAC;AAAG,IAAA,IAAA,CAAK,OAAO,EAAC;AAAA,EAAG;AAClE;;;AClDA,IAAM,QAAA,GAA4B;AAAA,EAChC,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAEA,eAAsB,SAAA,CACpB,EAAA,EACA,MAAA,GAAmC,EAAC,EACxB;AACZ,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,QAAA,EAAU,GAAG,MAAA,EAAO;AACrC,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,GAAA,CAAI,aAAa,OAAA,EAAA,EAAW;AAC3D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,GAAY,GAAA;AACZ,MAAA,IAAI,OAAA,KAAY,IAAI,WAAA,EAAa;AACjC,MAAA,IAAI,IAAI,OAAA,IAAW,CAAC,IAAI,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA,EAAG;AAC/C,MAAA,MAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,MAAM,SAAA;AACR;AAEA,SAAS,UAAA,CAAW,SAAiB,GAAA,EAA8B;AACjE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,EAAG,GAAA,CAAI,UAAU,CAAA;AAC/E,EAAA,OAAO,GAAA,CAAI,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAG,CAAA,GAAI,GAAA;AACxD;AAEA,SAAS,OAAO,EAAA,EAA2B;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;;;ACnBO,IAAM,2BAAA,GAAN,cAA0C,KAAA,CAAM;AAAA,EAC5C,aAAA;AAAA,EACT,WAAA,CAAY,MAAc,aAAA,EAAuB;AAC/C,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,uBAAA,EAA0B,IAAI,KAAK,aAAa,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AACvF,IAAA,IAAA,CAAK,IAAA,GAAgB,6BAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AACF,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EAET,MAAA,GAA2B,QAAA;AAAA,EAC3B,SAAA,GAAc,CAAA;AAAA,EACd,UAAA,GAAc,CAAA;AAAA,EACd,WAAA,GAAc,CAAA;AAAA,EACd,cAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,YAAA,EAAsE,MAAA,GAAmC,EAAC,EAAG;AACvH,IAAA,MAAM,MAAA,GAAS,OAAO,YAAA,KAAiB,QAAA,GACnC,EAAE,IAAA,EAAM,YAAA,EAAc,GAAG,MAAA,EAAO,GAChC,EAAE,GAAG,YAAA,EAAc,GAAG,MAAA,EAAO;AACjC,IAAA,IAAA,CAAK,KAAA,GAAmB,OAAO,IAAA,IAAQ,SAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAmB,OAAO,SAAA,IAAoB,GAAA;AACnD,IAAA,IAAA,CAAK,eAAA,GAAmB,OAAO,eAAA,IAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,kBAAmB,MAAA,CAAO,aAAA;AAAA,EACjC;AAAA,EAEA,IAAI,KAAA,GAA0B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EACpD,IAAI,IAAA,GAAe;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAAO;AAAA,EAEhC,SAAS,EAAA,EAA4B;AAC3C,IAAA,IAAI,EAAA,KAAO,KAAK,MAAA,EAAQ;AACxB,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,IAAA,IAAI,EAAA,KAAO,MAAA,EAAQ,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAC7C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAA;AACL,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAI,KAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,UAAA,IAAc,KAAK,gBAAA,EAAkB;AAC3E,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,MAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,SAAA,EAAA;AACL,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,UAAA,GAAiB,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,IACtB,CAAA,MAAA,IACE,IAAA,CAAK,MAAA,KAAW,QAAA,IAChB,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,eAAA,IACzB,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,gBAAA,EACvB;AACA,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,UAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ,OAAO,IAAA;AACnC,IAAA,IAAI,KAAK,GAAA,EAAI,IAAK,KAAK,SAAA,IAAa,CAAA,CAAA,IAAM,KAAK,SAAA,EAAW;AACxD,MAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAW,EAAA,EAAkC;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAW,EAAG;AACtB,MAAA,MAAM,IAAI,4BAA4B,IAAA,CAAK,KAAA,EAAA,CAAQ,KAAK,SAAA,IAAa,CAAA,IAAK,KAAK,SAAS,CAAA;AAAA,IAC1F;AACA,IAAA,IAAA,CAAK,WAAA,EAAA;AACL,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAQ,EAAA,EAAkC;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,EAAE,CAAA;AAAA,EAAG;AAAA,EAE3E,MAAM,mBAAA,CAAuB,EAAA,EAAsB,QAAA,EAA4C;AAC7F,IAAA,IAAI;AAAE,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,IAAG,CAAA,CAAA,MAC/B;AAAE,MAAA,OAAO,QAAA,EAAS;AAAA,IAAG;AAAA,EAC7B;AAAA,EAEA,QAAA,GAA6B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAEnD,QAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,OAAe,IAAA,CAAK,MAAA;AAAA,MACpB,UAAe,IAAA,CAAK,SAAA;AAAA,MACpB,WAAe,IAAA,CAAK,UAAA;AAAA,MACpB,YAAe,IAAA,CAAK,WAAA;AAAA,MACpB,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,UAAe,IAAA,CAAK,SAAA;AAAA,MACpB,eAAe,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,GAAY;AAAA,KACpE;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAe,QAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAe,MAAA;AAAA,EACtB;AAAA,EAEA,SAAA,GAAmB;AAAE,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAAG;AAAA,EAC5C,UAAA,GAAmB;AAAE,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAG,IAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,EAAG;AACpE;;;ACjJO,IAAM,mBAAN,MAAuB;AAAA,EACpB,SAA8B,EAAC;AAAA,EAC/B,OAAA,GAAU,OAAO,SAAA,KAAc,WAAA,GAAc,UAAU,MAAA,GAAS,IAAA;AAAA,EAChE,SAAA,GAAY,KAAA;AAAA,EAEpB,WAAA,GAAc;AACZ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,MAAM,IAAA,CAAK,WAAW,CAAA;AACxD,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,MAAM;AAAE,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,MAAO,CAAC,CAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,QAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAAS;AAAA,EAC3C,WAAA,GAAsB;AAAE,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EAAQ;AAAA,EAEnD,QAAW,EAAA,EAAkC;AAC3C,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,QACf,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,EAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAChC,MAAA,IAAI;AAAE,QAAA,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,MAAG,SAAS,GAAA,EAAK;AAAE,QAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,MAAG;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,IAAI,KAAA,CAAM,eAAe,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,SAAS,EAAC;AAAA,EACjB;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,QAAA,EAAS,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChC;AACF;;;AC5CO,IAAM,qBAAN,MAAyB;AAAA,EACtB,OAAA,uBAAc,GAAA,EAA4C;AAAA,EAC1D,SAAA,uBAAgB,GAAA,EAAkC;AAAA,EAE1D,KAAA,CAAS,IAAY,MAAA,EAA2C;AAC9D,IAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAe;AACnC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,OAA+B,CAAA;AAEtD,IAAA,MAAM,MAAM,YAAY;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,EAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,IAAI,OAAO,QAAA,GAAW,MAAM,CAAA,EAAG,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC7C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,UAAU,GAAG,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,EAAI,YAAY,GAAA,EAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AACxD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,KAAK,EAAA,EAAkB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AAAE,MAAA,aAAA,CAAc,KAAK,CAAA;AAAG,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAAG;AAC5D,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAA,GAAgB;AAAE,IAAA,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,CAAA,EAAA,KAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAAG;AAAA,EACzE,UAAU,EAAA,EAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAAG;AAChE;;;ACnCO,IAAM,gBAAA,GAA2C;AAAA,EACtD,GAAA,EAAK,8BAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,8BAAA;AAAA,EACL,IAAA,EAAM,gFAAA;AAAA,EACN,GAAA,EAAK,iCAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,GAAA,EAAK,YAAA;AAAA,EAAc,GAAA,EAAK,iBAAA;AAAA,EAAmB,GAAA,EAAK,UAAA;AAAA,EAChD,GAAA,EAAK,0BAAA;AAAA,EACL,IAAA,EAAM,mEAAA;AAAA,EACN,GAAA,EAAK,oBAAA;AAAA,EACL,IAAA,EAAM,yEAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EAAa,GAAA,EAAK,YAAA;AAAA,EAAc,IAAA,EAAM,YAAA;AAAA,EAAc,GAAA,EAAK;AAChE,CAAA;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAA,CAAa,cAAc,eAAA,EAA0B;AACnD,IAAA,OAAO,CAAC,CAAE,MAAA,GAAiC,QAAQ,CAAA,GAAI,iBAAiB,IAAI,WAAW,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,QAAA,CAAS,GAAA,EAAa,OAAA,GAA+B,EAAC,EAAkB;AAC5E,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,MAC1B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAE7D,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,OAAO,CAAA,IAAK,UAAA;AAE3D,IAAA,IAAI,QAAQ,cAAA,IAAkB,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA,EAAG;AACvE,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,QAAA,EAAU,QAAQ,cAAc,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,MAAY,QAAA,EAAwB;AAC3C,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,GAAG,GAAG,GAAI,CAAA;AAAA,EACjD;AAAA,EAEA,aAAa,IAAA,EAA6B;AACxC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACrD,MAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AACjB,MAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,YAAY,QAAA,EAA0B;AACpC,IAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,IAAK,EAAA;AACxD,IAAA,OAAO,UAAA,CAAW,GAAG,CAAA,IAAK,0BAAA;AAAA,EAC5B;AAAA,EAEA,SAAA,CAAU,MAAY,QAAA,EAAwB;AAC5C,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,EAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,UAAA,CAAW,IAAA,EAAY,QAAA,EAAkB,WAAA,EAAoC;AACzF,IAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAAG,aAAY,IAAK,EAAA;AACxD,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAG,CAAA,IAAK,EAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,UAAU,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAA;AAC/D,IAAC,MAAA,CAA+B,QAAQ,CAAA,CAAE,iBAAiB,EAAE,WAAW,CAAA,CAAE,YAAY,OAAO,CAAA;AAAA,EAC/F;AAAA,EAEQ,qBAAqB,OAAA,EAAiC;AAC5D,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,EAAE,CAAA;AACzC,IAAA,OAAO,KAAA,GAAQ,MAAM,CAAC,CAAA,CAAE,MAAK,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,IAAA;AAAA,EACxD;AACF;;;AChDA,IAAM,cAAA,GAAyC;AAAA,EAC7C,CAAA,EAAG,GAAA;AAAA,EAAK,CAAA,EAAG,GAAA;AAAA,EAAK,CAAA,EAAG,GAAA;AAAA,EAAK,CAAA,EAAG;AAC7B,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA;AAAA,EAE9B,IAAI,GAAA,EAA6D;AAC/D,IAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,GAAG,IAAI,GAAA,GAAyB,IAAA,CAAK,eAAe,GAAuB,CAAA;AAEjG,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,UAAA,IAAc,EAAC;AACrC,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,MACtE,GAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AAAA,MAC5B,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,GAAG;AAAA,KAClC,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,MACnB,QAAA,EAAU,GAAG,QAAA,IAAY,EAAA;AAAA,MACzB,KAAA,EAAO,GAAG,KAAA,IAAS,EAAA;AAAA,MACnB,QAAA,EAAU,GAAG,QAAA,IAAY,EAAA;AAAA,MACzB,UAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAW,EAAA,CAAG,SAAA;AAAA,MACd,WAAW,EAAA,CAAG,SAAA;AAAA,MACd,QAAA,EAAU,CAAC,EAAE,EAAA,CAAG,aAAa,EAAA,CAAG,SAAA,KAAc,GAAA,IAAO,EAAA,CAAG,SAAA,KAAc,EAAA;AAAA,KACxE;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,GAAA,EAAqB;AAChC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY;AACxC,IAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,GAAA;AAAA,EAClC;AAAA;AAAA,EAGA,eAAe,GAAA,EAAqB;AAClC,IAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,QAAA,EAAsE;AACnF,IAAA,MAAM,SAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,aAAA,EAAe;AACzC,MAAA,IAAI,CAAC,OAAO,IAAA,CAAK,KAAK,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,EAAC;AAC/C,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,IAAA,CAAK,OAAO,IAAI,IAAA,CAAK,KAAA;AAAA,IAC1C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAA,CAAa,UAA8B,GAAA,EAA4B;AACrE,IAAA,OAAO,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA;AAAA,EACrC;AAAA;AAAA,EAGQ,MAAM,GAAA,EAAkD;AAC9D,IAAA,OAAO,YAAA,IAAgB,GAAA,IAAO,GAAA,CAAI,UAAA,IAAc,IAAA;AAAA,EAClD;AAAA,EAEQ,eAAe,GAAA,EAAwC;AAC7D,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG;AACpC,MAAA,IAAI,KAAK,OAAA,EAAS,UAAA,CAAW,KAAK,OAAO,CAAA,GAAI,KAAK,SAAA,IAAa,EAAA;AAAA,IACjE;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA;AAAA,MACxB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAA;AAAA,MACA,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AACF;;;ACpHO,IAAM,oBAAN,MAAwB;AAAA;AAAA,EAE7B,KAAA,CAAM,IAAA,EAAiC,OAAA,GAA0B,EAAC,EAAW;AAC3E,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAA;AACzB,IAAA,MAAM;AAAA,MACJ,SAAA,GAAY,GAAA;AAAA,MACZ,OAAA;AAAA,MACA,cAAA,GAAiB,IAAA;AAAA,MACjB,GAAA,GAAM,KAAA;AAAA,MACN,SAAA,GAAY;AAAA,KACd,GAAI,OAAA;AAEJ,IAAA,MAAM,OAAO,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,MAAA,MAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1C,MAAA,OAAO,EAAE,QAAA,CAAS,SAAS,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,IAAI,IAC9D,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA,GACzB,CAAA;AAAA,IACN,CAAA;AAEA,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,IAAI,cAAA,OAAqB,IAAA,CAAK,IAAA,CAAK,IAAI,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAC9D,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC5B,IAAA,OAAO,GAAA,GAAM,WAAM,GAAA,GAAM,GAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,WAAA,CAAY,IAAA,EAAiC,QAAA,EAAkB,OAAA,GAA0B,EAAC,EAAS;AACjG,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,QAAA,CAAS,QAAA,CAAS,MAAM,IAAI,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ,yBAAyB,CAAA;AAAA,EACzG;AAAA;AAAA,EAGA,aAAA,CAAc,IAAA,EAAiC,QAAA,EAAkB,OAAA,GAA0B,EAAC,EAAS;AACnG,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,CAAA;AACtE,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,QAAA,CAAS,QAAA,CAAS,MAAM,IAAI,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ,yBAAyB,CAAA;AAAA,EACzG;AAAA;AAAA,EAGA,YAAA,CAAa,IAAA,EAAe,QAAA,EAAkB,MAAA,GAAS,CAAA,EAAS;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,OAAO,IAAI,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA,EAAS,kBAAkB,CAAA;AAAA,EACrG;AAAA;AAAA,EAGA,YAAA,CAAa,SAAiB,QAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,2BAA2B,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,UAAA,CAAW,IAAA,EAAmB,OAAA,EAAoB,SAAA,GAAY,GAAA,EAAa;AACzE,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAe;AAC1B,MAAA,MAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,OAAO,CAAC,CAAA;AACnC,MAAA,OAAO,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA;AAAA,IACnF,CAAA;AACA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,QAAe,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAG,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AACxD,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/D,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEQ,SAAA,CAAU,OAAA,EAAiB,QAAA,EAAkB,QAAA,EAAwB;AAC3E,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,GAAG,GAAG,GAAI,CAAA;AAAA,EACjD;AACF;;;AC3EO,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAoB;AAAA,EACvB,SAAA,GAAiC,SAAA;AAAA,EAEzC,IAAI,QAAA,EAAoD;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAI,oBAAA,EAAoB;AACtC,IAAA,KAAA,CAAM,SAAA,GAAY,QAAA;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,OAAA,EAAiB,WAAmB,MAAA,EAAgB,IAAA,GAA2B,EAAC,EAAqB;AAChH,IAAA,QAAQ,KAAK,SAAA;AAAW,MACtB,KAAK,QAAA;AAAU,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW,QAAQ,IAAI,CAAA;AAAA,MACxE,KAAK,QAAA;AAAU,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW,QAAQ,IAAI,CAAA;AAAA,MACxE;AAAe,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,SAAA,EAAW,QAAQ,IAAI,CAAA;AAAA;AAC3E,EACF;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,OAAA,EAAiB,QAAgB,MAAA,EAAgB,IAAA,GAA2B,EAAC,EAAqB;AACnH,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA;AACzE,IAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,MAAM,IAAI,CAAA;AACrB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,EAAA,EAAI,OAAO,KAAA;AAEtB,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,CAAK,gBAAA,IAAoB,GAAG,CAAA,EAAG,OAAO,KAAA;AAEjF,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW,QAAQ,MAAM,CAAA;AACtD,IAAA,OAAO,UAAA,CAAW,UAAU,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,OAAA,EAAiB,QAAgB,MAAA,EAAgB,IAAA,GAA2B,EAAC,EAAqB;AACnH,IAAA,MAAM,MAAA,GAAS,SAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,MAAM,GAAG,OAAO,KAAA;AACvC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,SAAA,EAAW,QAAQ,OAAO,CAAA;AACvD,IAAA,OAAO,UAAA,CAAW,UAAU,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,aAAA,CAAc,OAAA,EAAiB,WAAmB,MAAA,EAAgB,IAAA,GAA2B,EAAC,EAAqB;AACvH,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,IAAa,SAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,EAA6B,QAAQ,OAAO,CAAA;AACzE,IAAA,OAAO,UAAA,CAAW,UAAU,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,eAAA,CAAgB,SAAA,EAAmB,gBAAA,GAAmB,GAAA,EAAc;AAClE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,SAAS,CAAA;AAC/D,IAAA,OAAO,IAAA,IAAQ,gBAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,OAAA,EAAiB,MAAA,EAAgB,OAA4B,SAAA,EAA4B;AAClG,IAAA,OAAO,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,EACpC;AACF;AAEA,eAAe,KAAA,CAAM,SAAA,EAAgC,MAAA,EAAgB,OAAA,EAAkC;AACrG,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IAC9B,KAAA;AAAA,IAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,IACxB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IAAO,CAAC,MAAM;AAAA,GAChB;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA;AACrE,EAAA,OAAO,MAAM,IAAA,CAAK,IAAI,WAAW,GAAG,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC1F;AAEA,SAAS,UAAA,CAAW,GAAW,CAAA,EAAoB;AACjD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAA,IAAQ,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAC3E,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;;;AC3DA,IAAM,WAAA,GAAc,CAAC,KAAA,MAAwC;AAAA,EAC3D,OAAA,EAAY,CAAC,CAAA,KAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,EAClC,SAAY,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EACxC,UAAA,EAAY,CAAC,CAAA,KAAM,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,EACrC,KAAA,EAAY,MAAM,KAAA,CAAM,KAAA;AAC1B,CAAA,CAAA;AAEA,IAAM,kBAAN,MAAoD;AAAA,EAC1C,EAAA,uBAAS,GAAA,EAAoB;AAAA,EACrC,QAAQ,CAAA,EAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA;AAAA,EAAM;AAAA,EAC5D,OAAA,CAAQ,GAAW,CAAA,EAAW;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EACnD,WAAW,CAAA,EAAgB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA,EAAG;AAAA,EAChD,KAAA,GAA2B;AAAE,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAAG;AAChD,CAAA;AAMA,SAAS,OAAA,GAA4B;AAEnC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,OAAA,KAAY,eAAe,OAAO,cAAA;AAEpF,EAAA,MAAM,KAAA,GAAS,WAAuC,SAAS,CAAA;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,KAAA,EAAO,QAAA,EAAU,MAAM,OAAO,MAAA;AAEnE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,SAAA;AACT;AAMO,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAe,QAA0B,OAAA,EAAQ;AAAA,EACjD,OAAe,WAAsC,EAAC;AAAA,EACtD,OAAe,WAAA,GAAyC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBxD,OAAO,IAAA,CAAK,MAAA,GAA6B,EAAC,EAAS;AACjD,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,QAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,UAAU,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG;AAAA,EAChE;AAAA;AAAA,EAGA,WAAW,IAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAAO;AAAA,EAEzD,OAAO,GAAG,IAAA,EAAiC;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,IAAA;AAAA,EAAM;AAAA,EACzE,OAAO,QAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,cAAA;AAAA,EAAgB;AAAA,EACpE,OAAO,KAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,KAAA;AAAA,EAAO;AAAA,EAC3D,OAAO,MAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,MAAA;AAAA,EAAQ;AAAA;AAAA,EAG5D,OAAO,UAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvE,OAAO,UAAA,GAAiC;AACtC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,KAAK,QAAA,CAAS,OAAA;AAChD,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,YAAY,YAAY,CAAA;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,EAAgB;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,iBAAA,GAAwC;AAC7C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,KAAK,QAAA,CAAS,OAAA;AAChD,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,YAAY,cAAc,CAAA;AAC5E,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,EAAgB;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,YAAA,GAAiC;AACtC,IAAA,OAAO;AAAA,MACL,aAAkB,OAAO,iBAAA,KAAsB,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,WAAA;AAAA,MAC9E,SAAkB,OAAO,MAAA,KAAW,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,MAAA;AAAA,MACnE,cAAkB,CAAC,EAAE,OAAO,UAAA,KAAe,WAAA,IAAgB,WAAuD,MAAA,EAAQ,MAAA,CAAA;AAAA,MAC1H,mBAAmB,OAAO,YAAA,KAAiB,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,OAAA;AAAA,MAC1E,GAAA,EAAkB,OAAO,QAAA,KAAa,WAAA;AAAA,MACtC,aAAA,EAAkB,OAAO,SAAA,KAAc,WAAA,IAAe,eAAA,IAAmB;AAAA,KAC3E;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,MAAA,GAAe;AACpB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AACrB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AACF,CAAA;;;ACjIO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAEA,KAAA,uBAAY,GAAA,EAAY;AAAA,EAEhC,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAW,MAAA,CAAO,KAAA,IAAS,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAW,OAAO,MAAA,IAAU,YAAA;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,OAAA,IAAW,YAAA,CAAa,UAAA,EAAW;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,YAAA,EAA8B;AACrC,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,GAAU,YAAA;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,UAAU,CAAA;AACzB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,KAAA,GAA2B,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,MAAA,EAAO;AACnG,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACvD,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,UAAU,CAAA;AACzB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,YAAA,EAAqC;AACvC,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,GAAU,YAAA;AAClC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAA2B,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,UAAU,CAAA;AACnC,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAA,EAA4B;AAChC,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,GAAU,YAAA;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,WAAW,UAAU,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,QAAA,GAAiB;AACf,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AACtD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CAAQ,YAAA,EAAsB,EAAA,EAAwD;AAC1F,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,GAAG,CAAA;AAC3B,MAAA,IAAA,CAAK,MAAM,YAAY,CAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,EAAA,GAAW;AACT,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACnC,MAAA,IAAI,CAAC,GAAA,EAAK;AAAE,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAG,QAAA;AAAA,MAAU;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3C,QAAA,IAAI,GAAA,GAAM,EAAE,SAAA,EAAW;AAAE,UAAA,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AAAG,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,QAAG;AAAA,MAC9E,CAAA,CAAA,MAAQ;AAAE,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AAAG,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAAG;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,CAAA;AAC7B,EAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,EAAA,OAAO,MAAM,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC1E;;;ACxFA,IAAM,SAAA,uBAAgB,GAAA,EAA0B;AAEzC,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,cAAA,CAAe;AAAA;AAAA;AAAA,EAIzD,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,EACkC;AAClC,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,MACb,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,EAAK,KAAA,KAAU;AAC7B,QAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAO,KAAK,OAAO,CAAA;AAC3C,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,EAAG;AAAA,QAC3D,SAAS,CAAA,EAAQ;AACf,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,EAAG;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QACJ,QAAA,EACkC;AAClC,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,MACb,QAAA,CAAS,GAAA,CAAI,OAAO,GAAA,EAAK,KAAA,KAAU;AACjC,QAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAQ,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAC9D,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,EAAG;AAAA,QACpE,SAAS,CAAA,EAAQ;AACf,UAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,GAAA,KAAQ,EAAA,EAAG;AAAA,QACzE;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,CAAc,IAAA,EAAgB,OAAA,EAA2E;AAC7G,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,MAAM,SAAkB,EAAC;AACzB,MAAA,IAAA,CAAK,QAAQ,CAAA,GAAA,KAAO;AAClB,QAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,QAAA,IAAA,CAAK,GAAA,CAAO,GAAA,EAAK,OAAO,CAAA,CAAE,KAAK,CAAA,IAAA,KAAQ;AACrC,UAAA,IAAI,CAAC,OAAA,EAAS;AAAE,YAAA,OAAA,GAAU,IAAA;AAAM,YAAA,OAAA,CAAQ,EAAE,MAAM,GAAA,EAAK,EAAA,EAAI,KAAK,GAAA,EAAI,GAAI,IAAI,CAAA;AAAA,UAAG;AAAA,QAC/E,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACd,UAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,UAAA,IAAI,OAAO,MAAA,KAAW,IAAA,CAAK,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACrD,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CACJ,KAAA,EACA,OAAA,EACc;AACd,IAAA,MAAM,UAAe,EAAC;AACtB,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,SAAS,KAAA,EAAM,GAAI,KAAK,IAAI,CAAA;AAC/C,MAAA,IAAA,GAAO,MAAA,KAAW,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,GAAA,CAAO,KAAK,OAAO,CAAA;AAClG,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,QAAA,CAAkB,KAAa,OAAA,EAAwC;AACrE,IAAA,MAAM,MAAM,GAAA,GAAM,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA,IAAW,EAAE,CAAA;AACvD,IAAA,IAAI,UAAU,GAAA,CAAI,GAAG,GAAG,OAAO,SAAA,CAAU,IAAI,GAAG,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAO,GAAA,EAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAC7E,IAAA,SAAA,CAAU,GAAA,CAAI,KAAK,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,YAAA,CAAsB,GAAA,EAAa,KAAA,EAAkC,OAAA,EAAwC;AAC3G,IAAA,OAAO,UAAU,MAAM,IAAA,CAAK,IAAO,GAAA,EAAK,OAAO,GAAG,KAAK,CAAA;AAAA,EACzD;AAAA,EAEA,aAAA,CAAuB,GAAA,EAAa,IAAA,EAAY,KAAA,EAAkC,OAAA,EAAwC;AACxH,IAAA,OAAO,SAAA,CAAU,MAAM,IAAA,CAAK,IAAA,CAAQ,KAAK,IAAA,EAAM,OAAO,GAAG,KAAK,CAAA;AAAA,EAChE;AAAA;AAAA,EAIA,WAAA,CAAY,MAAA,GAAiC,EAAE,WAAA,EAAa,GAAE,EAAqB;AACjF,IAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,GAAA,EACA,QAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAa,KAAK,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,QAAS,IAAI,SAAA,CAAU,CAAA,wBAAA,EAA2B,GAAG,CAAA,uBAAA,CAAyB,CAAA;AAChG,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,OAAA,CAAW,GAAA,EAAa,QAAA,EAAa,OAAA,EAAwC;AACjF,IAAA,IAAI;AAAE,MAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,QAAA;AAAA,IAAU;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,QAAA,CAAY,GAAA,EAAa,IAAA,EAAY,UAAc,OAAA,EAAoD;AAC3G,IAAA,IAAI;AAAE,MAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAQ,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,QAAA;AAAA,IAAU;AAAA,EAClF;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAAoC;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAI,uBAAA,EAAuB;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACrC,IAAA,KAAA,CAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,GAAA,EAAK,OAAO,EAAC,KAAM,IAAA,CAAK,MAAA,EAAQ,KAAK,EAAE,OAAA,EAAS,EAAA,EAAI,GAAG,MAAM,CAAA;AACtF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CACE,GAAA,EACA,SAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,GAAA,CAAO,KAAK,OAAO,CAAA,CAAE,KAAK,SAAS,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,KAAA,CACJ,KAAA,EACA,EAAA,EACA,cAAc,CAAA,EACuD;AACrE,IAAA,MAAM,UAAsE,EAAC;AAC7E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,WAAA,EAAa;AAClD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC1B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,EAAM,GAAA,KAAQ;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,EAAM,IAAI,GAAG,CAAA;AACrC,YAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,EAAK;AAAA,UAClC,SAAS,CAAA,EAAQ;AACf,YAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,IAAI,KAAA,EAAM;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,OACH;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAIO,IAAM,mBAAN,MAAuB;AAAA,EACpB,SAA0B,EAAC;AAAA,EAC3B,QAAA,GAAa,CAAA;AAAA,EACJ,OAAA;AAAA,EAEjB,YAAY,MAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,WAAA,EAAa,MAAA,CAAO,eAAe,CAAA,EAAG,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,EACjF;AAAA,EAEA,QAAW,EAAA,EAAkC;AAC3C,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,EAAE,EAAA,EAAI,OAAA,EAAS,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,IAAA,GAAe;AAAE,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EAAQ;AAAA,EAChD,IAAI,QAAA,GAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAEvC,KAAA,GAAc;AACpB,IAAA,OAAO,IAAA,CAAK,WAAW,IAAA,CAAK,OAAA,CAAQ,eAAe,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACzE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAChC,MAAA,IAAA,CAAK,QAAA,EAAA;AACL,MAAA,KAAA,CAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,CAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM;AACzD,QAAA,IAAA,CAAK,QAAA,EAAA;AACL,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA,IAAI,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA,CAAK,OAAO,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAU;AAAA,MAC9E,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;AC5NO,SAAS,sBAAsB,QAAA,EAAmE;AACvG,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,EAAE,GAAG,GAAA,CAAI,OAAA,EAAS,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG,EAAE;AAAA,IACjF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAWO,SAAS,yBAAA,CAA0B,IAAA,GAAkC,EAAC,EAA2B;AACtG,EAAA,MAAM,GAAA,GAAM,KAAK,MAAA,IAAU,OAAA;AAC3B,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,IAAI,IAAA,CAAK,eAAe,KAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,kBAAA,EAAgB,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,KAAS,EAAE,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,0BAAA,CAA2B,IAAA,GAAkC,EAAC,EAA4B;AACxG,EAAA,MAAM,GAAA,GAAM,KAAK,MAAA,IAAU,OAAA;AAC3B,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,EAAO;AAC9B,MAAA,GAAA,CAAI,IAAI,CAAA,kBAAA,EAAgB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,uBAAA,CAAwB,IAAA,GAAkC,EAAC,EAAyB;AAClG,EAAA,MAAM,GAAA,GAAM,KAAK,MAAA,IAAU,OAAA;AAC3B,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,IAAI,IAAA,CAAK,cAAc,KAAA,EAAO;AAC5B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,GAAA,CAAI,KAAA,CAAM,qBAAgB,CAAA,EAAG,MAAA,IAAU,CAAC,CAAA,CAAA,EAAI,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,uBACd,gBAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ,gBAAA,KAAqB,MAAM,MAAA,CAAO,UAAA,IAAa,IAAK,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA;AACpG,EAAA,OAAO,CAAA,GAAA,MAAQ;AAAA,IACb,GAAG,GAAA;AAAA,IACH,OAAA,EAAS;AAAA,MACP,GAAG,GAAA,CAAI,OAAA;AAAA,MACP,oBAAoB,KAAA,EAAM;AAAA,MAC1B,gBAAoB,KAAA;AAAM;AAC5B,GACF,CAAA;AACF;AAKO,SAAS,mBAAmB,OAAA,EAAyC;AAC1E,EAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,CAAS,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AAC5D,EAAA,OAAO,CAAA,GAAA,MAAQ;AAAA,IACb,GAAG,GAAA;AAAA,IACH,GAAA,EAAK,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,GAAI,GAAA,CAAI,MAAM,CAAA,EAAG,IAAI,GAAG,GAAA,CAAI,GAAA,CAAI,WAAW,GAAG,CAAA,GAAI,KAAK,GAAG,CAAA,EAAG,IAAI,GAAG,CAAA;AAAA,GACpG,CAAA;AACF;AAgBO,SAAS,qBAAA,CAAsB,IAAA,GAAoC,EAAC,EAAyB;AAClG,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AACtC,EAAA,MAAM,UAAa,IAAA,CAAK,OAAA,IAAa,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACxD,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,MAAM,CAAA,GAAI,GAAA;AACV,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,CAAS,CAAA,EAAG,UAAU,CAAC,CAAA;AACnD,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAA,IAAK,EAAC,EAAG,EAAE,gBAAA,EAAkB,WAAA,EAAa,eAAA,EAAiB,UAAA,EAAY,CAAA;AAAA,EAC9F,CAAA;AACF;AAIA,IAAM,MAAA,uBAAa,GAAA,EAA8C;AAO1D,SAAS,wBAAA,CAAyB,IAAA,GAAoC,EAAC,EAA4B;AACxG,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,IAAS,GAAA;AAC1B,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,GAAG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AAClE,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,IAAI,QAAQ,QAAA,CAAU,GAAA,CAAY,gBAAgB,WAAA,EAAY,IAAK,KAAK,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,GAAA,CAAK,GAAA,CAAY,WAAA,IAAe,EAAA,EAAI,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,uBAAA,GAAkD;AAChE,EAAA,OAAO,CAAA,GAAA,KAAO;AACZ,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,KAAI,EAAG;AAE3C,MAAA,OAAO,MAAA,CAAO,OAAO,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,WAAA,EAAa,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,WAAW,GAAA,EAAoB;AAC7C,EAAA,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,GAAI,OAAO,KAAA,EAAM;AAC1C","file":"index.mjs","sourcesContent":["export type JoopErrorType = 'screen' | 'popup' | 'quiet' | 'inline';\n\nexport interface JoopError {\n status?: number;\n title?: string;\n message?: string;\n description?: string;\n icon?: string;\n style?: string;\n isTimeout?: boolean;\n type?: JoopErrorType;\n customData?: any;\n buttons?: JoopErrorButton[];\n}\n\nexport interface JoopErrorButton {\n label: string;\n action?: string;\n style?: string;\n actionData?: any;\n}\n\nexport class JoopHttpError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly statusText: string,\n public readonly body?: any\n ) {\n super(`HTTP ${statusCode}: ${statusText}`);\n this.name = 'JoopHttpError';\n }\n}\n\nexport class JoopEncryptionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'JoopEncryptionError';\n }\n}\n","import { JoopHttpError } from '../../models/error.models';\nimport { JoopHttpMethod } from '../../enums';\n\nexport interface JoopFetchOptions {\n headers?: Record<string, string>;\n body?: any;\n signal?: AbortSignal;\n timeout?: number;\n}\n\n/**\n * Thin fetch wrapper — no Angular, no RxJS.\n * Use directly or extend for request/response interceptors.\n */\nexport class JoopHttpClient {\n\n async request<T = any>(method: JoopHttpMethod, url: string, options: JoopFetchOptions = {}): Promise<T> {\n const { headers = {}, body, timeout } = options;\n\n let signal = options.signal;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (timeout && !signal) {\n const controller = new AbortController();\n signal = controller.signal;\n timeoutId = setTimeout(() => controller.abort(), timeout);\n }\n\n const isFormData = body instanceof FormData;\n const fetchInit: RequestInit = {\n method,\n signal,\n headers: isFormData ? headers : { 'Content-Type': 'application/json', ...headers },\n body: body === undefined || body === null\n ? undefined\n : isFormData\n ? body\n : JSON.stringify(body),\n };\n\n try {\n const res = await fetch(url, fetchInit);\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { /* ignore */ }\n throw new JoopHttpError(res.status, res.statusText, errorBody);\n }\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n }\n\n get<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Get, url, options);\n }\n\n post<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Post, url, { ...options, body });\n }\n\n put<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Put, url, { ...options, body });\n }\n\n patch<T = any>(url: string, body?: any, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Patch, url, { ...options, body });\n }\n\n delete<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n return this.request<T>(JoopHttpMethod.Delete, url, options);\n }\n\n /** Upload files with progress via XMLHttpRequest (fetch does not expose upload progress). */\n uploadWithProgress<T = any>(\n url: string,\n formData: FormData,\n onProgress: (percent: number) => void,\n headers: Record<string, string> = {}\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n Object.entries(headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText ? JSON.parse(xhr.responseText) : undefined);\n } else {\n reject(new JoopHttpError(xhr.status, xhr.statusText));\n }\n };\n xhr.onerror = () => reject(new JoopHttpError(0, 'Network error'));\n xhr.send(formData);\n });\n }\n}\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","export const DEFAULT_REQUEST_TIMEOUT = 30000;\nexport const DEFAULT_SESSION_TIMEOUT = 300000;\nexport const DEFAULT_SESSION_WAIT_TIMEOUT = 60000;\nexport const PAGE_TOKEN_KEY = 'pageToken';\nexport const DECRYPTION_FAILED = 'Response decryption failed';\nexport const SESSION_STORAGE_KEY = 'joopSession';\n","/** Remove a trailing slash from a URL string. */\nexport function removeTrailingSlash(url: string): string {\n return url?.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** Serialize a plain object to a URL-encoded query string. */\nexport function objectToQueryString(obj: Record<string, any>): string {\n return Object.entries(obj)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n}\n\n/** Deep-clone a JSON-serializable object. */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/** Check if a value is a plain object (not an array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Generate a random alphanumeric string of a given length. */\nexport function randomString(length: number, charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/** Convert a string to its hex representation. */\nexport function stringToHex(input: string): string {\n let result = '';\n for (let i = 0; i < input.length; i++) {\n result += input.charCodeAt(i).toString(16).slice(-4);\n }\n return result;\n}\n\n/** Convert an ArrayBuffer to a lowercase hex string. */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n return [...new Uint8Array(buffer)]\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/** Serialize a nested object into flat form-data-style string segments. */\nexport function flattenObject(obj: Record<string, any>, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (isPlainObject(value)) {\n Object.assign(result, flattenObject(value as Record<string, any>, fullKey));\n } else {\n result[fullKey] = String(value);\n }\n }\n return result;\n}\n","import { JoopHttpClient, JoopFetchOptions } from './http/http-client';\nimport { JoopClientProfile } from '../profile/client-profile.service';\nimport { JoopAesService } from '../encryption/aes.service';\nimport { JoopConfigService } from '../core/config/config.service';\nimport { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopRequestOptions } from '../models/api.models';\nimport { JoopHttpError, JoopEncryptionError } from '../models/error.models';\nimport { DECRYPTION_FAILED } from '../constants';\nimport { objectToQueryString, removeTrailingSlash } from '../utilities/common.utility';\nimport { JoopHttpMethod } from '../enums';\n\nexport type JoopLoadingState = { active: boolean; count: number };\n\n/**\n * High-level service request dispatcher.\n *\n * - Serialises request data\n * - Optionally encrypts (AES E2E)\n * - Tracks concurrent requests for loader visibility\n * - Decrypts encrypted responses\n */\nexport class JoopRequestService {\n private readonly _loading$ = new JoopBehaviorSubject<JoopLoadingState>({ active: false, count: 0 });\n private _requestCount = 0;\n\n constructor(\n private readonly _http: JoopHttpClient,\n private readonly _config: JoopConfigService,\n private readonly _profile: JoopClientProfile,\n private readonly _aes: JoopAesService\n ) {}\n\n /** Observable loading state — subscribe in any framework to drive a spinner. */\n loading$(): JoopObservable<JoopLoadingState> {\n return this._loading$.asObservable();\n }\n\n isLoading(): boolean {\n return this._loading$.getValue().active;\n }\n\n /**\n * Send a service request to the configured base URL.\n * @param serviceId Service/endpoint identifier appended to the base URL\n * @param data Request payload\n * @param options Loader, error, method overrides\n */\n async send<T = any>(serviceId: string, data: Record<string, any> = {}, options: JoopRequestOptions = {}): Promise<T> {\n const { useLoader = true, method = JoopHttpMethod.Post, headers = {} } = options;\n\n if (useLoader) this._incrementLoader();\n\n try {\n const url = this._buildUrl(serviceId);\n const body = await this._prepareBody(data);\n const fetchOpts: JoopFetchOptions = {\n headers,\n timeout: this._config.requestTimeout,\n };\n\n let response: any;\n if (method === JoopHttpMethod.Get) {\n const qs = objectToQueryString(body);\n response = await this._http.get<any>(`${url}?${qs}`, fetchOpts);\n } else {\n response = await this._http.post<any>(url, body, fetchOpts);\n }\n\n return await this._handleResponse<T>(response);\n } finally {\n if (useLoader) this._decrementLoader();\n }\n }\n\n /** Upload a file with progress. */\n async upload<T = any>(serviceId: string, formData: FormData, onProgress: (pct: number) => void): Promise<T> {\n const url = this._buildUrl(serviceId);\n this._incrementLoader();\n try {\n const res = await this._http.uploadWithProgress<any>(url, formData, onProgress);\n return await this._handleResponse<T>(res);\n } finally {\n this._decrementLoader();\n }\n }\n\n private _buildUrl(serviceId: string): string {\n const base = removeTrailingSlash(this._config.baseUrl);\n return `${base}/${serviceId}`;\n }\n\n private async _prepareBody(data: Record<string, any>): Promise<Record<string, any>> {\n if (!this._aes.isE2EEnabled(this._profile.isInitialRequest)) {\n return data;\n }\n const serialized = objectToQueryString(data);\n const encrypted = await this._aes.processEncryption(serialized, this._profile.pageToken);\n return encrypted;\n }\n\n private async _handleResponse<T>(response: any): Promise<T> {\n if (response?.encrypted && response?.encryptedData) {\n try {\n const decrypted = await this._aes.decryptResponse(response.encryptedData);\n return JSON.parse(decrypted) as T;\n } catch {\n throw new JoopEncryptionError(DECRYPTION_FAILED);\n }\n }\n return response as T;\n }\n\n private _incrementLoader(): void {\n this._requestCount++;\n this._loading$.next({ active: true, count: this._requestCount });\n }\n\n private _decrementLoader(): void {\n this._requestCount = Math.max(0, this._requestCount - 1);\n this._loading$.next({ active: this._requestCount > 0, count: this._requestCount });\n }\n}\n\n/** Convenience: catch JoopHttpError by status code. */\nexport function isHttpError(err: unknown, status?: number): err is JoopHttpError {\n return err instanceof JoopHttpError && (status === undefined || err.statusCode === status);\n}\n","export interface JoopRequest {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n [key: string]: unknown;\n}\n\nexport interface JoopResponse<T = unknown> {\n status: number;\n headers: Record<string, string>;\n data: T;\n url: string;\n}\n\nexport type JoopRequestInterceptor = (req: JoopRequest) => JoopRequest | Promise<JoopRequest>;\nexport type JoopResponseInterceptor = (res: JoopResponse) => JoopResponse | Promise<JoopResponse>;\nexport type JoopErrorInterceptor = (err: unknown) => unknown | Promise<unknown>;\n\nexport class JoopInterceptorPipeline {\n private _req: JoopRequestInterceptor[] = [];\n private _res: JoopResponseInterceptor[] = [];\n private _err: JoopErrorInterceptor[] = [];\n\n addRequestInterceptor(fn: JoopRequestInterceptor): () => void {\n this._req.push(fn);\n return () => { this._req = this._req.filter(i => i !== fn); };\n }\n\n addResponseInterceptor(fn: JoopResponseInterceptor): () => void {\n this._res.push(fn);\n return () => { this._res = this._res.filter(i => i !== fn); };\n }\n\n addErrorInterceptor(fn: JoopErrorInterceptor): () => void {\n this._err.push(fn);\n return () => { this._err = this._err.filter(i => i !== fn); };\n }\n\n async processRequest(req: JoopRequest): Promise<JoopRequest> {\n let cur = req;\n for (const fn of this._req) cur = await fn(cur);\n return cur;\n }\n\n async processResponse(res: JoopResponse): Promise<JoopResponse> {\n let cur = res;\n for (const fn of this._res) cur = await fn(cur);\n return cur;\n }\n\n async processError(err: unknown): Promise<unknown> {\n let cur = err;\n for (const fn of this._err) cur = await fn(cur);\n return cur;\n }\n\n clear(): void { this._req = []; this._res = []; this._err = []; }\n}\n","export interface JoopRetryConfig {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n retryOn?: (error: unknown, attempt: number) => boolean;\n}\n\nconst DEFAULTS: JoopRetryConfig = {\n maxAttempts: 3,\n baseDelayMs: 500,\n maxDelayMs: 30_000,\n jitter: true,\n};\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: Partial<JoopRetryConfig> = {}\n): Promise<T> {\n const cfg = { ...DEFAULTS, ...config };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= cfg.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n if (attempt === cfg.maxAttempts) break;\n if (cfg.retryOn && !cfg.retryOn(err, attempt)) break;\n await _sleep(_calcDelay(attempt, cfg));\n }\n }\n throw lastError;\n}\n\nfunction _calcDelay(attempt: number, cfg: JoopRetryConfig): number {\n const exp = Math.min(cfg.baseDelayMs * Math.pow(2, attempt - 1), cfg.maxDelayMs);\n return cfg.jitter ? Math.floor(Math.random() * exp) : exp;\n}\n\nfunction _sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","export type JoopCircuitState = 'closed' | 'open' | 'half-open';\n// Alias kept for back-compat\nexport type JoopCircuitBreakerState = JoopCircuitState;\n\nexport interface JoopCircuitBreakerConfig {\n name?: string;\n failureThreshold?: number;\n successThreshold?: number;\n timeoutMs?: number;\n volumeThreshold?: number;\n onStateChange?: (from: JoopCircuitState, to: JoopCircuitState, name: string) => void;\n}\n\nexport interface JoopCircuitBreakerStats {\n state: JoopCircuitState;\n failures: number;\n successes: number;\n totalCalls: number;\n lastFailureAt?: number;\n openedAt?: number;\n nextAttemptAt?: number;\n}\n\nexport class JoopCircuitBreakerOpenError extends Error {\n readonly nextAttemptAt: number;\n constructor(name: string, nextAttemptAt: number) {\n super(`Circuit \"${name}\" is OPEN. Retry after ${new Date(nextAttemptAt).toISOString()}`);\n this.name = 'JoopCircuitBreakerOpenError';\n this.nextAttemptAt = nextAttemptAt;\n }\n}\n\nexport class JoopCircuitBreaker {\n private readonly _name: string;\n private readonly failureThreshold: number;\n private readonly successThreshold: number;\n private readonly timeoutMs: number;\n private readonly volumeThreshold: number;\n private readonly onStateChangeFn?: JoopCircuitBreakerConfig['onStateChange'];\n\n private _state: JoopCircuitState = 'closed';\n private _failures = 0;\n private _successes = 0;\n private _totalCalls = 0;\n private _lastFailureAt?: number;\n private _openedAt?: number;\n\n constructor(nameOrConfig: string | (JoopCircuitBreakerConfig & { name: string }), config: JoopCircuitBreakerConfig = {}) {\n const merged = typeof nameOrConfig === 'string'\n ? { name: nameOrConfig, ...config }\n : { ...nameOrConfig, ...config };\n this._name = merged.name ?? 'default';\n this.failureThreshold = merged.failureThreshold ?? 5;\n this.successThreshold = merged.successThreshold ?? 2;\n this.timeoutMs = merged.timeoutMs ?? 30_000;\n this.volumeThreshold = merged.volumeThreshold ?? 1;\n this.onStateChangeFn = merged.onStateChange;\n }\n\n get state(): JoopCircuitState { return this._state; }\n get name(): string { return this._name; }\n\n private setState(to: JoopCircuitState): void {\n if (to === this._state) return;\n const from = this._state;\n this._state = to;\n if (to === 'open') this._openedAt = Date.now();\n this.onStateChangeFn?.(from, to, this._name);\n }\n\n private recordSuccess(): void {\n this._successes++;\n this._failures = 0;\n if (this._state === 'half-open' && this._successes >= this.successThreshold) {\n this._successes = 0;\n this.setState('closed');\n }\n }\n\n private recordFailure(): void {\n this._failures++;\n this._lastFailureAt = Date.now();\n this._successes = 0;\n if (this._state === 'half-open') {\n this.setState('open');\n } else if (\n this._state === 'closed' &&\n this._totalCalls >= this.volumeThreshold &&\n this._failures >= this.failureThreshold\n ) {\n this.setState('open');\n }\n }\n\n private canAttempt(): boolean {\n if (this._state !== 'open') return true;\n if (Date.now() - (this._openedAt ?? 0) >= this.timeoutMs) {\n this.setState('half-open');\n this._successes = 0;\n return true;\n }\n return false;\n }\n\n /** Primary execution method — throws JoopCircuitBreakerOpenError when open. */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.canAttempt()) {\n throw new JoopCircuitBreakerOpenError(this._name, (this._openedAt ?? 0) + this.timeoutMs);\n }\n this._totalCalls++;\n try {\n const result = await fn();\n this.recordSuccess();\n return result;\n } catch (err) {\n this.recordFailure();\n throw err;\n }\n }\n\n /** Alias kept for back-compat with original `call()` interface. */\n async call<T>(fn: () => Promise<T>): Promise<T> { return this.execute(fn); }\n\n async executeWithFallback<T>(fn: () => Promise<T>, fallback: () => Promise<T> | T): Promise<T> {\n try { return await this.execute(fn); }\n catch { return fallback(); }\n }\n\n getState(): JoopCircuitState { return this._state; }\n\n getStats(): JoopCircuitBreakerStats {\n return {\n state: this._state,\n failures: this._failures,\n successes: this._successes,\n totalCalls: this._totalCalls,\n lastFailureAt: this._lastFailureAt,\n openedAt: this._openedAt,\n nextAttemptAt: this._openedAt ? this._openedAt + this.timeoutMs : undefined,\n };\n }\n\n reset(): void {\n this._state = 'closed';\n this._failures = 0;\n this._successes = 0;\n this._totalCalls = 0;\n this._lastFailureAt = undefined;\n this._openedAt = undefined;\n }\n\n forceOpen(): void { this.setState('open'); }\n forceClose(): void { this._failures = 0; this.setState('closed'); }\n}\n\nexport class JoopCircuitBreakerRegistry {\n private static readonly store = new Map<string, JoopCircuitBreaker>();\n\n static get(name: string, config?: JoopCircuitBreakerConfig): JoopCircuitBreaker {\n if (!this.store.has(name)) this.store.set(name, new JoopCircuitBreaker(name, config));\n return this.store.get(name)!;\n }\n\n static getAll(): Map<string, JoopCircuitBreaker> { return new Map(this.store); }\n\n static reset(name?: string): void {\n if (name) { this.store.get(name)?.reset(); }\n else { this.store.forEach(cb => cb.reset()); }\n }\n}\n","export interface JoopQueuedRequest {\n id: string;\n fn: () => Promise<unknown>;\n resolve: (v: unknown) => void;\n reject: (e: unknown) => void;\n timestamp: number;\n}\n\nexport class JoopOfflineQueue {\n private _queue: JoopQueuedRequest[] = [];\n private _online = typeof navigator !== 'undefined' ? navigator.onLine : true;\n private _draining = false;\n\n constructor() {\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => this._onOnline());\n window.addEventListener('offline', () => { this._online = false; });\n }\n }\n\n isOnline(): boolean { return this._online; }\n queueLength(): number { return this._queue.length; }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({\n id: crypto.randomUUID(),\n fn: fn as () => Promise<unknown>,\n resolve: resolve as (v: unknown) => void,\n reject,\n timestamp: Date.now(),\n });\n });\n }\n\n async drainNow(): Promise<void> {\n if (this._draining) return;\n this._draining = true;\n while (this._queue.length > 0) {\n const entry = this._queue.shift()!;\n try { entry.resolve(await entry.fn()); } catch (err) { entry.reject(err); }\n }\n this._draining = false;\n }\n\n clear(): void {\n this._queue.forEach(e => e.reject(new Error('Queue cleared')));\n this._queue = [];\n }\n\n private _onOnline(): void {\n this._online = true;\n this.drainNow().catch(() => {});\n }\n}\n","import { JoopSubject } from '../../events';\n\nexport interface JoopPollConfig<T> {\n fn: () => Promise<T>;\n intervalMs: number;\n immediate?: boolean;\n stopWhen?: (result: T) => boolean;\n onError?: (err: unknown) => void;\n}\n\nexport class JoopPollingService {\n private _timers = new Map<string, ReturnType<typeof setInterval>>();\n private _subjects = new Map<string, JoopSubject<unknown>>();\n\n start<T>(id: string, config: JoopPollConfig<T>): JoopSubject<T> {\n this.stop(id);\n const subject = new JoopSubject<T>();\n this._subjects.set(id, subject as JoopSubject<unknown>);\n\n const run = async () => {\n try {\n const result = await config.fn();\n subject.next(result);\n if (config.stopWhen?.(result)) this.stop(id);\n } catch (err) {\n config.onError?.(err);\n }\n };\n\n if (config.immediate) run();\n this._timers.set(id, setInterval(run, config.intervalMs));\n return subject;\n }\n\n stop(id: string): void {\n const timer = this._timers.get(id);\n if (timer) { clearInterval(timer); this._timers.delete(id); }\n this._subjects.delete(id);\n }\n\n stopAll(): void { [...this._timers.keys()].forEach(id => this.stop(id)); }\n isPolling(id: string): boolean { return this._timers.has(id); }\n}\n","export interface JoopDownloadOptions {\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n body?: string | FormData;\n iosHandlerName?: string;\n}\n\nexport const IOS_WEBVIEW_MIME: Record<string, string> = {\n xls: 'data:application/xls;base64,',\n csv: 'data:text/xml;base64,',\n pdf: 'data:application/pdf;base64,',\n xlsx: 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,',\n doc: 'data:application/msword;base64,',\n docx: 'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,',\n};\n\nconst MIME_TYPES: Record<string, string> = {\n txt: 'text/plain', pdf: 'application/pdf', csv: 'text/csv',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',\n};\n\nexport class JoopFileSaverService {\n isIosWebView(handlerName = 'mxDownloadPdf'): boolean {\n return !!(window as Record<string, any>)?.['webkit']?.['messageHandlers']?.[handlerName];\n }\n\n async download(url: string, options: JoopDownloadOptions = {}): Promise<void> {\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: options.headers,\n body: options.body,\n });\n\n if (!res.ok) throw new Error(`Download failed: ${res.status}`);\n\n const blob = await res.blob();\n const fileName = this._fileNameFromHeaders(res.headers) ?? 'download';\n\n if (options.iosHandlerName && this.isIosWebView(options.iosHandlerName)) {\n await this._sendToIos(blob, fileName, options.iosHandlerName);\n } else {\n this.saveBlob(blob, fileName);\n }\n }\n\n saveBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n\n blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n getMimeType(fileName: string): string {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n return MIME_TYPES[ext] ?? 'application/octet-stream';\n }\n\n typedBlob(blob: Blob, fileName: string): Blob {\n return new Blob([blob], { type: this.getMimeType(fileName) });\n }\n\n private async _sendToIos(blob: Blob, fileName: string, handlerName: string): Promise<void> {\n const ext = fileName.split('.').pop()?.toLowerCase() ?? '';\n const prefix = IOS_WEBVIEW_MIME[ext] ?? '';\n const base64 = await this.blobToBase64(blob);\n const parts = base64.split('base64,');\n const payload = prefix + (parts.length > 1 ? parts[1] : parts[0]);\n (window as Record<string, any>)['webkit']['messageHandlers'][handlerName].postMessage(payload);\n }\n\n private _fileNameFromHeaders(headers: Headers): string | null {\n const cd = headers.get('Content-Disposition') ?? '';\n const match = /filename=([^;]+)/i.exec(cd);\n return match ? match[1].trim().replace(/['\"]/g, '') : null;\n }\n}\n","export interface JoopRawComponent6 {\n compKey: string;\n compValue: string;\n}\n\nexport interface JoopRawResponse6 {\n scrId?: string;\n scrid?: string;\n compDet?: JoopRawComponent6[];\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopRawResponse {\n scrid?: string;\n segments?: string;\n mxenc?: string;\n mxencres?: string;\n components?: Record<string, string>;\n errorCode?: string;\n errorDesc?: string;\n}\n\nexport interface JoopMappedComponent {\n key: string;\n value: string;\n scope: string;\n dataKey: string;\n}\n\nexport interface JoopMappedResponse {\n scrid: string;\n segments: string;\n mxenc: string;\n mxencres: string;\n components: Record<string, string>;\n componentList: JoopMappedComponent[];\n errorCode?: string;\n errorDesc?: string;\n hasError: boolean;\n}\n\nconst SCOPE_PREFIXES: Record<string, string> = {\n M: 'M', O: 'O', N: 'N', S: 'S',\n};\n\nexport class JoopResponseMapper {\n /** Normalize a v6 or v7+ raw API response into a typed mapped response */\n map(raw: JoopRawResponse | JoopRawResponse6): JoopMappedResponse {\n const v7 = this._isV7(raw) ? raw as JoopRawResponse : this._convertV6ToV7(raw as JoopRawResponse6);\n\n const components = v7.components ?? {};\n const componentList = Object.entries(components).map(([key, value]) => ({\n key,\n value,\n scope: this.extractScope(key),\n dataKey: this.extractDataKey(key),\n }));\n\n return {\n scrid: v7.scrid ?? '',\n segments: v7.segments ?? '',\n mxenc: v7.mxenc ?? '',\n mxencres: v7.mxencres ?? '',\n components,\n componentList,\n errorCode: v7.errorCode,\n errorDesc: v7.errorDesc,\n hasError: !!(v7.errorCode && v7.errorCode !== '0' && v7.errorCode !== ''),\n };\n }\n\n /** Extract scope prefix from a component key (first char: M/O/N/S) */\n extractScope(key: string): string {\n const first = key.charAt(0).toUpperCase();\n return SCOPE_PREFIXES[first] ?? 'M';\n }\n\n /** Extract data key portion (everything after the first character) */\n extractDataKey(key: string): string {\n return key.length > 1 ? key.slice(1) : key;\n }\n\n /**\n * Build a property map from component list — groups by scope prefix.\n * e.g. \"MUserName\" → { scope: 'M', dataKey: 'UserName', value: '...' }\n */\n buildScopedMap(response: JoopMappedResponse): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {};\n for (const comp of response.componentList) {\n if (!result[comp.scope]) result[comp.scope] = {};\n result[comp.scope][comp.dataKey] = comp.value;\n }\n return result;\n }\n\n /** Get a single component value from a mapped response */\n getComponent(response: JoopMappedResponse, key: string): string | null {\n return response.components[key] ?? null;\n }\n\n /** Check if the raw payload looks like a v7+ response (has 'components' key) */\n private _isV7(raw: JoopRawResponse | JoopRawResponse6): boolean {\n return 'components' in raw && raw.components != null;\n }\n\n private _convertV6ToV7(raw: JoopRawResponse6): JoopRawResponse {\n const components: Record<string, string> = {};\n for (const item of raw.compDet ?? []) {\n if (item.compKey) components[item.compKey] = item.compValue ?? '';\n }\n return {\n scrid: raw.scrid ?? raw.scrId,\n segments: raw.segments,\n mxenc: raw.mxenc,\n mxencres: raw.mxencres,\n components,\n errorCode: raw.errorCode,\n errorDesc: raw.errorDesc,\n };\n }\n}\n","export interface JoopCsvOptions {\n delimiter?: string;\n headers?: string[];\n includeHeaders?: boolean;\n bom?: boolean; // Excel BOM (UTF-8 with BOM)\n nullValue?: string;\n}\n\nexport class JoopExportService {\n /** Convert an array of objects to a CSV string */\n toCsv(data: Record<string, unknown>[], options: JoopCsvOptions = {}): string {\n if (!data.length) return '';\n const {\n delimiter = ',',\n headers,\n includeHeaders = true,\n bom = false,\n nullValue = '',\n } = options;\n\n const cols = headers ?? Object.keys(data[0]);\n const escape = (v: unknown): string => {\n const s = v == null ? nullValue : String(v);\n return s.includes(delimiter) || s.includes('\"') || s.includes('\\n')\n ? `\"${s.replace(/\"/g, '\"\"')}\"`\n : s;\n };\n\n const rows: string[] = [];\n if (includeHeaders) rows.push(cols.map(escape).join(delimiter));\n for (const row of data) rows.push(cols.map(k => escape(row[k])).join(delimiter));\n const csv = rows.join('\\r\\n');\n return bom ? '' + csv : csv;\n }\n\n /** Trigger browser download of a CSV string */\n downloadCsv(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, options);\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Download Excel-compatible CSV (with BOM so Excel reads UTF-8 correctly) */\n downloadExcel(data: Record<string, unknown>[], filename: string, options: JoopCsvOptions = {}): void {\n const csv = this.toCsv(data, { ...options, bom: true, delimiter: ',' });\n this._download(csv, filename.endsWith('.csv') ? filename : `${filename}.csv`, 'text/csv;charset=utf-8;');\n }\n\n /** Convert data to a JSON string and download */\n downloadJson(data: unknown, filename: string, indent = 2): void {\n const json = JSON.stringify(data, null, indent);\n this._download(json, filename.endsWith('.json') ? filename : `${filename}.json`, 'application/json');\n }\n\n /** Download a plain-text file */\n downloadText(content: string, filename: string): void {\n this._download(content, filename, 'text/plain;charset=utf-8;');\n }\n\n /** Convert a 2D array (table) to CSV */\n tableToCsv(rows: unknown[][], headers?: string[], delimiter = ','): string {\n const esc = (v: unknown) => {\n const s = v == null ? '' : String(v);\n return s.includes(delimiter) || s.includes('\"') ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const lines: string[] = [];\n if (headers) lines.push(headers.map(esc).join(delimiter));\n for (const row of rows) lines.push(row.map(esc).join(delimiter));\n return lines.join('\\r\\n');\n }\n\n private _download(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 5000);\n }\n}\n","export type JoopWebhookProvider = 'stripe' | 'github' | 'generic';\n\nexport interface JoopWebhookOptions {\n toleranceSeconds?: number; // default: 300 (5 min)\n algorithm?: 'SHA-256' | 'SHA-1' | 'SHA-512';\n}\n\nexport class JoopWebhookVerifier {\n private _provider: JoopWebhookProvider = 'generic';\n\n for(provider: JoopWebhookProvider): JoopWebhookVerifier {\n const clone = new JoopWebhookVerifier();\n clone._provider = provider;\n return clone;\n }\n\n async verify(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n switch (this._provider) {\n case 'stripe': return this.verifyStripe(payload, signature, secret, opts);\n case 'github': return this.verifyGitHub(payload, signature, secret, opts);\n default: return this.verifyGeneric(payload, signature, secret, opts);\n }\n }\n\n /** Stripe: `Stripe-Signature: t=...,v1=...` */\n async verifyStripe(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));\n const t = parts['t'];\n const v1 = parts['v1'];\n if (!t || !v1) return false;\n\n if (!this.verifyTimestamp(parseInt(t, 10), opts.toleranceSeconds ?? 300)) return false;\n\n const signed = `${t}.${payload}`;\n const expected = await _hmac('SHA-256', secret, signed);\n return _safeEqual(expected, v1);\n }\n\n /** GitHub: `X-Hub-Signature-256: sha256=...` */\n async verifyGitHub(payload: string, header: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const prefix = 'sha256=';\n if (!header.startsWith(prefix)) return false;\n const provided = header.slice(prefix.length);\n const expected = await _hmac('SHA-256', secret, payload);\n return _safeEqual(expected, provided);\n }\n\n /** Generic HMAC verification. signature is a hex string. */\n async verifyGeneric(payload: string, signature: string, secret: string, opts: JoopWebhookOptions = {}): Promise<boolean> {\n const algo = opts.algorithm ?? 'SHA-256';\n const expected = await _hmac(algo as AlgorithmIdentifier, secret, payload);\n return _safeEqual(expected, signature);\n }\n\n /** Returns true if the timestamp is within tolerance of now */\n verifyTimestamp(timestamp: number, toleranceSeconds = 300): boolean {\n const diff = Math.abs(Math.floor(Date.now() / 1000) - timestamp);\n return diff <= toleranceSeconds;\n }\n\n /** Compute the expected HMAC for a payload (for testing) */\n async sign(payload: string, secret: string, algo: AlgorithmIdentifier = 'SHA-256'): Promise<string> {\n return _hmac(algo, secret, payload);\n }\n}\n\nasync function _hmac(algorithm: AlgorithmIdentifier, secret: string, payload: string): Promise<string> {\n const enc = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw', enc.encode(secret),\n { name: 'HMAC', hash: algorithm },\n false, ['sign'],\n );\n const sig = await crypto.subtle.sign('HMAC', key, enc.encode(payload));\n return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nfunction _safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopIdempotencyConfig {\n storage?: JoopStorageAdapter;\n ttlMs?: number; // default: 24 hours\n prefix?: string;\n}\n\ninterface _IdempotencyEntry {\n key: string;\n createdAt: number;\n expiresAt: number;\n}\n\nexport class JoopIdempotencyService {\n private _storage: JoopStorageAdapter;\n private _ttlMs: number;\n private _prefix: string;\n /** Internal key registry used for clearAll() and gc() (avoids requiring Storage.length/key()) */\n private _keys = new Set<string>();\n\n constructor(config: JoopIdempotencyConfig = {}) {\n this._ttlMs = config.ttlMs ?? 24 * 60 * 60 * 1000;\n this._prefix = config.prefix ?? 'joop_idem_';\n this._storage = config.storage ?? JoopPlatform.getStorage();\n }\n\n /**\n * Generate and store an idempotency key for the given operation.\n * Returns an existing (non-expired) key if one already exists.\n */\n generate(operationKey: string): string {\n const storageKey = this._prefix + operationKey;\n const existing = this.get(operationKey);\n if (existing) {\n this._keys.add(storageKey); // ensure clearAll() covers pre-existing keys\n return existing;\n }\n\n const key = _generateKey();\n const entry: _IdempotencyEntry = { key, createdAt: Date.now(), expiresAt: Date.now() + this._ttlMs };\n this._storage.setItem(storageKey, JSON.stringify(entry));\n this._keys.add(storageKey);\n return key;\n }\n\n /** Get the stored key for an operation, or null if expired/not found */\n get(operationKey: string): string | null {\n const storageKey = this._prefix + operationKey;\n const raw = this._storage.getItem(storageKey);\n if (!raw) return null;\n try {\n const entry: _IdempotencyEntry = JSON.parse(raw);\n if (Date.now() > entry.expiresAt) {\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n return null;\n }\n return entry.key;\n } catch {\n return null;\n }\n }\n\n /** Remove the key for an operation (e.g. after successful completion) */\n clear(operationKey: string): void {\n const storageKey = this._prefix + operationKey;\n this._storage.removeItem(storageKey);\n this._keys.delete(storageKey);\n }\n\n /** Clear all idempotency keys managed by this instance */\n clearAll(): void {\n for (const k of this._keys) this._storage.removeItem(k);\n this._keys.clear();\n }\n\n /**\n * Wrap a fetch-based function with automatic idempotency key injection.\n * Clears the key on success; keeps it on failure so retries reuse the same key.\n */\n async wrap<T>(operationKey: string, fn: (idempotencyKey: string) => Promise<T>): Promise<T> {\n const key = this.generate(operationKey);\n try {\n const result = await fn(key);\n this.clear(operationKey);\n return result;\n } catch (e) {\n throw e;\n }\n }\n\n /** Remove all expired entries */\n gc(): void {\n const now = Date.now();\n for (const k of [...this._keys]) {\n const raw = this._storage.getItem(k);\n if (!raw) { this._keys.delete(k); continue; }\n try {\n const e: _IdempotencyEntry = JSON.parse(raw);\n if (now > e.expiresAt) { this._storage.removeItem(k); this._keys.delete(k); }\n } catch { this._storage.removeItem(k); this._keys.delete(k); }\n }\n }\n}\n\nfunction _generateKey(): string {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n return Array.from(buf).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n","// Extended HTTP client — parallel, race, deduplication, queue, typed wrappers\n// Builds on top of JoopHttpClient (no duplication of base logic)\n\nimport { JoopHttpClient, type JoopFetchOptions } from './http-client';\nimport { withRetry, type JoopRetryConfig } from './retry';\n\nexport interface JoopParallelResult<T> {\n index: number;\n url: string;\n data?: T;\n error?: Error;\n ok: boolean;\n ms: number;\n}\n\nexport interface JoopRequestQueueConfig {\n concurrency: number; // max parallel inflight, default 4\n onDrain?: () => void;\n}\n\ntype QueueEntry = { fn: () => Promise<any>; resolve: (v: any) => void; reject: (e: any) => void };\n\n/** Request deduplication cache — ongoing identical GET requests share one fetch */\nconst _inFlight = new Map<string, Promise<any>>();\n\nexport class JoopHttpClientExtended extends JoopHttpClient {\n // ── Parallel requests ───────────────────────────────────────────────────────\n\n /** Fire multiple GETs at once, collect all results (never throws). */\n async getAll<T = any>(\n urls: string[],\n options?: JoopFetchOptions,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n urls.map(async (url, index) => {\n const t0 = Date.now();\n try {\n const data = await this.get<T>(url, options);\n return { index, url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Post to multiple URLs in parallel (fire-and-collect). */\n async postAll<T = any>(\n requests: Array<{ url: string; body?: any; options?: JoopFetchOptions }>,\n ): Promise<JoopParallelResult<T>[]> {\n return Promise.all(\n requests.map(async (req, index) => {\n const t0 = Date.now();\n try {\n const data = await this.post<T>(req.url, req.body, req.options);\n return { index, url: req.url, data, ok: true, ms: Date.now() - t0 };\n } catch (e: any) {\n return { index, url: req.url, error: e, ok: false, ms: Date.now() - t0 };\n }\n }),\n );\n }\n\n /** Race multiple GET requests — resolves with the first successful response. */\n async race<T = any>(urls: string[], options?: JoopFetchOptions): Promise<{ data: T; url: string; ms: number }> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const errors: Error[] = [];\n urls.forEach(url => {\n const t0 = Date.now();\n this.get<T>(url, options).then(data => {\n if (!settled) { settled = true; resolve({ data, url, ms: Date.now() - t0 }); }\n }).catch(err => {\n errors.push(err);\n if (errors.length === urls.length) reject(errors[0]);\n });\n });\n });\n }\n\n /** Sequential requests — each result fed to a mapper for the next URL. */\n async chain<T = any>(\n steps: Array<(prevResult: T | undefined) => { url: string; body?: any; method?: 'GET' | 'POST' }>,\n options?: JoopFetchOptions,\n ): Promise<T[]> {\n const results: T[] = [];\n let prev: T | undefined;\n for (const step of steps) {\n const { url, body, method = 'GET' } = step(prev);\n prev = method === 'POST' ? await this.post<T>(url, body, options) : await this.get<T>(url, options);\n results.push(prev);\n }\n return results;\n }\n\n // ── Deduplication ─────────────────────────────────────────────────────────\n\n /** GET with request deduplication — concurrent identical URLs share one network call. */\n getDedup<T = any>(url: string, options?: JoopFetchOptions): Promise<T> {\n const key = url + JSON.stringify(options?.headers ?? {});\n if (_inFlight.has(key)) return _inFlight.get(key) as Promise<T>;\n const promise = this.get<T>(url, options).finally(() => _inFlight.delete(key));\n _inFlight.set(key, promise);\n return promise;\n }\n\n // ── Retry wrapper ─────────────────────────────────────────────────────────\n\n /** GET with automatic retry on failure. */\n getWithRetry<T = any>(url: string, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.get<T>(url, options), retry);\n }\n\n postWithRetry<T = any>(url: string, body?: any, retry?: Partial<JoopRetryConfig>, options?: JoopFetchOptions): Promise<T> {\n return withRetry(() => this.post<T>(url, body, options), retry);\n }\n\n // ── Request queue ──────────────────────────────────────────────────────────\n\n createQueue(config: JoopRequestQueueConfig = { concurrency: 4 }): JoopRequestQueue {\n return new JoopRequestQueue(config);\n }\n\n // ── Typed response helpers ────────────────────────────────────────────────\n\n /** GET that throws if the response does not pass a validator. */\n async getValidated<T>(\n url: string,\n validate: (data: unknown) => data is T,\n options?: JoopFetchOptions,\n ): Promise<T> {\n const data = await this.get<unknown>(url, options);\n if (!validate(data)) throw new TypeError(`JoopHttp: response from ${url} failed type validation`);\n return data;\n }\n\n /** GET with fallback value on error (never throws). */\n async getSafe<T>(url: string, fallback: T, options?: JoopFetchOptions): Promise<T> {\n try { return await this.get<T>(url, options); } catch { return fallback; }\n }\n\n /** POST with fallback on error. */\n async postSafe<T>(url: string, body?: any, fallback?: T, options?: JoopFetchOptions): Promise<T | undefined> {\n try { return await this.post<T>(url, body, options); } catch { return fallback; }\n }\n\n // ── Timeout helper ────────────────────────────────────────────────────────\n\n /** Set a default timeout on all subsequent requests. */\n withTimeout(ms: number): JoopHttpClientExtended {\n const child = new JoopHttpClientExtended();\n const orig = child.request.bind(child);\n child.request = (method, url, opts = {}) => orig(method, url, { timeout: ms, ...opts });\n return child;\n }\n\n // ── Sync-style callback wrapper ───────────────────────────────────────────\n\n /** \"Sync-style\" GET — callback-based wrapper (JS is single-threaded; true sync fetch doesn't exist).\n * Use only in contexts where you cannot use async/await (e.g., legacy callbacks). */\n getCallback<T = any>(\n url: string,\n onSuccess: (data: T) => void,\n onError: (err: Error) => void,\n options?: JoopFetchOptions,\n ): void {\n this.get<T>(url, options).then(onSuccess).catch(onError);\n }\n\n /** Batch multiple operations with concurrency limit. */\n async batch<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n concurrency = 4,\n ): Promise<Array<{ item: T; result?: R; error?: Error; ok: boolean }>> {\n const results: Array<{ item: T; result?: R; error?: Error; ok: boolean }> = [];\n for (let i = 0; i < items.length; i += concurrency) {\n const slice = items.slice(i, i + concurrency);\n const batch = await Promise.all(\n slice.map(async (item, idx) => {\n try {\n const result = await fn(item, i + idx);\n return { item, result, ok: true };\n } catch (e: any) {\n return { item, error: e, ok: false };\n }\n }),\n );\n results.push(...batch);\n }\n return results;\n }\n}\n\n// ── Request Queue ──────────────────────────────────────────────────────────────\n\nexport class JoopRequestQueue {\n private _queue: QueueEntry[] = [];\n private _running = 0;\n private readonly _config: JoopRequestQueueConfig;\n\n constructor(config: JoopRequestQueueConfig) {\n this._config = { concurrency: config.concurrency ?? 4, onDrain: config.onDrain };\n }\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this._queue.push({ fn, resolve, reject });\n this._tick();\n });\n }\n\n get size(): number { return this._queue.length; }\n get inflight(): number { return this._running; }\n\n private _tick(): void {\n while (this._running < this._config.concurrency && this._queue.length > 0) {\n const entry = this._queue.shift()!;\n this._running++;\n entry.fn().then(entry.resolve, entry.reject).finally(() => {\n this._running--;\n this._tick();\n if (this._running === 0 && this._queue.length === 0) this._config.onDrain?.();\n });\n }\n }\n}\n","// Pre-built interceptors — attach to JoopInterceptorPipeline\nimport type { JoopRequestInterceptor, JoopResponseInterceptor, JoopErrorInterceptor } from './interceptor';\n\n// ── Auth Bearer interceptor ───────────────────────────────────────────────────\n\n/** Injects Authorization: Bearer <token> from a synchronous token getter. */\nexport function bearerAuthInterceptor(getToken: () => string | null | undefined): JoopRequestInterceptor {\n return req => {\n const token = getToken();\n if (token) {\n return { ...req, headers: { ...req.headers, Authorization: `Bearer ${token}` } };\n }\n return req;\n };\n}\n\n// ── Logging interceptor ───────────────────────────────────────────────────────\n\nexport interface JoopLogInterceptorOptions {\n logRequest?: boolean;\n logResponse?: boolean;\n logErrors?: boolean;\n logger?: { log: (...a: any[]) => void; warn: (...a: any[]) => void; error: (...a: any[]) => void };\n}\n\nexport function loggingRequestInterceptor(opts: JoopLogInterceptorOptions = {}): JoopRequestInterceptor {\n const log = opts.logger ?? console;\n return req => {\n if (opts.logRequest !== false) {\n log.log(`[JoopHTTP] ➜ ${req.method} ${req.url}`, req.body ? { body: req.body } : '');\n }\n return req;\n };\n}\n\nexport function loggingResponseInterceptor(opts: JoopLogInterceptorOptions = {}): JoopResponseInterceptor {\n const log = opts.logger ?? console;\n return res => {\n if (opts.logResponse !== false) {\n log.log(`[JoopHTTP] ✓ ${res.status}`, res.data);\n }\n return res;\n };\n}\n\nexport function loggingErrorInterceptor(opts: JoopLogInterceptorOptions = {}): JoopErrorInterceptor {\n const log = opts.logger ?? console;\n return err => {\n if (opts.logErrors !== false) {\n const e = err as any;\n log.error(`[JoopHTTP] ✗ ${e?.status ?? 0} ${e?.message}`, err);\n }\n return err;\n };\n}\n\n// ── Correlation ID interceptor ────────────────────────────────────────────────\n\n/** Injects X-Correlation-ID / X-Request-ID headers for distributed tracing. */\nexport function correlationInterceptor(\n getCorrelationId?: () => string,\n): JoopRequestInterceptor {\n const getId = getCorrelationId ?? (() => crypto.randomUUID?.() ?? Math.random().toString(36).slice(2));\n return req => ({\n ...req,\n headers: {\n ...req.headers,\n 'X-Correlation-ID': getId(),\n 'X-Request-ID': getId(),\n },\n });\n}\n\n// ── Base URL interceptor ──────────────────────────────────────────────────────\n\n/** Prepends a base URL to all relative request URLs. */\nexport function baseUrlInterceptor(baseUrl: string): JoopRequestInterceptor {\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return req => ({\n ...req,\n url: req.url.startsWith('http') ? req.url : `${base}${req.url.startsWith('/') ? '' : '/'}${req.url}`,\n });\n}\n\n// ── Retry-on-error interceptor ────────────────────────────────────────────────\n\nexport interface JoopRetryInterceptorOptions {\n maxRetries?: number; // default 2\n retryOn?: number[]; // HTTP status codes to retry, default [429, 502, 503, 504]\n backoffMs?: number; // base delay ms, default 300\n onRetry?: (attempt: number, err: any) => void;\n}\n\n/** Returns a JoopErrorInterceptor that re-throws after exponential back-off retries.\n * Wire this into JoopInterceptorPipeline.addErrorInterceptor().\n * Note: the interceptor itself can't retry transparently — callers use withRetry() wrapper instead.\n * This interceptor adds retry metadata to errors for upstream use.\n */\nexport function retryErrorInterceptor(opts: JoopRetryInterceptorOptions = {}): JoopErrorInterceptor {\n const maxRetries = opts.maxRetries ?? 2;\n const retryOn = opts.retryOn ?? [429, 502, 503, 504];\n return err => {\n const e = err as any;\n const shouldRetry = retryOn.includes(e?.status ?? 0);\n return Object.assign(e ?? {}, { _joopShouldRetry: shouldRetry, _joopMaxRetries: maxRetries });\n };\n}\n\n// ── Cache interceptor ─────────────────────────────────────────────────────────\n\nconst _cache = new Map<string, { data: any; expiresAt: number }>();\n\nexport interface JoopCacheInterceptorOptions {\n ttlMs?: number; // default 60_000 (1 minute)\n methods?: string[]; // default ['GET']\n}\n\nexport function cacheResponseInterceptor(opts: JoopCacheInterceptorOptions = {}): JoopResponseInterceptor {\n const ttl = opts.ttlMs ?? 60_000;\n const methods = (opts.methods ?? ['GET']).map(m => m.toUpperCase());\n return res => {\n if (methods.includes((res as any)._requestMethod?.toUpperCase() ?? 'GET')) {\n _cache.set((res as any)._requestUrl ?? '', { data: res.data, expiresAt: Date.now() + ttl });\n }\n return res;\n };\n}\n\nexport function cacheRequestInterceptor(): JoopRequestInterceptor {\n return req => {\n const cached = _cache.get(req.url);\n if (cached && cached.expiresAt > Date.now()) {\n // Signal to skip the real request by attaching pre-resolved data\n return Object.assign(req, { _cacheHit: true, _cachedData: cached.data });\n }\n return req;\n };\n}\n\nexport function clearCache(url?: string): void {\n url ? _cache.delete(url) : _cache.clear();\n}\n"]}
@@ -1,6 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  // src/events/index.ts
4
+ var _onListenerError = (error) => {
5
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
6
+ };
4
7
  var JoopSubject = class {
5
8
  _listeners = [];
6
9
  subscribe(listener) {
@@ -10,8 +13,13 @@ var JoopSubject = class {
10
13
  };
11
14
  }
12
15
  next(value) {
13
- for (const listener of this._listeners) {
14
- listener(value);
16
+ const listeners = this._listeners.slice();
17
+ for (const listener of listeners) {
18
+ try {
19
+ listener(value);
20
+ } catch (error) {
21
+ _onListenerError(error);
22
+ }
15
23
  }
16
24
  }
17
25
  asObservable() {
@@ -32,7 +40,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
32
40
  super.next(value);
33
41
  }
34
42
  subscribe(listener) {
35
- listener(this._value);
43
+ try {
44
+ listener(this._value);
45
+ } catch (error) {
46
+ _onListenerError(error);
47
+ }
36
48
  return super.subscribe(listener);
37
49
  }
38
50
  asObservable() {