@ic-pay/icpay-widget 1.2.94 → 1.2.111
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.
- package/README.md +45 -17
- package/dist/{amount-input-DBc6rB3K.d.ts → amount-input-DlnLWkeX.d.ts} +170 -0
- package/dist/chunk-QEOLHVOE.js +2 -0
- package/dist/chunk-QEOLHVOE.js.map +1 -0
- package/dist/chunk-RCWWBMN4.js +2112 -0
- package/dist/chunk-RCWWBMN4.js.map +1 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.js +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +1 -1
- package/dist/wallet-select-VE5FSSFG.js +2 -0
- package/package.json +14 -3
- package/dist/chunk-WVNSOAVU.js +0 -2
- package/dist/chunk-WVNSOAVU.js.map +0 -1
- package/dist/chunk-Z7MZQN3H.js +0 -2112
- package/dist/chunk-Z7MZQN3H.js.map +0 -1
- package/dist/wallet-select-BEKXSS66.js +0 -2
- /package/dist/{wallet-select-BEKXSS66.js.map → wallet-select-VE5FSSFG.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.ts","../src/utils/sdk.ts","../src/components/ui/progress-bar.ts","../src/error-handling.ts","../src/components/ui/onramp-modal.ts","../src/components/premium-content.ts","../src/components/ui/wallet-selector-modal.ts","../src/utils/balances.ts","../src/utils/format.ts","../src/components/ui/shared/pay-with.ts","../src/components/ui/wallet-balance-modal.ts","../src/utils/x402.ts","../src/utils/pnp.ts","../src/utils/payment-flow-reset.ts","../src/components/tip-jar.ts","../src/components/article-paywall.ts","../src/components/coffee-shop.ts","../src/components/donation-thermometer.ts","../src/components/pay-button.ts","../src/components/ui/onramp-provider-picker.ts","../src/utils/fetch-payment-intent.ts","../src/components/amount-input.ts"],"sourcesContent":["import { css } from 'lit';\nimport type { ThemeConfig } from './types';\n\nexport const baseStyles = css`\n :host {\n /* Light mode defaults (from COLOR_PALETTE.md) */\n --icpay-background: #ffffff;\n --icpay-foreground: #171717;\n --icpay-muted-foreground: #6b7280;\n --icpay-accent-foreground: #ffffff;\n --icpay-primary: #3b82f6;\n --icpay-destructive: #ef4444;\n --icpay-primary-foreground: #ffffff;\n --icpay-secondary: #f3f4f6;\n --icpay-secondary-foreground: #171717;\n --icpay-accent: #f9fafb;\n --icpay-muted: #f9fafb;\n --icpay-border: #e5e7eb;\n --icpay-input: #e5e7eb;\n --icpay-ring: #3b82f6;\n --icpay-destructive-foreground: #ffffff;\n \n /* Status colors */\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #059669;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #d97706;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #dc2626;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #2563eb;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n \n /* Legacy compatibility variables */\n --icpay-text: var(--icpay-foreground);\n --icpay-surface: transparent;\n --icpay-surface-alt: var(--icpay-secondary);\n --icpay-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n display: block;\n font-family: var(--icpay-font);\n color: var(--icpay-foreground);\n background: transparent;\n }\n\n :host([data-theme=\"dark\"]) {\n /* Dark mode (from COLOR_PALETTE.md) */\n --icpay-background: hsl(222.2 84% 4.9%);\n --icpay-foreground: hsl(210 40% 98%);\n --icpay-muted-foreground: hsl(215 20.2% 65.1%);\n --icpay-accent-foreground: hsl(210 40% 98%);\n --icpay-primary: hsl(210 40% 98%);\n --icpay-destructive: hsl(0 62.8% 30.6%);\n --icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n --icpay-secondary: hsl(217.2 32.6% 17.5%);\n --icpay-secondary-foreground: hsl(210 40% 98%);\n --icpay-accent: hsl(217.2 32.6% 17.5%);\n --icpay-muted: hsl(217.2 32.6% 17.5%);\n --icpay-border: hsl(217.2 32.6% 30%);\n --icpay-input: hsl(217.2 32.6% 17.5%);\n --icpay-ring: hsl(210 40% 98%);\n --icpay-destructive-foreground: hsl(210 40% 98%);\n \n /* Status colors for dark mode */\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #34d399;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #fbbf24;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #f87171;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #60a5fa;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n \n --icpay-text: var(--icpay-foreground);\n --icpay-surface-alt: var(--icpay-secondary);\n }\n\n .icpay-card {\n background: none;\n border: none;\n border-radius: 16px;\n box-shadow: none;\n }\n\n .icpay-section {\n padding: 20px;\n }\n\n .icpay-powered-by {\n margin-top: 12px;\n text-align: center;\n font-size: 10px;\n color: var(--icpay-muted-foreground);\n opacity: 0.6;\n }\n\n .icpay-powered-by a {\n color: var(--icpay-muted-foreground);\n text-decoration: none;\n transition: opacity 0.2s ease;\n }\n\n .icpay-powered-by a:hover {\n opacity: 1;\n text-decoration: underline;\n }\n\n .pay-button {\n width: 100%;\n background: var(--icpay-foreground);\n color: var(--icpay-background);\n border: none;\n border-radius: 16px;\n padding: 16px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: none;\n }\n\n :host([data-theme=\"dark\"]) .pay-button {\n border: 1px solid var(--icpay-border);\n }\n\n .pay-button:hover {\n background: color-mix(in srgb, var(--icpay-foreground) 90%, transparent);\n }\n\n .pay-button.processing {\n background: var(--icpay-muted-foreground);\n color: var(--icpay-background);\n border-color: var(--icpay-muted-foreground);\n cursor: not-allowed;\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n }\n`;\n\n\n// Helper to extract theme mode from config (handles both string and object formats)\nexport function getThemeModeFromConfig(theme?: 'light' | 'dark' | ThemeConfig | null): 'light' | 'dark' {\n if (typeof theme === 'string') {\n return theme;\n } else if (theme && typeof theme === 'object' && theme.mode) {\n return theme.mode;\n }\n return 'light'; // Default to light\n}\n\nexport function applyThemeVars(host: HTMLElement, theme?: 'light' | 'dark' | ThemeConfig | null): void {\n if (!host) return;\n \n // Normalize theme: handle both string ('light' | 'dark') and ThemeConfig object formats\n let themeConfig: ThemeConfig | null = null;\n let mode: 'light' | 'dark' = 'light';\n \n if (typeof theme === 'string') {\n // Simple string format: theme = 'light' or 'dark'\n mode = theme;\n themeConfig = { mode };\n } else if (theme && typeof theme === 'object') {\n // ThemeConfig object format\n themeConfig = theme;\n mode = theme.mode || 'light';\n } else if (typeof document !== 'undefined') {\n // Fallback to document theme if no theme provided\n const docTheme = document.documentElement.getAttribute('data-icpay-theme') || \n document.documentElement.getAttribute('data-theme');\n if (docTheme === 'light' || docTheme === 'dark') {\n mode = docTheme;\n }\n }\n \n // Set data-theme attribute for CSS variable inheritance\n if (host instanceof HTMLElement) {\n host.setAttribute('data-theme', mode);\n }\n \n // Also set on document element so modals can detect theme\n if (typeof document !== 'undefined' && document.documentElement) {\n // Store theme mode on document for modal detection\n document.documentElement.setAttribute('data-icpay-theme', mode);\n // Also set CSS variables on document root for modals to inherit\n const root = document.documentElement;\n root.style.setProperty('--icpay-theme-mode', mode);\n }\n \n if (!themeConfig) {\n // If no theme config provided, just set the mode attribute (already done above)\n return;\n }\n \n const set = (k: string, v?: string) => { if (v) host.style.setProperty(k, v); };\n \n // Apply custom colors if provided\n if (themeConfig.primaryColor) set('--icpay-primary', themeConfig.primaryColor);\n if (themeConfig.secondaryColor) set('--icpay-secondary', themeConfig.secondaryColor);\n if (themeConfig.accentColor) set('--icpay-accent', themeConfig.accentColor);\n if (themeConfig.textColor) set('--icpay-foreground', themeConfig.textColor);\n if (themeConfig.mutedTextColor) set('--icpay-muted-foreground', themeConfig.mutedTextColor);\n if (themeConfig.surfaceColor) set('--icpay-background', themeConfig.surfaceColor);\n if (themeConfig.surfaceAltColor) set('--icpay-secondary', themeConfig.surfaceAltColor);\n if (themeConfig.borderColor) set('--icpay-border', themeConfig.borderColor);\n if (themeConfig.fontFamily) set('--icpay-font', themeConfig.fontFamily);\n \n // Legacy compatibility\n if (themeConfig.textColor) set('--icpay-text', themeConfig.textColor);\n if (themeConfig.mutedTextColor) set('--icpay-muted', themeConfig.mutedTextColor);\n if (themeConfig.surfaceAltColor) set('--icpay-surface-alt', themeConfig.surfaceAltColor);\n}\n\n\n","import { Icpay, PriceCalculationResult, IcpayConfig } from '@ic-pay/icpay-sdk';\nimport type { CommonConfig } from '../types';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Debug logger utility for widget\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\nexport type WidgetSdk = {\n client: InstanceType<typeof Icpay>;\n quoteUsd(usdAmount: number, ledgerCanisterId: string): Promise<PriceCalculationResult>;\n sendUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>): Promise<any>;\n startOnrampUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>): Promise<any>;\n notifyIntentUntilComplete(paymentIntentId: string, intervalMs?: number, orderId?: string): { stop: () => void };\n};\n\nexport function createSdk(config: CommonConfig): WidgetSdk {\n if (!isBrowser) {\n // Return a mock SDK for SSR\n return {\n client: {} as any,\n quoteUsd: async () => ({ tokenAmountDecimals: '0' } as any),\n sendUsd: async () => ({ transactionId: '0', status: 'pending' } as any),\n startOnrampUsd: async () => ({ transactionId: '0', status: 'pending', metadata: { icpay_onramp: { sessionId: null } } } as any),\n notifyIntentUntilComplete: () => ({ stop: () => {} })\n };\n }\n\n debugLog(config.debug || false, 'Creating SDK with config:', config);\n\n // Filter out undefined values to avoid constructor errors\n const sdkConfig: IcpayConfig = {\n publishableKey: config.publishableKey,\n };\n // Default to enabling SDK events for the widget unless explicitly set in config\n if ((config as any).enableEvents !== undefined) {\n (sdkConfig as any).enableEvents = (config as any).enableEvents;\n } else {\n (sdkConfig as any).enableEvents = true;\n }\n\n if (config.apiUrl) sdkConfig.apiUrl = config.apiUrl;\n if (config.icHost) sdkConfig.icHost = config.icHost;\n if (config.actorProvider) sdkConfig.actorProvider = config.actorProvider;\n if (config.connectedWallet) sdkConfig.connectedWallet = config.connectedWallet;\n // Pass selected EVM provider from widget to SDK so signatures use the chosen wallet\n if ((config as any).evmProvider) (sdkConfig as any).evmProvider = (config as any).evmProvider;\n // Pass selected Solana provider from widget to SDK so signatures use the chosen wallet\n if ((config as any).solanaProvider) (sdkConfig as any).solanaProvider = (config as any).solanaProvider;\n // Propagate kill switch to SDK (defaults to true inside SDK)\n if (config.onrampDisabled !== undefined) (sdkConfig as any).onrampDisabled = config.onrampDisabled;\n\n // Pass debug configuration to SDK if specified\n if (config.debug !== undefined) {\n sdkConfig.debug = config.debug;\n }\n\n // Pass fiat currency so createPaymentUsd/createPaymentX402Usd use it when request omits it\n if ((config as any).fiat_currency != null && (config as any).fiat_currency !== '') {\n (sdkConfig as any).fiat_currency = (config as any).fiat_currency;\n }\n\n // Pass pre-resolved payment intent (e.g. from widget loading by paymentIntentId) so SDK skips create and uses it\n if ((config as any).paymentIntent != null && typeof (config as any).paymentIntent === 'object') {\n (sdkConfig as any).paymentIntent = (config as any).paymentIntent;\n }\n // When we only have the id (object never loaded), pass paymentIntentId so SDK can fetch/use the intent by id\n if ((config as any).paymentIntentId != null && typeof (config as any).paymentIntentId === 'string') {\n (sdkConfig as any).paymentIntentId = (config as any).paymentIntentId;\n }\n\n debugLog(config.debug || false, 'Filtered SDK config:', sdkConfig);\n try {\n debugLog(config.debug || false, 'typeof Icpay:', typeof Icpay);\n const client = new Icpay(sdkConfig);\n\n // Re-emit SDK instance events on window so UI components can listen globally\n if (isBrowser) {\n const clientAny = client as any;\n const forward = (type: string) => {\n clientAny.addEventListener(type, (e: any) => {\n window.dispatchEvent(new CustomEvent(type, { detail: e?.detail ?? e }));\n });\n };\n [\n 'icpay-sdk-error',\n 'icpay-sdk-transaction-created',\n 'icpay-sdk-transaction-updated',\n 'icpay-sdk-transaction-completed',\n 'icpay-sdk-transaction-failed',\n 'icpay-sdk-method-start',\n 'icpay-sdk-method-success',\n 'icpay-sdk-method-error'\n ].forEach(forward);\n }\n\n async function quoteUsd(usdAmount: number, tokenShortcode?: string, ledgerCanisterId?: string) {\n // Preferred path: tokenShortcode; fallback: ledgerCanisterId\n if (typeof tokenShortcode === 'string' && tokenShortcode.trim().length > 0) {\n return (client as any).calculateTokenAmountFromUSD({ usdAmount, tokenShortcode: tokenShortcode.toLowerCase() });\n }\n if (typeof ledgerCanisterId === 'string' && ledgerCanisterId.trim().length > 0) {\n return client.calculateTokenAmountFromUSD({ usdAmount, ledgerCanisterId });\n }\n throw new Error('quoteUsd requires tokenShortcode or ledgerCanisterId');\n }\n\n async function sendUsd(usdAmount: number, tokenShortcode?: string, metadata?: Record<string, any>, ledgerCanisterId?: string) {\n // Merge global config.metadata with call-specific metadata\n const mergedMeta = { ...(config as any).metadata, ...(metadata || {}) } as Record<string, any>;\n // If externalCostAmount is provided at config level and not already present in metadata, add it\n if ((config as any).externalCostAmount != null && mergedMeta.externalCostAmount == null) {\n mergedMeta.externalCostAmount = (config as any).externalCostAmount;\n }\n // Description passed through to intent (components decide X402 vs wallet flow before calling us)\n const fallbackDesc = `Pay ${usdAmount} with crypto`;\n const description =\n (config as any).description ||\n (mergedMeta as any).__description ||\n (mergedMeta as any).description ||\n fallbackDesc;\n const payload: any = {\n usdAmount,\n metadata: mergedMeta,\n description,\n recipientAddresses: (config as any).recipientAddresses,\n recipientAddress: (config as any).recipientAddress,\n };\n if ((config as any).fiat_currency != null && (config as any).fiat_currency !== '') {\n payload.fiat_currency = (config as any).fiat_currency;\n }\n if (typeof tokenShortcode === 'string' && tokenShortcode.trim().length > 0) {\n payload.tokenShortcode = tokenShortcode.toLowerCase();\n }\n if (typeof ledgerCanisterId === 'string' && ledgerCanisterId.trim().length > 0) {\n payload.ledgerCanisterId = ledgerCanisterId;\n }\n if (!payload.tokenShortcode && !payload.ledgerCanisterId) {\n throw new Error('sendUsd requires tokenShortcode or ledgerCanisterId');\n }\n debugLog(Boolean(config.debug), 'Calling createPaymentUsd (flow decision handled by components)', payload);\n return (client as any).createPaymentUsd(payload);\n }\n\n async function startOnrampUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>) {\n // Trigger onramp flow through SDK; SDK returns onramp data in metadata.onramp\n const mergedMeta = { ...(config as any).metadata, ...(metadata || {}) } as Record<string, any>;\n const fallbackDesc = `Pay ${usdAmount} with crypto`;\n const description =\n (config as any).description ||\n (mergedMeta as any).__description ||\n (mergedMeta as any).description ||\n fallbackDesc;\n debugLog(Boolean(config.debug), 'Calling onramp createPaymentUsd', {\n usdAmount,\n ledgerCanisterId,\n description,\n });\n const onrampPayload: any = {\n usdAmount,\n ledgerCanisterId,\n metadata: mergedMeta,\n onrampPayment: true,\n description,\n recipientAddresses: (config as any).recipientAddresses,\n recipientAddress: '',\n };\n if ((config as any).fiat_currency != null && (config as any).fiat_currency !== '') {\n onrampPayload.fiat_currency = (config as any).fiat_currency;\n }\n return (client as any).createPaymentUsd(onrampPayload);\n }\n\n\n function notifyIntentUntilComplete(paymentIntentId: string, intervalMs?: number, orderId?: string) {\n return (client as any).notifyPaymentIntentOnRamp({ paymentIntentId, intervalMs, orderId });\n }\n\n return { client, quoteUsd, sendUsd, startOnrampUsd, notifyIntentUntilComplete };\n } catch (error) {\n debugLog(config.debug || false, 'Error creating SDK:', error);\n throw error;\n }\n}\n\n\n","import { LitElement, html, css } from 'lit';\nimport { applyThemeVars } from '../../styles';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { getErrorMessage } from '../../error-handling';\n\n// Debug logger utility (mirrors other widgets)\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n}\n\ntype StepStatus = 'pending' | 'loading' | 'completed' | 'error';\n\ntype Step = {\n key: string;\n label: string;\n tooltip: string;\n status: StepStatus;\n timestamp?: string;\n errorMessage?: string;\n};\n\nconst DEFAULT_STEPS: Step[] = [\n {\n key: 'wallet',\n label: 'Connect wallet',\n tooltip: 'Awaiting wallet connection',\n status: 'pending'\n },\n {\n key: 'await',\n label: 'Awaiting confirmation',\n tooltip: 'Awaiting wallet signature',\n status: 'pending'\n },\n {\n key: 'transfer',\n label: 'Transferring funds',\n tooltip: 'Awaiting transfer to merchant',\n status: 'pending'\n },\n {\n key: 'verify',\n label: 'Verifying payment',\n tooltip: 'Please wait while we verify',\n status: 'pending'\n }\n];\n\n\n@customElement('icpay-progress-bar')\nexport class ICPayProgressBar extends LitElement {\n static styles = css`\n :host {\n display: block;\n font-family: var(--icpay-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n color: var(--icpay-foreground);\n background: var(--icpay-background);\n\n /* Theme-aware color variables - Light mode defaults */\n --icpay-background: #ffffff;\n --icpay-foreground: #171717;\n --icpay-muted-foreground: #6b7280;\n --icpay-accent-foreground: #ffffff;\n --icpay-primary: #3b82f6;\n --icpay-destructive: #ef4444;\n --icpay-primary-foreground: #ffffff;\n --icpay-secondary: #f3f4f6;\n --icpay-secondary-foreground: #171717;\n --icpay-accent: #f9fafb;\n --icpay-muted: #f9fafb;\n --icpay-border: #e5e7eb;\n --icpay-input: #e5e7eb;\n --icpay-ring: #3b82f6;\n --icpay-destructive-foreground: #ffffff;\n\n /* Status colors */\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #059669;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #d97706;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #dc2626;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #2563eb;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n\n /* Use new color palette variables */\n --icpay-text-primary: var(--icpay-foreground);\n --icpay-text-secondary: var(--icpay-muted-foreground);\n --icpay-text-muted: var(--icpay-muted-foreground);\n --icpay-bg-primary: var(--icpay-background);\n --icpay-bg-secondary: var(--icpay-secondary);\n --icpay-bg-secondary-hover: var(--icpay-accent);\n --icpay-bg-success: var(--icpay-success-bg);\n --icpay-bg-error: var(--icpay-error-bg);\n --icpay-border-primary: var(--icpay-border);\n --icpay-border-secondary: var(--icpay-border);\n --icpay-border-success: var(--icpay-success-border);\n --icpay-border-error: var(--icpay-error-border);\n --icpay-accent-primary: var(--icpay-primary);\n --icpay-accent-success: var(--icpay-success-text);\n --icpay-accent-error: var(--icpay-error-text);\n\n --icpay-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\n --icpay-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\n --icpay-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);\n --icpay-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);\n\n --icpay-radius-sm: 6px;\n --icpay-radius-md: 8px;\n --icpay-radius-lg: 12px;\n --icpay-radius-xl: 16px;\n\n --icpay-spacing-xs: 4px;\n --icpay-spacing-sm: 8px;\n --icpay-spacing-md: 12px;\n --icpay-spacing-lg: 16px;\n --icpay-spacing-xl: 24px;\n }\n\n :host([data-theme=\"dark\"]) {\n /* Dark mode (from COLOR_PALETTE.md) */\n --icpay-background: hsl(222.2 84% 4.9%);\n --icpay-foreground: hsl(210 40% 98%);\n --icpay-muted-foreground: hsl(215 20.2% 65.1%);\n --icpay-accent-foreground: hsl(210 40% 98%);\n --icpay-primary: hsl(210 40% 98%);\n --icpay-destructive: hsl(0 62.8% 30.6%);\n --icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n --icpay-secondary: hsl(217.2 32.6% 17.5%);\n --icpay-secondary-foreground: hsl(210 40% 98%);\n --icpay-accent: hsl(217.2 32.6% 17.5%);\n --icpay-muted: hsl(217.2 32.6% 17.5%);\n --icpay-border: hsl(217.2 32.6% 30%);\n --icpay-input: hsl(217.2 32.6% 17.5%);\n --icpay-ring: hsl(210 40% 98%);\n --icpay-destructive-foreground: hsl(210 40% 98%);\n\n /* Status colors for dark mode */\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #34d399;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #fbbf24;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #f87171;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #60a5fa;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n }\n\n .modal-overlay {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 99999 !important;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n /* Ensure modal breaks out of any parent constraints */\n transform: none !important;\n will-change: opacity, visibility;\n isolation: isolate;\n }\n\n @media (max-width: 768px) {\n .modal-overlay {\n align-items: flex-end;\n justify-content: stretch;\n }\n }\n\n .modal-content {\n transition: opacity 0.4s ease, transform 0.4s ease;\n opacity: 1;\n transform: translateY(0);\n flex: 1;\n }\n\n .modal-content.transitioning {\n opacity: 0;\n transform: translateY(20px);\n }\n\n .wallet-selector-container {\n width: 100%;\n }\n\n .wallet-selector-title {\n color: var(--icpay-text-primary);\n margin: 0 48px var(--icpay-spacing-lg) 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .wallet-options {\n display: flex;\n flex-direction: column;\n gap: var(--icpay-spacing-sm);\n }\n\n .wallet-option {\n width: 100%;\n padding: 12px 16px;\n background: var(--icpay-secondary);\n border: 1px solid var(--icpay-border);\n border-radius: 8px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.3s ease;\n box-sizing: border-box;\n }\n\n .wallet-option:hover {\n background: var(--icpay-accent);\n border-color: var(--icpay-border);\n }\n\n .wallet-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: var(--icpay-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .wallet-icon img {\n width: 40px;\n height: 40px;\n object-fit: cover;\n border-radius: 12px;\n }\n\n .wallet-icon-placeholder {\n color: var(--icpay-primary-foreground);\n font-size: 12px;\n font-weight: bold;\n }\n\n .wallet-label {\n font-weight: 500;\n font-size: 14px;\n color: var(--icpay-foreground);\n }\n\n .modal-overlay.active {\n opacity: 1;\n visibility: visible;\n }\n\n .modal-container {\n background: var(--icpay-background);\n border: 1px solid var(--icpay-border);\n border-radius: 24px;\n padding: 24px;\n max-width: 420px;\n width: 100%;\n height: 460px;\n box-shadow: var(--icpay-shadow-xl);\n transform: translateY(20px);\n transition: transform 0.3s ease;\n position: relative;\n display: flex;\n flex-direction: column;\n margin: auto;\n }\n\n @media (max-width: 768px) {\n .modal-container {\n max-width: 100%;\n width: 100%;\n height: 70vh;\n max-height: 70vh;\n border-radius: 24px 24px 0 0;\n margin: 0;\n transform: translateY(100%);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .modal-overlay.active .modal-container {\n transform: translateY(0);\n }\n .progress-steps {\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n }\n }\n\n .modal-overlay.active .modal-container {\n transform: translateY(0);\n }\n\n .close-button {\n position: absolute;\n top: var(--icpay-spacing-lg);\n right: var(--icpay-spacing-lg);\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--icpay-text-secondary);\n cursor: pointer;\n border: none;\n background: transparent;\n font-size: 20px;\n transition: all 0.2s;\n z-index: 10;\n }\n\n .close-button:hover {\n color: var(--icpay-text-primary);\n }\n\n .progress-header {\n display:flex;\n align-items:center;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--icpay-border);\n flex-shrink: 0;\n }\n .progress-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0;\n color: var(--icpay-foreground);\n flex: 1;\n text-align: center;\n margin-right: 40px;\n }\n .progress-spacer { width:24px; display:inline-block; margin-right:16px; }\n .progress-subtitle { color: var(--icpay-text-secondary); font-size: 14px; }\n .progress-steps {\n margin-bottom: var(--icpay-spacing-xl);\n display: flex;\n flex-direction: column;\n gap: 24px;\n overflow-y: auto;\n flex: 1;\n }\n .step {\n width: 100%;\n padding: 16px;\n background: var(--icpay-secondary);\n border: none;\n border-radius: 12px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.3s ease;\n cursor: default;\n box-sizing: border-box;\n }\n .step.active {\n background: var(--icpay-accent);\n }\n .step.completed {\n opacity: 1;\n background: var(--icpay-secondary);\n }\n\n .step.error {\n opacity: 1;\n background: var(--icpay-error-bg);\n border: 1px solid var(--icpay-error-border);\n }\n .step-icon {\n width: 40px;\n height: 40px;\n border-radius: 0;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.3s ease;\n position: relative;\n flex-shrink: 0;\n }\n .step.active .step-icon { }\n .step.completed .step-icon { }\n\n .step.error .step-icon { background: transparent; }\n .step-icon svg {\n width: 20px;\n height: 20px;\n stroke: var(--icpay-text-primary);\n transition: stroke 0.3s ease;\n }\n .step-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n .step-title {\n font-weight: 500;\n font-size: 16px;\n color: var(--icpay-foreground);\n transition: color 0.3s ease;\n margin: 0;\n }\n .step-description {\n font-size: 14px;\n color: var(--icpay-muted-foreground);\n margin: 0;\n }\n\n .step-error-message {\n font-size: 11px;\n color: var(--icpay-error-text);\n margin-top: 4px;\n padding: 4px 8px;\n background: var(--icpay-error-bg);\n border-radius: 4px;\n border-left: 3px solid var(--icpay-error-text);\n }\n /* Spinner exactly like in design: wrapper + ::before ring */\n .spinner {\n width: 40px;\n height: 40px;\n margin-right: 0;\n position: relative;\n flex-shrink: 0;\n }\n .spinner::before {\n content: '';\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid var(--icpay-border);\n border-top: 3px solid var(--icpay-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n }\n /* Completed: replace ring with filled green circle + tick */\n .step.completed .spinner::before { display: none; }\n .step.completed .spinner::after {\n content: '✓';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: var(--icpay-success-text);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--icpay-background);\n font-size: 24px;\n font-weight: bold;\n box-sizing: border-box;\n }\n\n /* Error icon (pastel red) like success's green circle */\n .error-x {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background-color: var(--icpay-error-text);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--icpay-background);\n font-size: 20px;\n font-weight: bold;\n box-sizing: border-box;\n }\n\n /* Completed icon to match design proportions */\n .complete-icon {\n width: 40px;\n height: 40px;\n position: relative;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .complete-icon::before {\n content: '';\n position: absolute;\n inset: 0;\n border: 3px solid var(--icpay-border);\n border-radius: 50%;\n background: var(--icpay-secondary);\n box-sizing: border-box;\n }\n .complete-icon svg {\n position: relative;\n width: 20px;\n height: 20px;\n stroke: var(--icpay-foreground);\n display: block;\n }\n\n .error-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n text-align: center;\n }\n\n .error-icon-large {\n width: 64px;\n height: 64px;\n margin: 0 auto var(--icpay-spacing-lg);\n background: var(--icpay-error-text);\n border-radius: var(--icpay-radius-xl);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .error-icon-large svg {\n width: 32px;\n height: 32px;\n stroke: var(--icpay-background);\n stroke-width: 2;\n }\n\n .error-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: var(--icpay-spacing-sm);\n color: var(--icpay-text-primary);\n }\n\n .error-message-text {\n color: var(--icpay-text-secondary);\n margin-bottom: var(--icpay-spacing-xl);\n font-size: 14px;\n }\n\n .error-details {\n background: var(--icpay-error-bg);\n border: 1px solid var(--icpay-error-border);\n border-radius: var(--icpay-radius-md);\n padding: var(--icpay-spacing-lg);\n margin-bottom: var(--icpay-spacing-xl);\n text-align: left;\n }\n\n .error-detail-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: var(--icpay-spacing-sm);\n }\n\n .error-detail-item:last-child {\n margin-bottom: 0;\n }\n\n .error-detail-label {\n font-size: 14px;\n color: var(--icpay-text-secondary);\n font-weight: 500;\n }\n\n .error-detail-value {\n font-size: 14px;\n color: var(--icpay-text-primary);\n font-weight: 600;\n }\n\n .error-actions {\n display: flex;\n gap: var(--icpay-spacing-sm);\n justify-content: center;\n }\n\n .insufficient-funds-container {\n width: 100%;\n }\n\n .payment-summary {\n background: var(--icpay-secondary);\n border-radius: var(--icpay-radius-md);\n padding: var(--icpay-spacing-lg);\n margin-bottom: var(--icpay-spacing-lg);\n text-align: center;\n }\n\n .payment-amount {\n font-size: 16px;\n font-weight: 600;\n color: var(--icpay-text-primary);\n }\n\n .error-notification {\n background: var(--icpay-warning-bg);\n border: 1px solid var(--icpay-warning-border);\n border-radius: var(--icpay-radius-md);\n padding: var(--icpay-spacing-lg);\n margin-bottom: var(--icpay-spacing-xl);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--icpay-spacing-lg);\n }\n\n .error-content {\n display: flex;\n align-items: center;\n gap: var(--icpay-spacing-md);\n flex: 1;\n }\n\n .error-icon-small {\n width: 20px;\n height: 20px;\n color: var(--icpay-warning-text);\n flex-shrink: 0;\n }\n\n .error-icon-small svg {\n width: 100%;\n height: 100%;\n }\n\n .error-text {\n font-size: 14px;\n font-weight: 500;\n color: var(--icpay-warning-text);\n }\n\n .add-funds-btn {\n background: var(--icpay-secondary);\n border: 1px solid var(--icpay-border);\n border-radius: var(--icpay-radius-sm);\n padding: 8px 16px;\n color: var(--icpay-foreground);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.3s ease;\n flex-shrink: 0;\n }\n\n .add-funds-btn:hover {\n background: var(--icpay-accent);\n border-color: var(--icpay-border);\n }\n\n .error-message {\n display: flex;\n align-items: flex-start;\n gap: var(--icpay-spacing-md);\n padding: var(--icpay-spacing-lg);\n background: var(--icpay-bg-error);\n border: 1px solid var(--icpay-border-error);\n border-radius: var(--icpay-radius-md);\n margin-top: var(--icpay-spacing-sm);\n }\n\n .error-icon {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n background: var(--icpay-accent-error);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--icpay-text-primary);\n font-size: 12px;\n font-weight: bold;\n }\n\n .error-content h4 {\n margin: 0 0 4px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--icpay-text-primary);\n }\n\n .error-content p {\n margin: 0;\n font-size: 12px;\n color: var(--icpay-error-text);\n line-height: 1.4;\n }\n\n .success-container { text-align: center; }\n .success-center {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .success-icon {\n width: 64px;\n height: 64px;\n margin: 0 auto var(--icpay-spacing-lg);\n background: var(--icpay-success-text);\n border-radius: var(--icpay-radius-xl);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .success-icon svg {\n width: 32px;\n height: 32px;\n stroke: var(--icpay-background);\n stroke-width: 2;\n }\n .success-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: var(--icpay-spacing-sm);\n color: var(--icpay-foreground);\n }\n .success-message {\n color: var(--icpay-muted-foreground);\n margin-bottom: 20px;\n font-size: 14px;\n }\n .success-actions {\n display: flex;\n gap: var(--icpay-spacing-sm);\n justify-content: center;\n }\n .btn {\n padding: 10px 20px;\n border-radius: var(--icpay-radius-md);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.3s ease;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: var(--icpay-spacing-sm);\n }\n .btn-primary {\n background: var(--icpay-primary);\n color: var(--icpay-primary-foreground);\n border: none;\n }\n .btn-primary:hover {\n transform: translateY(-1px);\n opacity: 0.9;\n }\n .btn-secondary {\n background: transparent;\n color: var(--icpay-muted-foreground);\n border: 1px solid var(--icpay-border);\n }\n .btn-secondary:hover {\n background: var(--icpay-secondary);\n border-color: var(--icpay-border);\n color: var(--icpay-foreground);\n }\n\n .confetti {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1001;\n }\n\n .confetti-piece {\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--icpay-primary);\n animation: confetti-fall 3s linear forwards;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n /* legacy spinner removed; unified spinner defined above to match design */\n\n @keyframes confetti-fall {\n 0% {\n transform: translateY(-100vh) rotate(0deg);\n opacity: 1;\n }\n 100% {\n transform: translateY(100vh) rotate(720deg);\n opacity: 0;\n }\n }\n `;\n\n @property({ type: Boolean }) open = false;\n @property({ type: Boolean }) suspended = false;\n @property({ type: Array }) steps: Step[] = DEFAULT_STEPS;\n @property({ type: Number }) amount = 0;\n @property({ type: String }) currency = '';\n @property({ type: String }) ledgerSymbol = '';\n @property({ type: Boolean }) debug = false;\n @state() private activeIndex = 0;\n @state() private completed = false;\n @state() private failed = false;\n @state() private errorMessage: string | null = null;\n @state() private showSuccess = false;\n @state() private showConfetti = false;\n @state() private currentSteps: Step[] = [];\n @state() private currentAmount = 0;\n @state() private currentCurrency = '';\n @state() private currentLedgerSymbol = '';\n /** Fiat currency code/symbol from payment intent (for success message). */\n @state() private currentFiatCode = '';\n @state() private currentFiatSymbol: string | null = null;\n @state() private confirmLoadingStartedAt: number | null = null;\n private progressionTimer: number | null = null;\n @state() private currentWalletType: string | null = null;\n @state() private showWalletSelector = false;\n @state() private isTransitioning = false;\n @state() private isOnrampFlow = false;\n\n @property({ type: Object }) theme?: 'light' | 'dark' | { mode?: 'light' | 'dark'; primaryColor?: string; secondaryColor?: string };\n\n connectedCallback(): void {\n super.connectedCallback();\n try {\n applyThemeVars(this, this.theme as any);\n // Extract theme mode from theme prop\n let themeMode: 'light' | 'dark' = 'light';\n if (typeof this.theme === 'string') {\n themeMode = this.theme;\n } else if (this.theme && typeof this.theme === 'object' && this.theme.mode) {\n themeMode = this.theme.mode;\n } else if (typeof document !== 'undefined') {\n const docTheme = document.documentElement.getAttribute('data-icpay-theme') ||\n document.documentElement.getAttribute('data-theme');\n if (docTheme === 'light' || docTheme === 'dark') {\n themeMode = docTheme;\n }\n }\n this.setAttribute('data-theme', themeMode);\n } catch {}\n this.currentSteps = [...this.steps];\n\n // Initialize dynamic values from properties\n this.currentAmount = this.amount;\n this.currentCurrency = this.currency;\n this.currentLedgerSymbol = this.ledgerSymbol;\n\n // Attach global listeners for ICPay SDK events\n this.attachSDKEventListeners();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.detachSDKEventListeners();\n this.stopAutomaticProgression();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('theme')) {\n try {\n applyThemeVars(this, this.theme as any);\n // Extract theme mode from theme prop\n let themeMode: 'light' | 'dark' = 'light';\n if (typeof this.theme === 'string') {\n themeMode = this.theme;\n } else if (this.theme && typeof this.theme === 'object' && this.theme.mode) {\n themeMode = this.theme.mode;\n } else if (typeof document !== 'undefined') {\n const docTheme = document.documentElement.getAttribute('data-icpay-theme') ||\n document.documentElement.getAttribute('data-theme');\n if (docTheme === 'light' || docTheme === 'dark') {\n themeMode = docTheme;\n }\n }\n this.setAttribute('data-theme', themeMode);\n } catch {}\n }\n }\n\n private attachSDKEventListeners() {\n // Core payment flow events\n window.addEventListener('icpay-sdk-method-start', this.onMethodStart as EventListener);\n window.addEventListener('icpay-sdk-method-success', this.onMethodSuccess as EventListener);\n window.addEventListener('icpay-sdk-method-error', this.onMethodError as EventListener);\n window.addEventListener('icpay-sdk-wallet-cancelled', this.onWalletCancelled as EventListener);\n window.addEventListener('icpay-sdk-wallet-error', this.onWalletError as EventListener);\n\n // Transaction lifecycle events\n window.addEventListener('icpay-sdk-transaction-created', this.onTransactionCreated as EventListener);\n window.addEventListener('icpay-sdk-transaction-updated', this.onTransactionUpdated as EventListener);\n window.addEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener);\n window.addEventListener('icpay-sdk-transaction-failed', this.onTransactionFailed as EventListener);\n window.addEventListener('icpay-sdk-transaction-mismatched', this.onTransactionMismatched as EventListener);\n // Onramp-specific cue when URL opened in new tab\n window.addEventListener('icpay-onramp-opened', this.onOnrampOpened as EventListener);\n\n // Additional SDK events\n window.addEventListener('icpay-sdk-error', this.onSDKError as EventListener);\n window.addEventListener('icpay-sdk-wallet-connected', this.onWalletConnected as EventListener);\n window.addEventListener('icpay-sdk-wallet-disconnected', this.onWalletDisconnected as EventListener);\n window.addEventListener('icpay-sdk-balance-check', this.onBalanceCheck as EventListener);\n window.addEventListener('icpay-sdk-ledger-verified', this.onLedgerVerified as EventListener);\n\n // Custom widget events for better integration\n window.addEventListener('icpay-pay', this.onWidgetPayment as EventListener);\n window.addEventListener('icpay-error', this.onWidgetError as EventListener);\n window.addEventListener('icpay-unlock', this.onWidgetUnlock as EventListener);\n window.addEventListener('icpay-tip', this.onWidgetTip as EventListener);\n window.addEventListener('icpay-donation', this.onWidgetDonation as EventListener);\n window.addEventListener('icpay-coffee', this.onWidgetCoffee as EventListener);\n\n // Reset when user starts a new payment from any widget (full start-over)\n window.addEventListener('icpay-payment-reset', this.onPaymentReset as EventListener);\n }\n\n private detachSDKEventListeners() {\n // Core payment flow events\n window.removeEventListener('icpay-sdk-method-start', this.onMethodStart as EventListener);\n window.removeEventListener('icpay-sdk-method-success', this.onMethodSuccess as EventListener);\n window.removeEventListener('icpay-sdk-method-error', this.onMethodError as EventListener);\n window.removeEventListener('icpay-sdk-wallet-cancelled', this.onWalletCancelled as EventListener);\n window.removeEventListener('icpay-sdk-wallet-error', this.onWalletError as EventListener);\n\n // Transaction lifecycle events\n window.removeEventListener('icpay-sdk-transaction-created', this.onTransactionCreated as EventListener);\n window.removeEventListener('icpay-sdk-transaction-updated', this.onTransactionUpdated as EventListener);\n window.removeEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener);\n window.removeEventListener('icpay-sdk-transaction-failed', this.onTransactionFailed as EventListener);\n window.removeEventListener('icpay-sdk-transaction-mismatched', this.onTransactionMismatched as EventListener);\n window.removeEventListener('icpay-onramp-opened', this.onOnrampOpened as EventListener);\n\n // Additional SDK events\n window.removeEventListener('icpay-sdk-error', this.onSDKError as EventListener);\n window.removeEventListener('icpay-sdk-wallet-connected', this.onWalletConnected as EventListener);\n window.removeEventListener('icpay-sdk-wallet-disconnected', this.onWalletDisconnected as EventListener);\n window.removeEventListener('icpay-sdk-balance-check', this.onBalanceCheck as EventListener);\n window.removeEventListener('icpay-sdk-ledger-verified', this.onLedgerVerified as EventListener);\n\n // Custom widget events\n window.removeEventListener('icpay-pay', this.onWidgetPayment as EventListener);\n window.removeEventListener('icpay-error', this.onWidgetError as EventListener);\n window.removeEventListener('icpay-unlock', this.onWidgetUnlock as EventListener);\n window.removeEventListener('icpay-tip', this.onWidgetTip as EventListener);\n window.removeEventListener('icpay-donation', this.onWidgetDonation as EventListener);\n window.removeEventListener('icpay-coffee', this.onWidgetCoffee as EventListener);\n window.removeEventListener('icpay-payment-reset', this.onPaymentReset as EventListener);\n }\n\n private onPaymentReset = () => {\n this.stopAutomaticProgression();\n this.open = false;\n this.showWalletSelector = false;\n this.isTransitioning = false;\n this.activeIndex = 0;\n this.completed = false;\n this.failed = false;\n this.errorMessage = null;\n this.showSuccess = false;\n this.showConfetti = false;\n this.isOnrampFlow = false;\n this.currentSteps = [...this.steps].map(step => ({ ...step, status: 'pending' as StepStatus }));\n this.requestUpdate();\n };\n\n private onMethodStart = (e: any) => {\n const methodName = e?.detail?.name || '';\n const methodType = e?.detail?.type || '';\n\n debugLog(this.debug, 'ICPay Progress: Method start event received:', e.detail);\n\n // Handle different payment methods (top-level starts)\n if (methodName === 'createPayment' || methodName === 'createPaymentUsd' ||\n methodName === 'sendUsd' || methodName === 'pay' ||\n methodName === 'unlock' || methodName === 'tip' ||\n methodName === 'donate' || methodName === 'order') {\n\n this.open = true;\n this.activeIndex = 0;\n this.completed = false;\n this.failed = false;\n this.errorMessage = null;\n this.showSuccess = false;\n this.showConfetti = false;\n\n // Do not show an internal wallet selector; parent widgets handle wallet modal\n this.showWalletSelector = false;\n this.isTransitioning = false;\n\n // Reset all steps to pending\n this.currentSteps = this.currentSteps.map(step => ({ ...step, status: 'pending' as StepStatus }));\n\n // Step 0: Wallet connect loading (rename/setup if onramp)\n if (methodType === 'onramp') {\n this.isOnrampFlow = true;\n // Remap step labels/tooltips for onramp flow\n const map: Record<string, { label: string; tooltip: string }> = {\n wallet: { label: 'Payment initiated', tooltip: 'Please pay in the new tab' },\n await: { label: 'Onramp process started', tooltip: 'Verifying funds with provider' },\n transfer: { label: 'Funds received', tooltip: 'Payment in progress' },\n verify: { label: 'Payment completed', tooltip: 'Finalizing your payment' },\n };\n this.currentSteps = this.currentSteps.map(s => (map[s.key]\n ? { ...s, label: map[s.key].label, tooltip: map[s.key].tooltip }\n : s));\n }\n this.setLoadingByKey('wallet');\n\n // Update amount and currency if provided in event\n if (e?.detail?.amount !== undefined) {\n this.currentAmount = e.detail.amount;\n this.amount = e.detail.amount;\n debugLog(this.debug, 'ICPay Progress: Amount updated to:', e.detail.amount);\n }\n if (e?.detail?.currency) {\n this.currentCurrency = e.detail.currency;\n this.currency = e.detail.currency;\n debugLog(this.debug, 'ICPay Progress: Currency updated to:', e.detail.currency);\n }\n if (e?.detail?.ledgerSymbol) {\n this.currentLedgerSymbol = e.detail.ledgerSymbol;\n this.ledgerSymbol = e.detail.ledgerSymbol;\n debugLog(this.debug, 'ICPay Progress: Current state after method start:', {\n activeIndex: this.activeIndex,\n currentAmount: this.currentAmount,\n currentCurrency: this.currentCurrency,\n currentLedgerSymbol: this.currentLedgerSymbol\n });\n }\n\n // Waiting for wallet confirmation event to proceed\n debugLog(this.debug, 'ICPay Progress: Waiting for wallet confirmation before starting progression');\n\n this.requestUpdate();\n }\n\n // Mid-flow granular starts for internal SDK steps (independent of top-level starts)\n if (!this.failed && !this.completed) {\n if (methodName === 'createPaymentX402Usd') {\n // X402 signature step: awaiting confirmation\n this.completeByKey('wallet');\n this.setLoadingByKey('await');\n } else if (methodName === 'sendFundsToLedger') {\n // Regular transfer step (IC or EVM tx): move to transfer\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n } else if (methodName === 'notifyLedgerTransaction') {\n // Start of post-send verification. In X402 this is called after signature (settle start).\n // Ensure we've advanced past await, move to transfer while settlement is being kicked off.\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n } else if (methodName === 'settleX402') {\n // IC x402: settle request sent — mark awaiting confirmation as completed, show transferring funds\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n }\n }\n };\n\n private startAutomaticProgression() {\n // Clear any existing progression timer\n if (this.progressionTimer) {\n clearInterval(this.progressionTimer);\n }\n\n // Start from step 1 (second step) since step 0 is already completed\n this.activeIndex = 1;\n this.updateStepStatus(this.activeIndex, 'loading');\n\n debugLog(this.debug, 'ICPay Progress: Starting automatic progression from step:', this.activeIndex);\n\n // Progress through steps every 3 seconds\n this.progressionTimer = setInterval(() => {\n if (this.failed || this.completed) {\n this.stopAutomaticProgression();\n return;\n }\n\n debugLog(this.debug, 'ICPay Progress: Processing step:', this.activeIndex);\n\n // Complete current step\n this.updateStepStatus(this.activeIndex, 'completed');\n\n // Move to next step if available\n if (this.activeIndex < this.currentSteps.length - 1) {\n this.activeIndex++;\n this.updateStepStatus(this.activeIndex, 'loading');\n debugLog(this.debug, 'ICPay Progress: Auto-progressed to step:', this.activeIndex);\n } else {\n // All steps completed, stop progression and wait for transaction completion\n this.stopAutomaticProgression();\n debugLog(this.debug, 'ICPay Progress: All steps completed, waiting for transaction completion');\n }\n\n this.requestUpdate();\n }, 3000);\n }\n\n private stopAutomaticProgression() {\n if (this.progressionTimer) {\n clearInterval(this.progressionTimer);\n this.progressionTimer = null;\n }\n }\n\n private onMethodSuccess = (e: any) => {\n const methodName = e?.detail?.name || '';\n if (methodName === 'createPayment' || methodName === 'createPaymentUsd' ||\n methodName === 'sendUsd' || methodName === 'pay' ||\n methodName === 'unlock' || methodName === 'tip' ||\n methodName === 'donate' || methodName === 'order') {\n\n // Dispatch method success event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-method-success', {\n detail: { methodName, step: this.activeIndex },\n bubbles: true\n }));\n }\n\n // Map SDK method successes to step completions (mid-flow methods)\n if (!this.failed && !this.completed) {\n // Onramp flow: do not map internal wallet steps (no wallet transfer happens here)\n if (this.isOnrampFlow) {\n return;\n }\n if (methodName === 'getLedgerBalance') {\n this.completeByKey('wallet');\n this.setLoadingByKey('await');\n } else if (methodName === 'sendFundsToLedger') {\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.completeByKey('transfer');\n this.setLoadingByKey('verify');\n } else if (methodName === 'notifyLedgerTransaction') {\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.completeByKey('transfer');\n // Keep verify loading until completion\n this.setLoadingByKey('verify');\n } else if (methodName === 'createPaymentX402Usd') {\n // IC x402: settle response received — mark Transferring funds as done, show verifying\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.completeByKey('transfer');\n this.setLoadingByKey('verify');\n }\n }\n };\n\n private onTransactionCreated = (e: any) => {\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n debugLog(this.debug, 'ICPay Progress: Transaction created event received:', e.detail);\n\n // For onramp, do not auto-advance to transfer on intent creation\n if (!this.failed && !this.completed) {\n if (this.isOnrampFlow) {\n // Keep first step loading until onramp tab is opened, then move to 'await'\n return;\n }\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n }\n\n // Dispatch transaction created event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-transaction-created', {\n detail: { transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionUpdated = (e: any) => {\n const status = e?.detail?.status || 'pending';\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n const intentMeta = (e?.detail?.metadata || e?.detail?.intent?.metadata || {}) as any;\n\n debugLog(this.debug, 'ICPay Progress: Transaction updated event received:', e.detail);\n\n if (!this.failed && !this.completed) {\n if (this.isOnrampFlow) {\n // Map intent statuses to onramp steps\n // requires_payment -> keep 'await' loading\n // pending/processing -> complete 'await', set 'transfer' loading\n // completed handled in onTransactionCompleted\n // Also advance to 'transfer' when backend confirms onramp order completed via metadata\n const onrampCompleteMeta =\n intentMeta?.onramp_order_completed === true ||\n intentMeta?.icpay_onramp?.status === 'completed' ||\n intentMeta?.onrampCompleted === true;\n if (status === 'requires_payment' && !onrampCompleteMeta) {\n this.completeByKey('wallet');\n this.setLoadingByKey('await');\n } else if (status === 'pending' || status === 'processing' || onrampCompleteMeta) {\n this.completeByKey('wallet');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n }\n } else {\n // When pending turns to confirmed, keep current step loading\n if (status === 'pending') {\n // no-op for non-onramp standard flow\n }\n }\n }\n\n // Dispatch transaction updated event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-transaction-updated', {\n detail: { status, transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionCompleted = (e: any) => {\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n const status = e?.detail?.status || 'completed';\n const paymentIntent = e?.detail?.paymentIntent ?? e?.detail?.payment?.paymentIntent;\n if (paymentIntent && typeof paymentIntent === 'object') {\n if (paymentIntent.fiatCurrencyCode != null && paymentIntent.fiatCurrencyCode !== '') {\n this.currentFiatCode = String(paymentIntent.fiatCurrencyCode);\n }\n if (paymentIntent.fiatCurrencySymbol != null && paymentIntent.fiatCurrencySymbol !== '') {\n this.currentFiatSymbol = String(paymentIntent.fiatCurrencySymbol);\n }\n }\n\n debugLog(this.debug, 'ICPay Progress: Transaction completed event received:', e.detail);\n debugLog(this.debug, 'ICPay Progress: Current state when transaction completed:', {\n activeIndex: this.activeIndex,\n completed: this.completed,\n failed: this.failed,\n showSuccess: this.showSuccess\n });\n\n // Ensure remaining steps are completed in sequence before final success\n this.completeByKey('transfer');\n this.completeByKey('await');\n this.completeByKey('verify');\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n this.isOnrampFlow = false;\n\n // Dispatch completion event\n this.dispatchEvent(new CustomEvent('icpay-progress-completed', {\n detail: {\n transactionId,\n status,\n amount: this.currentAmount || this.amount,\n currency: this.currentCurrency || this.currency,\n ledgerSymbol: this.currentLedgerSymbol || this.ledgerSymbol\n },\n bubbles: true\n }));\n\n // Auto-close after 2 seconds if user hasn't closed it manually\n /*setTimeout(() => {\n if (this.open && this.showSuccess && !this.failed) {\n this.open = false;\n }\n }, 2000);*/\n\n // Only hide confetti after 3 seconds\n setTimeout(() => {\n this.showConfetti = false;\n }, 3000);\n };\n\n private onTransactionFailed = (e: any) => {\n const errorObj = e?.detail?.error;\n const rawMessage = e?.detail?.message || e?.detail?.error?.message || 'Transaction failed';\n const errorMessage = errorObj ? getErrorMessage(errorObj) : this.transformErrorMessage(rawMessage);\n const errorCode = e?.detail?.error?.code || e?.detail?.code || 'UNKNOWN_ERROR';\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n debugLog(this.debug, 'ICPay Progress: Transaction failed event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.preferSpecificError(this.errorMessage, errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n this.isOnrampFlow = false;\n\n // Dispatch transaction failed event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-failed', {\n detail: { errorMessage: this.errorMessage, errorCode, transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionMismatched = (e: any) => {\n const requestedAmount = e?.detail?.requestedAmount;\n const paidAmount = e?.detail?.paidAmount;\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n //debugLog(this.debug, 'ICPay Progress: Transaction mismatched event received:', e.detail);\n\n // Treat as failure with specific message\n this.failed = true;\n const requested = requestedAmount != null ? String(requestedAmount) : 'unknown';\n const paid = paidAmount != null ? String(paidAmount) : 'unknown';\n this.errorMessage = `Amount mismatch. Requested ${requested}, paid ${paid}.`;\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n this.isOnrampFlow = false;\n\n // Dispatch failed event with mismatch context\n this.dispatchEvent(new CustomEvent('icpay-progress-failed', {\n detail: { errorMessage: this.errorMessage, errorCode: 'MISMATCHED_AMOUNT', transactionId, step: this.activeIndex, requestedAmount, paidAmount },\n bubbles: true\n }));\n };\n\n private onMethodError = (e: any) => {\n const methodName = e?.detail?.name || '';\n const errorObj = e?.detail?.error;\n const rawMessage = e?.detail?.message || (errorObj && errorObj.message) || 'An error occurred';\n const errorMessage = errorObj ? getErrorMessage(errorObj) : this.transformErrorMessage(rawMessage);\n const errorCode = e?.detail?.error?.code || e?.detail?.code || 'METHOD_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: Method error event received:', e.detail);\n\n if (methodName?.startsWith('createPayment') || methodName === 'sendUsd' ||\n methodName === 'pay' || methodName === 'unlock' ||\n methodName === 'tip' || methodName === 'donate' ||\n methodName === 'order') {\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.preferSpecificError(this.errorMessage, errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n this.isOnrampFlow = false;\n\n // Dispatch method error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-error', {\n detail: { methodName, errorMessage: this.errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n }\n };\n\n private onSDKError = (e: any) => {\n const errorObj = e?.detail?.error;\n const rawMessage = e?.detail?.message || (errorObj && errorObj.message) || 'SDK error occurred';\n const errorMessage = errorObj ? getErrorMessage(errorObj) : this.transformErrorMessage(rawMessage);\n const errorCode = e?.detail?.code || 'SDK_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: SDK error event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.preferSpecificError(this.errorMessage, errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n this.isOnrampFlow = false;\n\n // Dispatch SDK error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-sdk-error', {\n detail: { errorMessage: this.errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWalletConnected = (e: any) => {\n const walletType = e?.detail?.walletType || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Wallet connected event received:', e.detail);\n\n // Complete wallet step and set awaiting confirmation to loading\n this.completeByKey('wallet');\n this.setLoadingByKey('await');\n\n // Start transition from wallet selector to progress bar\n this.startTransitionToProgress();\n\n // Dispatch wallet connected event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-wallet-connected', {\n detail: { walletType, step: this.activeIndex },\n bubbles: true\n }));\n this.currentWalletType = walletType;\n };\n\n // Onramp-specific: user opened the pay URL in a new tab/window\n private onOnrampOpened = (_e: any) => {\n if (!this.isOnrampFlow || this.failed || this.completed) return;\n // Move from step 1 to step 2\n this.completeByKey('wallet');\n this.setLoadingByKey('await');\n };\n\n private onWalletDisconnected = (e: any) => {\n const walletType = e?.detail?.walletType || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Wallet disconnected event received:', e.detail);\n\n // Dispatch wallet disconnected event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-wallet-disconnected', {\n detail: { walletType, step: this.activeIndex },\n bubbles: true\n }));\n this.currentWalletType = null;\n };\n\n private onBalanceCheck = (e: any) => {\n const hasBalance = e?.detail?.hasBalance || false;\n const balance = e?.detail?.balance || 0;\n\n debugLog(this.debug, 'ICPay Progress: Balance check event received:', e.detail);\n\n // Handle insufficient balance error\n if (!hasBalance) {\n this.failed = true;\n this.errorMessage = 'Insufficient balance for transaction';\n this.updateStepStatus(this.activeIndex, 'error', 'Insufficient balance for transaction');\n this.stopAutomaticProgression();\n this.showWalletSelector = false; // Ensure we're in progress view for error\n\n // Dispatch insufficient balance event\n this.dispatchEvent(new CustomEvent('icpay-progress-insufficient-balance', {\n detail: { balance, required: this.currentAmount || this.amount, step: this.activeIndex },\n bubbles: true\n }));\n }\n };\n\n private onLedgerVerified = (e: any) => {\n const ledgerId = e?.detail?.ledgerId || e?.detail?.canisterId;\n const symbol = e?.detail?.symbol || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Ledger verified event received:', e.detail);\n\n // Update ledger symbol if provided\n if (symbol && symbol !== 'unknown') {\n this.currentLedgerSymbol = symbol;\n this.ledgerSymbol = symbol;\n }\n\n // Dispatch ledger verified event\n this.dispatchEvent(new CustomEvent('icpay-progress-ledger-verified', {\n detail: { ledgerId, symbol, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n // Widget-specific event handlers for better integration\n private onWidgetPayment = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n const ledgerSymbol = e?.detail?.ledgerSymbol;\n\n debugLog(this.debug, 'ICPay Progress: Widget payment event received:', e.detail);\n\n // Update dynamic values if provided\n if (amount !== undefined) {\n this.currentAmount = amount;\n this.amount = amount;\n }\n if (currency) {\n this.currentCurrency = currency;\n this.currency = currency;\n }\n if (ledgerSymbol) {\n this.currentLedgerSymbol = ledgerSymbol;\n this.ledgerSymbol = ledgerSymbol;\n }\n\n // Advance steps to success state (event-driven, no auto progression)\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget payment event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-payment', {\n detail: { amount, currency, ledgerSymbol, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetError = (e: any) => {\n // `icpay-error` detail may be the error object itself or wrapped\n const errObj = e?.detail?.error || e?.detail;\n const rawMessage = (errObj && errObj.message) || e?.detail?.message || 'Widget error occurred';\n const errorMessage = errObj ? getErrorMessage(errObj) : this.transformErrorMessage(rawMessage);\n const errorCode = (errObj && errObj.code) || e?.detail?.code || 'WIDGET_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: Widget error event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.preferSpecificError(this.errorMessage, errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch widget error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-error', {\n detail: { errorMessage: this.errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetUnlock = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget unlock event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget unlock event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-unlock', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetTip = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget tip event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget tip event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-tip', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetDonation = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget donation event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget donation event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-donation', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetCoffee = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget coffee event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget coffee event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-coffee', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private updateStepStatus(stepIndex: number, status: StepStatus, errorMessage?: string | null) {\n if (stepIndex >= 0 && stepIndex < this.currentSteps.length) {\n const step = this.currentSteps[stepIndex];\n const oldStatus = step.status;\n\n step.status = status;\n if (status === 'completed') {\n step.timestamp = this.getCurrentTime();\n }\n if (status === 'error' && errorMessage) {\n step.errorMessage = this.transformErrorMessage(errorMessage);\n }\n\n if (oldStatus !== status) {\n debugLog(this.debug, `ICPay Progress: Step ${stepIndex} (${step.label}) status changed from ${oldStatus} to ${status}`);\n }\n\n this.requestUpdate();\n }\n }\n\n private getCurrentTime() {\n const now = new Date();\n return now.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n private getStepIcon(step: Step): string | any {\n if (step.status === 'error') {\n return html`<div class=\"error-x\">✕</div>`;\n }\n return html`<div class=\"spinner\"></div>`;\n }\n\n private getStepIndexByKey(key: string): number {\n return this.currentSteps.findIndex(s => s.key === key);\n }\n\n private setLoadingByKey(key: string) {\n const idx = this.getStepIndexByKey(key);\n if (idx >= 0) {\n this.activeIndex = idx;\n this.updateStepStatus(idx, 'loading');\n // Track start time for long verification tip\n if (key === 'verify') {\n this.confirmLoadingStartedAt = Date.now();\n }\n }\n }\n\n private completeByKey(key: string) {\n const idx = this.getStepIndexByKey(key);\n if (idx >= 0) {\n this.updateStepStatus(idx, 'completed');\n this.activeIndex = idx;\n }\n }\n\n // Normalize specific error messages to friendlier text\n private transformErrorMessage(message: string): string {\n const msg = String(message || '').toLowerCase();\n if (msg.includes('user rejected')) return 'User have rejected the transfer';\n if (msg.includes('user cancelled') || msg.includes('user canceled')) return 'User have rejected the transfer';\n if (msg.includes('signature rejected')) return 'User have rejected the transfer';\n return message;\n }\n\n // Prefer keeping a specific server message; don't overwrite with generic fallbacks\n private isGenericErrorText(message: string | null | undefined): boolean {\n if (!message) return true;\n const m = message.toLowerCase();\n return (\n m === 'an error occurred' ||\n m === 'sdk error occurred' ||\n m === 'transaction failed' ||\n m.includes('failed to create payment') ||\n m.includes('wallet error') ||\n m.includes('network error')\n );\n }\n\n private preferSpecificError(currentMsg: string | null | undefined, incoming: string): string {\n const next = this.transformErrorMessage(incoming || '');\n if (currentMsg && !this.isGenericErrorText(currentMsg) && this.isGenericErrorText(next)) {\n return currentMsg;\n }\n return next;\n }\n\n private renderConfetti() {\n if (!this.showConfetti) return '';\n\n const confettiPieces = Array.from({ length: 50 }, (_, i) => i);\n const colors = ['#0066FF', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6'];\n\n return html`\n <div class=\"confetti\">\n ${confettiPieces.map((piece) => html`\n <div\n class=\"confetti-piece\"\n style=\"\n left: ${Math.random() * 100}%;\n top: ${Math.random() * 100}%;\n background-color: ${colors[Math.floor(Math.random() * colors.length)]};\n animation-delay: ${Math.random() * 2}s;\n animation-duration: ${2 + Math.random() * 2}s;\n \"\n ></div>\n `)}\n </div>\n `;\n }\n\n private renderSuccessState() {\n const displayAmount = this.currentAmount || this.amount;\n const fiatLabel = (this.currentFiatCode ?? this.currentFiatSymbol) || 'USD';\n\n debugLog(this.debug, 'ICPay Progress: Rendering success state with:', {\n displayAmount,\n currentAmount: this.currentAmount,\n amount: this.amount,\n currentCurrency: this.currentCurrency,\n currency: this.currency,\n currentLedgerSymbol: this.currentLedgerSymbol,\n ledgerSymbol: this.ledgerSymbol,\n fiatLabel: fiatLabel\n });\n\n return html`\n <div class=\"success-center\">\n <div class=\"success-container\">\n <div class=\"success-icon\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h2 class=\"success-title\">Payment Complete!</h2>\n <p class=\"success-message\">Your payment of ${displayAmount} ${fiatLabel} has been successfully processed.</p>\n <div class=\"success-actions\">\n <button class=\"btn btn-primary\" @click=${() => { this.open = false; }}>Close</button>\n </div>\n </div>\n </div>\n `;\n }\n\n private renderErrorState() {\n const isInsufficientFunds = this.errorMessage?.includes('Insufficient balance') || false;\n\n if (isInsufficientFunds) {\n return this.renderInsufficientFundsError();\n }\n\n return this.renderGenericError();\n }\n\n private renderInsufficientFundsError() {\n const displayAmount = this.currentAmount || this.amount;\n\n return html`\n <div class=\"insufficient-funds-container\">\n <div class=\"payment-summary\">\n <div class=\"payment-amount\">Pay $${displayAmount} with crypto</div>\n </div>\n\n <div class=\"error-notification\">\n <div class=\"error-content\">\n <div class=\"error-icon-small\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L4.268 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n </div>\n <div class=\"error-text\">Insufficient balance for this transaction</div>\n </div>\n </div>\n\n <div class=\"error-actions\">\n <button class=\"btn btn-secondary\" @click=${() => this.requestSwitchAccount()} title=\"Switch to a different account\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" style=\"width: 16px; height: 16px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n Switch Account\n </button>\n <button class=\"btn btn-primary\" @click=${() => { this.open = false; }}>\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" style=\"width: 16px; height: 16px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Close\n </button>\n </div>\n </div>\n `;\n }\n\n private renderGenericError() {\n return html`\n <div class=\"error-container\">\n <div class=\"error-icon-large\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n <h2 class=\"error-title\">Transaction Failed</h2>\n <p class=\"error-message-text\">${this.errorMessage}</p>\n <div class=\"error-actions\">\n <button class=\"btn btn-secondary\" @click=${() => this.requestSwitchAccount()} title=\"Switch to a different account\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" style=\"width: 16px; height: 16px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n Switch Account\n </button>\n <button class=\"btn btn-primary\" @click=${() => { this.open = false; }}>\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" style=\"width: 16px; height: 16px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Close\n </button>\n </div>\n </div>\n `;\n }\n\n private requestSwitchAccount() {\n try {\n // Close the progress modal so the wallet selector can be used\n this.open = false;\n const walletType = this.currentWalletType || 'unknown';\n window.dispatchEvent(new CustomEvent('icpay-switch-account', { detail: { walletType } } as any));\n } catch {}\n }\n\n private handleAddFunds() {\n try {\n // Dispatch add funds event for external handling\n window.dispatchEvent(new CustomEvent('icpay-add-funds', {\n detail: {\n amount: this.currentAmount || this.amount,\n currency: this.currentLedgerSymbol || this.currentCurrency || this.currency\n }\n }));\n\n // Close the modal to allow external handling\n this.open = false;\n } catch (error) {\n console.error('Error handling add funds:', error);\n }\n }\n\n private startTransitionToProgress() {\n this.isTransitioning = true;\n this.requestUpdate();\n\n // After transition animation completes, switch to progress view\n setTimeout(() => {\n this.showWalletSelector = false;\n this.isTransitioning = false;\n this.requestUpdate();\n }, 400);\n }\n\n private renderProgressContent() {\n if (this.showSuccess) {\n return this.renderSuccessState();\n }\n\n if (this.failed) {\n return this.renderErrorState();\n }\n\n return html`\n <div class=\"progress-container\">\n <div class=\"progress-header\">\n <span class=\"progress-spacer\"></span>\n <h3 class=\"progress-title\">Processing</h3>\n </div>\n ${this.renderConfirmTip()}\n <div class=\"progress-steps\">\n ${this.currentSteps.map((step, index) => html`\n <div class=\"step ${index === this.activeIndex ? 'active' : ''} ${step.status === 'completed' ? 'completed' : ''} ${step.status === 'error' ? 'error' : ''}\">\n <div class=\"step-icon\">\n ${this.getStepIcon(step)}\n </div>\n <div class=\"step-content\">\n <div class=\"step-title\">${step.label}</div>\n <div class=\"step-description\">${step.tooltip}</div>\n ${step.status === 'error' && step.errorMessage ? html`\n <div class=\"step-error-message\">${step.errorMessage}</div>\n ` : ''}\n </div>\n </div>\n `)}\n </div>\n </div>\n `;\n }\n\n private onWalletCancelled = (e: any) => {\n try {\n // Check if any step beyond wallet connection has started (indicating actual payment transaction started)\n // If only wallet step is active, it means user cancelled before connecting, so close the modal\n const walletIdx = this.getStepIndexByKey('wallet');\n const awaitIdx = this.getStepIndexByKey('await');\n const transferIdx = this.getStepIndexByKey('transfer');\n const verifyIdx = this.getStepIndexByKey('verify');\n\n // Check if any step after wallet (await, transfer, or verify) has progressed beyond pending\n const hasPaymentStarted = this.currentSteps && this.currentSteps.length > 0 &&\n this.currentSteps.some((step, idx) => {\n // Check if any step after wallet is loading or completed\n if (walletIdx >= 0 && idx > walletIdx) {\n return step.status === 'loading' || step.status === 'completed';\n }\n return false;\n });\n\n // Also check if wallet step itself has completed (meaning wallet was connected)\n const walletStep = walletIdx >= 0 ? this.currentSteps[walletIdx] : null;\n const walletWasConnected = walletStep?.status === 'completed';\n\n // If no payment transaction has started AND wallet wasn't connected, close the modal\n if (!hasPaymentStarted && !walletWasConnected) {\n this.open = false;\n // Reset to initial state\n this.activeIndex = 0;\n this.currentSteps = this.currentSteps.map(step => ({ ...step, status: 'pending' as StepStatus }));\n this.requestUpdate();\n return;\n }\n\n // Payment transaction has started OR wallet was connected, so show error state\n // Ensure the progress modal is visible if it was initiated\n this.open = true;\n // Mark the wallet step as error with cancelled tooltip\n if (walletIdx >= 0) {\n this.activeIndex = walletIdx;\n // Update tooltip and status\n this.currentSteps[walletIdx] = {\n ...this.currentSteps[walletIdx],\n tooltip: 'Wallet connection cancelled',\n status: 'error'\n } as Step;\n this.requestUpdate();\n }\n } catch {}\n };\n\n private onWalletError = (e: any) => {\n try {\n const rawMessage = e?.detail?.message || 'Wallet error';\n const errorMessage = this.transformErrorMessage(rawMessage);\n this.open = true;\n const idx = this.getStepIndexByKey('wallet');\n if (idx >= 0) {\n this.activeIndex = idx;\n // Update step to error with friendly tooltip and message\n this.currentSteps[idx] = {\n ...this.currentSteps[idx],\n tooltip: 'Wallet connection failed',\n status: 'error',\n errorMessage\n } as Step;\n this.requestUpdate();\n }\n } catch {}\n };\n\n private renderConfirmTip() {\n try {\n const verifyIdx = this.getStepIndexByKey('verify');\n if (verifyIdx < 0) return null as any;\n const isVerifyLoading = this.activeIndex === verifyIdx && this.currentSteps[verifyIdx]?.status === 'loading';\n if (!isVerifyLoading) return null as any;\n const started = this.confirmLoadingStartedAt || 0;\n const elapsed = started ? (Date.now() - started) : 0;\n if (elapsed < 30000) return null as any;\n return html`<p class=\"progress-subtitle\" style=\"margin-top:8px;color:#60a5fa\">Verification can take from 30 seconds up to 10 minutes depending on the amount. Please wait…</p>`;\n } catch {\n return null as any;\n }\n }\n\n private retryTransaction() {\n // Reset state but preserve dynamic values\n this.activeIndex = 0;\n this.completed = false;\n this.failed = false;\n this.errorMessage = null;\n this.showSuccess = false;\n this.showConfetti = false;\n\n // Preserve dynamic values from the current transaction\n // Don't reset currentAmount, currentCurrency, currentLedgerSymbol\n\n // Reset all steps to pending\n this.currentSteps = this.currentSteps.map(step => ({ ...step, status: 'pending' as StepStatus }));\n\n // Update first step to loading\n this.updateStepStatus(0, 'loading');\n\n // Start automatic progression again\n this.startAutomaticProgression();\n\n this.requestUpdate();\n }\n\n private closeProgress() {\n this.open = false;\n this.showWalletSelector = false;\n this.isTransitioning = false;\n }\n\n private renderStep(step: Step, index: number) {\n return html`\n <div class=\"step-item ${step.status}\">\n <div class=\"step-icon\">\n ${this.getStepIcon(step)}\n </div>\n <div class=\"step-content\">\n <div class=\"step-title\">\n ${step.status === 'completed' ? 'COMPLETED' : step.label}\n </div>\n ${step.status === 'completed' ? html`\n <div class=\"step-subtitle\">\n ${step.timestamp} - ${step.tooltip}\n </div>\n ` : step.status === 'error' && step.errorMessage ? html`\n <div class=\"step-error\">${step.errorMessage}</div>\n ` : html`\n <div class=\"step-subtitle\">${step.tooltip}</div>\n `}\n </div>\n </div>\n `;\n }\n\n private get isWalletConnectLoading(): boolean {\n try {\n const idx = this.currentSteps.findIndex(s => (s as any).key === 'wallet');\n if (idx < 0) return false;\n return this.currentSteps[idx].status === 'loading' && !this.failed && !this.showSuccess;\n } catch {\n return false;\n }\n }\n\n render() {\n if (this.suspended) {\n return null as any;\n }\n return html`\n ${this.open ? html`\n ${this.renderConfetti()}\n <div class=\"modal-overlay active\">\n <div class=\"modal-container\">\n ${!this.showSuccess ? html`<button class=\"close-button\" @click=${() => this.closeProgress()} aria-label=\"Close\" title=\"Close\">✕</button>` : null}\n <div class=\"modal-content ${this.isTransitioning ? 'transitioning' : ''}\">\n ${this.renderProgressContent()}\n </div>\n </div>\n </div>\n ` : null}\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-progress-bar': ICPayProgressBar } }\n\n\n\n","import { IcpayError } from '@ic-pay/icpay-sdk';\n\n// Define error codes locally to avoid SSR issues\nconst ERROR_CODES = {\n WALLET_NOT_CONNECTED: 'WALLET_NOT_CONNECTED',\n WALLET_USER_CANCELLED: 'WALLET_USER_CANCELLED',\n WALLET_SIGNATURE_REJECTED: 'WALLET_SIGNATURE_REJECTED',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n NETWORK_ERROR: 'NETWORK_ERROR',\n API_ERROR: 'API_ERROR',\n LEDGER_NOT_FOUND: 'LEDGER_NOT_FOUND',\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n TRANSACTION_TIMEOUT: 'TRANSACTION_TIMEOUT',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR'\n} as const;\n\n// Widget-specific error handling utilities\nexport interface WidgetErrorHandler {\n onError: (error: IcpayError) => void;\n onUserCancelled?: () => void;\n onInsufficientBalance?: (error: IcpayError) => void;\n onWalletError?: (error: IcpayError) => void;\n onNetworkError?: (error: IcpayError) => void;\n}\n\n// Default error handler that logs errors to console\nexport const defaultErrorHandler: WidgetErrorHandler = {\n onError: (error: IcpayError) => {\n console.error('[ICPay Widget] Error:', error);\n },\n onUserCancelled: () => {\n console.log('[ICPay Widget] User cancelled the action');\n },\n onInsufficientBalance: (error: IcpayError) => {\n console.warn('[ICPay Widget] Insufficient balance:', error.message);\n },\n onWalletError: (error: IcpayError) => {\n console.warn('[ICPay Widget] Wallet error:', error.message);\n },\n onNetworkError: (error: IcpayError) => {\n console.error('[ICPay Widget] Network error:', error.message);\n }\n};\n\n// Error handling function for widget components\nexport function handleWidgetError(error: unknown, errorHandler: WidgetErrorHandler = defaultErrorHandler): void {\n if (error instanceof IcpayError) {\n // Call the general error handler\n errorHandler.onError(error);\n\n // Call specific handlers based on error type\n if (error.isUserCancelled()) {\n errorHandler.onUserCancelled?.();\n } else if (error.isBalanceError()) {\n errorHandler.onInsufficientBalance?.(error);\n } else if (error.isWalletError()) {\n errorHandler.onWalletError?.(error);\n } else if (error.isNetworkError()) {\n errorHandler.onNetworkError?.(error);\n }\n } else {\n // Handle non-IcpayError errors\n console.error('[ICPay Widget] Unknown error:', error);\n errorHandler.onError(new IcpayError({\n code: ERROR_CODES.UNKNOWN_ERROR,\n message: error instanceof Error ? error.message : 'An unknown error occurred',\n details: error\n }));\n }\n}\n\n// Error message templates for common scenarios\nexport const ERROR_MESSAGES = {\n [ERROR_CODES.WALLET_NOT_CONNECTED]: 'Please connect your wallet to continue',\n [ERROR_CODES.WALLET_USER_CANCELLED]: 'User have rejected the transfer',\n [ERROR_CODES.WALLET_SIGNATURE_REJECTED]: 'User have rejected the transfer',\n [ERROR_CODES.INSUFFICIENT_BALANCE]: 'Insufficient balance for this transaction',\n [ERROR_CODES.NETWORK_ERROR]: 'Network error. Please try again',\n [ERROR_CODES.API_ERROR]: 'Service temporarily unavailable',\n [ERROR_CODES.LEDGER_NOT_FOUND]: 'Selected token is not supported',\n [ERROR_CODES.TRANSACTION_FAILED]: 'Transaction failed. Please try again',\n [ERROR_CODES.TRANSACTION_TIMEOUT]: 'Transaction timed out. Please try again',\n [ERROR_CODES.UNKNOWN_ERROR]: 'Something went wrong. Please try again'\n} as const;\n\n// Get user-friendly error message\nexport function getErrorMessage(error: IcpayError): string {\n // Prefer server-provided structured messages if present\n const details: any = (error as any)?.details || {};\n const apiMsg: string | undefined = typeof details?.data?.message === 'string' ? details.data.message : undefined;\n const directMsg: string | undefined = typeof details?.message === 'string' ? details.message : undefined;\n const serverMsg: string | undefined = apiMsg || directMsg;\n if (serverMsg && serverMsg.length > 0) {\n // Normalize common prefixes to friendlier text\n if (serverMsg.startsWith('missing_required_fields:')) {\n const tail = serverMsg.split(':')[1] || '';\n const fields = tail.split(',').map(s => s.trim()).filter(Boolean);\n if (fields.length) {\n return `Missing required: ${fields.join(', ')}`;\n }\n return 'Missing required fields';\n }\n // Also handle \"Missing required fields: a, b\" shape\n const m = serverMsg.match(/^Missing required fields:\\s*(.+)$/i);\n if (m && m[1]) {\n const fields = m[1].split(',').map(s => s.trim()).filter(Boolean);\n if (fields.length) {\n return `Missing required: ${fields.join(', ')}`;\n }\n return 'Missing required fields';\n }\n return serverMsg;\n }\n return (ERROR_MESSAGES as Record<string, string>)[error.code] || error.message || 'An error occurred';\n}\n\n// Check if error should be shown to user (vs logged only)\nexport function shouldShowErrorToUser(error: IcpayError): boolean {\n // Don't show user-cancelled actions as errors\n if (error.isUserCancelled()) {\n return false;\n }\n\n // Show all other errors to user\n return true;\n}\n\n// Get appropriate UI action for error\nexport function getErrorAction(error: IcpayError): string | null {\n // Disable for now\n return null;\n /*\n if (error.userAction) {\n return error.userAction;\n }\n\n switch (error.code) {\n case ERROR_CODES.WALLET_NOT_CONNECTED:\n return 'Connect Wallet';\n case ERROR_CODES.INSUFFICIENT_BALANCE:\n return 'Add Funds';\n case ERROR_CODES.NETWORK_ERROR:\n case ERROR_CODES.API_ERROR:\n return 'Try Again';\n default:\n return null;\n }\n */\n}\n\n// Error severity levels for UI styling\nexport enum ErrorSeverity {\n INFO = 'info',\n WARNING = 'warning',\n ERROR = 'error'\n}\n\nexport function getErrorSeverity(error: IcpayError): ErrorSeverity {\n if (error.isUserCancelled()) {\n return ErrorSeverity.INFO;\n }\n\n if (error.isBalanceError() || error.isWalletError()) {\n return ErrorSeverity.WARNING;\n }\n\n return ErrorSeverity.ERROR;\n}\n","import { html, TemplateResult } from 'lit';\n\n// Helper to detect current theme mode\nfunction getThemeMode(themeOverride?: 'light' | 'dark'): 'light' | 'dark' {\n // If theme is explicitly provided, use it\n if (themeOverride === 'light' || themeOverride === 'dark') return themeOverride;\n \n if (typeof document === 'undefined') return 'light';\n // Check for ICPay-specific theme attribute first\n const icpayTheme = document.documentElement.getAttribute('data-icpay-theme');\n if (icpayTheme === 'light' || icpayTheme === 'dark') return icpayTheme;\n // Fallback to generic data-theme\n const theme = document.documentElement.getAttribute('data-theme');\n if (theme === 'light' || theme === 'dark') return theme;\n // Default to light\n return 'light';\n}\n\nexport type OnrampModalOptions = {\n\tvisible: boolean;\n\turl?: string | null;\n\terrorMessage?: string | null;\n\twidth?: number | string;\n\theight?: number | string;\n\tonClose: () => void;\n\tonBack?: () => void;\n\ttitle?: string;\n\ttheme?: 'light' | 'dark'; // Theme mode from widget config\n};\n\nexport function renderOnrampModal(opts: OnrampModalOptions): TemplateResult | null {\n\tif (!opts.visible) return null as any;\n\tconst width = opts.width ?? 420;\n\tconst height = opts.height ?? 680;\n\tconst hasUrl = typeof opts.url === 'string' && (opts.url || '').startsWith('http');\n\tconst themeMode = getThemeMode(opts.theme);\n\treturn html`\n\t\t<style>\n\t\t\t/* Theme-aware color variables - Light mode defaults */\n\t\t\t.icpay-onramp-modal-overlay {\n\t\t\t\t--icpay-background: #ffffff;\n\t\t\t\t--icpay-foreground: #171717;\n\t\t\t\t--icpay-muted-foreground: #6b7280;\n\t\t\t\t--icpay-primary: #3b82f6;\n\t\t\t\t--icpay-primary-foreground: #ffffff;\n\t\t\t\t--icpay-secondary: #f3f4f6;\n\t\t\t\t--icpay-secondary-foreground: #171717;\n\t\t\t\t--icpay-accent: #f9fafb;\n\t\t\t\t--icpay-border: #e5e7eb;\n\t\t\t}\n\t\t\t/* Dark mode */\n\t\t\t[data-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\t[data-icpay-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\t:root[data-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\t:root[data-icpay-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\thtml[data-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\thtml[data-icpay-theme=\"dark\"] .icpay-onramp-modal-overlay,\n\t\t\t.icpay-onramp-modal-overlay[data-theme=\"dark\"] {\n\t\t\t\t--icpay-background: hsl(222.2 84% 4.9%);\n\t\t\t\t--icpay-foreground: hsl(210 40% 98%);\n\t\t\t\t--icpay-muted-foreground: hsl(215 20.2% 65.1%);\n\t\t\t\t--icpay-primary: hsl(210 40% 98%);\n\t\t\t\t--icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n\t\t\t\t--icpay-secondary: hsl(217.2 32.6% 17.5%);\n\t\t\t\t--icpay-secondary-foreground: hsl(210 40% 98%);\n\t\t\t\t--icpay-accent: hsl(217.2 32.6% 17.5%);\n\t\t\t\t--icpay-border: hsl(217.2 32.6% 30%);\n\t\t\t}\n\t\t\t.icpay-onramp-modal-overlay {\n\t\t\t\tposition: fixed !important;\n\t\t\t\tinset: 0 !important;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: rgba(0,0,0,0.85);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\tz-index: 99999 !important;\n\t\t\t\t/* Ensure modal breaks out of any parent constraints */\n\t\t\t\ttransform: none !important;\n\t\t\t\twill-change: auto;\n\t\t\t\tisolation: isolate;\n\t\t\t}\n\t\t\t.icpay-onramp-modal-container {\n\t\t\t\tposition: relative;\n\t\t\t\tbackground: var(--icpay-background);\n\t\t\t\tborder: 1px solid var(--icpay-border);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbox-shadow: 0 20px 60px rgba(0,0,0,0.5);\n\t\t\t\tmargin: auto;\n\t\t\t\tmax-width: 90vw;\n\t\t\t}\n\t\t\t@media (max-width: 768px) {\n\t\t\t\t.icpay-onramp-modal-overlay {\n\t\t\t\t\talign-items: flex-end;\n\t\t\t\t\tjustify-content: stretch;\n\t\t\t\t}\n\t\t\t\t.icpay-onramp-modal-container {\n\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 70vh;\n\t\t\t\t\tmax-height: 70vh;\n\t\t\t\t\tborder-radius: 16px 16px 0 0;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\toverflow-y: auto;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t\t<div class=\"icpay-onramp-modal-overlay\" data-theme=\"${themeMode}\">\n\t\t\t<div class=\"icpay-onramp-modal-container\">\n\t\t\t\t<button @click=${opts.onClose} style=\"position:absolute;right:12px;top:12px;background:transparent;border:none;color:var(--icpay-foreground);cursor:pointer;font-size:20px;opacity:0.8;z-index:10\">×</button>\n\t\t\t\t${opts.onBack ? html`<button @click=${opts.onBack} style=\"position:absolute;left:12px;top:12px;background:transparent;border:1px solid var(--icpay-border);color:var(--icpay-foreground);cursor:pointer;font-size:12px;border-radius:8px;padding:6px 10px;opacity:0.9;z-index:10\">Back</button>` : null}\n\t\t\t\t<div style=\"color:var(--icpay-foreground);font-weight:600;font-size:15px;margin-bottom:12px\">${opts.title || 'Complete purchase'}</div>\n\t\t\t\t${hasUrl ? html`\n\t\t\t\t\t<iframe\n\t\t\t\t\t\ttitle=\"Onramp\"\n\t\t\t\t\t\tsrc=\"${opts.url}\"\n\t\t\t\t\t\tstyle=\"border:0;width:${typeof width === 'number' ? `${width}px` : width};height:${typeof height === 'number' ? `${height}px` : height};border-radius:12px;background:#000\"\n\t\t\t\t\t\tsandbox=\"allow-forms allow-same-origin allow-scripts allow-popups allow-top-navigation-by-user-activation\"\n\t\t\t\t\t\tallow=\"payment *\"\n\t\t\t\t\t></iframe>\n\t\t\t\t\t<div style=\"margin-top:10px;text-align:right\">\n\t\t\t\t\t\t<a href=\"${opts.url}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color:var(--icpay-primary);font-size:12px;text-decoration:underline\">Open in a new tab</a>\n\t\t\t\t\t</div>\n\t\t\t\t` : html`\n\t\t\t\t\t<div style=\"width:${typeof width === 'number' ? `${width}px` : width};height:${typeof height === 'number' ? `${height}px` : height};display:flex;align-items:center;justify-content:center;background:var(--icpay-secondary);border:1px dashed var(--icpay-border);border-radius:12px;color:var(--icpay-foreground)\">\n\t\t\t\t\t\t${opts.errorMessage || 'Onramp URL not available'}\n\t\t\t\t\t</div>\n\t\t\t\t`}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { PremiumContentConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\nimport { getWalletBalanceEntries, buildWalletEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport type { WalletBalanceEntry } from '../utils/balances';\nimport { shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { resetPaymentFlow as resetPaymentFlowUtil } from '../utils/payment-flow-reset';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet WalletSelect: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-premium-content')\nexport class ICPayPremiumContent extends LitElement {\n static styles = [baseStyles, css`\n .image-container {\n position: relative;\n border-radius: 16px;\n overflow: hidden;\n margin-bottom: 16px;\n background: #111827;\n border: 1px solid var(--icpay-border);\n aspect-ratio: 16/10;\n }\n .locked-image {\n width: 100%;\n height: 100%;\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n filter: blur(8px) grayscale(1);\n transition: all 0.6s ease;\n min-height: 200px;\n }\n .locked-image.unlocked { filter: blur(0px) grayscale(1); }\n .lock-overlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }\n .pricing { text-align: center; margin: 16px 0; }\n .price { font-size: 28px; font-weight: 800; color: var(--icpay-text); }\n .label { color: var(--icpay-muted); font-size: 14px; }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: var(--icpay-processing-bg);\n border-color: var(--icpay-processing-border);\n color: var(--icpay-processing-text);\n }\n\n .error-message.warning {\n background: var(--icpay-warning-bg);\n border-color: var(--icpay-warning-border);\n color: var(--icpay-warning-text);\n }\n\n .error-message.error {\n background: var(--icpay-error-bg);\n border-color: var(--icpay-error-border);\n color: var(--icpay-error-text);\n }\n `];\n\n @property({ type: Object }) config!: PremiumContentConfig;\n @state() private selectedSymbol: string | null = null;\n @state() private unlocked = false;\n @state() private succeeded = false;\n @state() private processing = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n // Post-connect token selection\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: WalletBalanceEntry[] = [];\n private sdk: WidgetSdk | null = null;\n private onTransactionCompleted: EventListener | null = null;\n private onUnlock: EventListener | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new WalletSelect(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Premium content connected', { config: this.config });\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close wallet/balance modals when SDK intent is created\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.showBalanceModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n // Unlock content when transaction completes\n this.onTransactionCompleted = (() => {\n this.unlocked = true;\n this.succeeded = true;\n this.processing = false;\n // Dispatch unlock event for external listeners\n try { window.dispatchEvent(new CustomEvent('icpay-unlock', { detail: { amount: this.config?.priceUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n this.requestUpdate();\n }) as EventListener;\n try {\n window.addEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted);\n } catch {}\n // Also listen for unlock event (in case it's dispatched elsewhere)\n this.onUnlock = (() => {\n this.unlocked = true;\n this.succeeded = true;\n this.processing = false;\n this.requestUpdate();\n }) as EventListener;\n try {\n window.addEventListener('icpay-unlock', this.onUnlock);\n } catch {}\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n try { window.removeEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (this.onTransactionCompleted) {\n try { window.removeEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted); } catch {}\n }\n if (this.onUnlock) {\n try { window.removeEventListener('icpay-unlock', this.onUnlock); } catch {}\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'pay') this.onPay(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n this.requestUpdate();\n try {\n const amount = Number(this.config?.priceUsd || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this, { pendingAction: 'pay' });\n }\n\n private async onPay() {\n if (!isBrowser) return;\n if (this.unlocked) return;\n\n this.resetPaymentFlow();\n\n debugLog(this.config?.debug || false, 'Premium content payment started', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.config.priceUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _cfg2: any = wantsOisyTab ? applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) }) : ({ ...(this.config?.plugNPlay || {}) });\n if ((this.config as any)?.chainTypes) _cfg2.chainTypes = (this.config as any).chainTypes;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg2);\n try {\n const principal = await detectOisySessionViaAdapter(this.pnp);\n if (principal) {\n this.walletConnected = true;\n const normalized = normalizeConnectedWallet(this.pnp, { owner: principal, principal, connected: true });\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n // Proceed directly\n this.onPay();\n return;\n }\n } catch {}\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected; proceed to token selection to initiate payment via selection handler\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n await this.fetchAndShowBalances('pay');\n return;\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const resp = await (sdk as any).startOnrampUsd(this.config.priceUsd, undefined, { context: 'premium:onramp', onrampPayment: true, onrampProvider: 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n this.onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n this.onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private select(symbol: string) {\n this.selectedSymbol = symbol;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances('pay');\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances(action: 'pay') {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({ sdk, lastWalletId: this.lastWalletId, connectedWallet: (this.config as any)?.connectedWallet, amountUsd: Number(this.config?.priceUsd ?? 0), fiatCurrency: (this.config as any)?.fiat_currency });\n this.walletBalances = balances as WalletBalanceEntry[];\n this.pendingAction = action;\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel0 = (this.walletBalances || []).find(b => (b as any)?.tokenShortcode === shortcode);\n if (sel0?.ledgerSymbol) this.selectedSymbol = sel0.ledgerSymbol;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find(b => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n // Close modals immediately on selection to reveal progress UI\n this.showBalanceModal = false;\n this.showWalletModal = false;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.config?.priceUsd ?? 0);\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'premium:x402'\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // Surface x402 error but allow fallback\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n });\n return;\n }\n this.showBalanceModal = false;\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') {\n // IC/SOL flow: prefer x402 for Solana tokens when available, otherwise fallback to normal flow\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.config?.priceUsd ?? 0);\n const chainName = String((sel as any)?.chainName || (sel as any)?.ledgerName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n const isIc = chainName.includes('ic');\n if ((sel as any)?.x402Accepts) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: isSol ? 'sol' : (isIc ? 'ic' : (this.config as any)?.icpay_network),\n icpay_ledger_id: (sel as any)?.ledgerId,\n icpay_context: 'premium:x402'\n }\n },\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // No fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: (sel as any)?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"image-container\">\n <div class=\"locked-image ${this.unlocked ? 'unlocked' : ''}\" style=\"background-image:url('${this.config.imageUrl || ''}')\"></div>\n ${this.unlocked ? null : html`<div class=\"lock-overlay\">🔒</div>`}\n </div>\n\n <div class=\"pricing\">\n <div class=\"price\">$${Number(this.config?.priceUsd ?? 0).toFixed(2)}</div>\n <div class=\"label\">One-time unlock</div>\n </div>\n\n\n\n <button class=\"pay-button ${this.processing ? 'processing' : ''}\" ?disabled=${this.processing || this.unlocked || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)} @click=${() => this.onPay()}>\n ${this.unlocked ? 'Unlocked' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Pay with crypto')\n .replace('{amount}', `${Number(this.config?.priceUsd ?? 0).toFixed(2)}`)\n .replace('{symbol}', (this.selectedSymbol || 'ICP'))\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = buildWalletEntries(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? (this.walletBalances as any) : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSwitchAccount: () => this.onSwitchAccount(null),\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.config?.priceUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.onPay(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: this.onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-premium-content': ICPayPremiumContent } }\n\n\n","import { html, TemplateResult } from 'lit';\nimport type { WalletBalanceEntry } from '../../utils/balances';\nimport { isEvmWalletId } from '../../utils/balances';\nimport { formatTokenAmountThirdwebStyle } from '../../utils/format';\nimport { renderPayWithStyles, renderPayWithContent } from './shared/pay-with';\n\n// Helper to detect current theme mode\nfunction getThemeMode(themeOverride?: 'light' | 'dark'): 'light' | 'dark' {\n // If theme is explicitly provided, use it\n if (themeOverride === 'light' || themeOverride === 'dark') return themeOverride;\n \n if (typeof document === 'undefined') return 'light';\n // Check for ICPay-specific theme attribute first\n const icpayTheme = document.documentElement.getAttribute('data-icpay-theme');\n if (icpayTheme === 'light' || icpayTheme === 'dark') return icpayTheme;\n // Fallback to generic data-theme\n const theme = document.documentElement.getAttribute('data-theme');\n if (theme === 'light' || theme === 'dark') return theme;\n // Default to light mode to match progress bar\n return 'light';\n}\n\n// Embedded icon for NFID provider (data URL)\n\nfunction sanitizeDataUrl(url: string): string {\n if (!url) return url;\n if (!url.startsWith('data:')) return url;\n // Remove any whitespace that might have slipped in (spaces, newlines, tabs)\n return url.replace(/\\s+/g, '');\n}\n\nfunction getWalletFriendlyName(id: string, fallback?: string): string {\n const lower = (id || '').toLowerCase();\n if (lower === 'ii') return 'Internet Identity';\n if (lower === 'nfid') return 'NFID';\n if (lower === 'plug') return 'Plug';\n if (lower === 'oisy') return 'Oisy';\n if (fallback && fallback.trim()) return fallback;\n return id ? id.charAt(0).toUpperCase() + id.slice(1) : 'Wallet';\n}\n\nexport type WalletEntry = { id: string; label: string; icon?: string | null };\n\ntype Options = {\n visible: boolean;\n wallets: WalletEntry[];\n isConnecting?: boolean;\n onSelect: (walletId: string) => void;\n onClose: () => void;\n onDismiss?: () => void; // Called when clicking outside (doesn't trigger cancellation events)\n onSwitchAccount?: () => void;\n // Optional onramp (credit card) entry at the end\n onCreditCard?: () => void;\n creditCardLabel?: string;\n showCreditCard?: boolean;\n creditCardTooltip?: string | null;\n // Two-step support: balances step after connect\n step?: 'connect' | 'balances';\n balances?: WalletBalanceEntry[];\n balancesLoading?: boolean;\n balancesError?: string | null;\n onSelectBalance?: (symbol: string) => void;\n onBack?: () => void;\n theme?: 'light' | 'dark'; // Theme mode from widget config\n};\n\nexport function renderWalletSelectorModal(opts: Options & { oisyReadyToPay?: boolean; onOisyPay?: () => void }): TemplateResult | null {\n if (!opts.visible) return null as any;\n const { wallets, onSelect, onClose, isConnecting } = opts;\n const formatTokenAmount = (val: string | number): string => formatTokenAmountThirdwebStyle(val);\n const toUsd = (b: WalletBalanceEntry): number => {\n const amt = parseFloat(String(b.formattedBalance || '0'));\n const price = Number((b as any).currentPrice ?? 0);\n const usd = (isFinite(amt) ? amt : 0) * (isFinite(price) ? price : 0);\n return isFinite(usd) ? usd : 0;\n };\n const byUsdDesc = (a: WalletBalanceEntry, b: WalletBalanceEntry) => toUsd(b) - toUsd(a);\n const normalizedWallets = wallets.map(w => {\n const id = (w.id || '').toLowerCase();\n return {\n ...w,\n // Force NFID to use embedded icon; others keep provided icon\n icon: w.icon ?? null,\n };\n });\n const themeMode = getThemeMode(opts.theme);\n const handleOverlayClick = (e: MouseEvent) => {\n // Only close if clicking directly on the overlay, not on the modal content\n if (e.target === e.currentTarget) {\n e.preventDefault();\n e.stopPropagation();\n // Always use onDismiss if provided (doesn't trigger cancellation events)\n // This prevents the progress modal from opening when clicking outside\n if (opts.onDismiss) {\n opts.onDismiss();\n } else {\n // Fall back to onClose only if onDismiss is not provided\n opts.onClose();\n }\n }\n };\n return html`\n <div class=\"icpay-modal-overlay\" data-theme=\"${themeMode}\" @click=${handleOverlayClick} style=\"position:fixed !important;inset:0 !important;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.5);z-index:99999 !important;transform:none !important;\">\n <style>\n .icpay-w-8 { width: 2rem; }\n .icpay-h-8 { height: 2rem; }\n /* Theme-aware color variables - Light mode defaults */\n .icpay-modal-overlay {\n --icpay-background: #ffffff;\n --icpay-foreground: #171717;\n --icpay-muted-foreground: #6b7280;\n --icpay-primary: #3b82f6;\n --icpay-primary-foreground: #ffffff;\n --icpay-secondary: #f3f4f6;\n --icpay-secondary-foreground: #171717;\n --icpay-accent: #f9fafb;\n --icpay-border: #e5e7eb;\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #059669;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #d97706;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #dc2626;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #2563eb;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n }\n /* Dark mode - check for data-theme on any ancestor or document */\n [data-theme=\"dark\"] .icpay-modal-overlay,\n [data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n :root[data-theme=\"dark\"] .icpay-modal-overlay,\n :root[data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n html[data-theme=\"dark\"] .icpay-modal-overlay,\n html[data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n .icpay-modal-overlay[data-theme=\"dark\"] {\n --icpay-background: hsl(222.2 84% 4.9%);\n --icpay-foreground: hsl(210 40% 98%);\n --icpay-muted-foreground: hsl(215 20.2% 65.1%);\n --icpay-primary: hsl(210 40% 98%);\n --icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n --icpay-secondary: hsl(217.2 32.6% 17.5%);\n --icpay-secondary-foreground: hsl(210 40% 98%);\n --icpay-accent: hsl(217.2 32.6% 17.5%);\n --icpay-border: hsla(217.2 32.6% 30% / 0.15);\n --icpay-success-bg: rgba(16, 185, 129, 0.1);\n --icpay-success-text: #34d399;\n --icpay-success-border: rgba(16, 185, 129, 0.3);\n --icpay-warning-bg: rgba(245, 158, 11, 0.1);\n --icpay-warning-text: #fbbf24;\n --icpay-warning-border: rgba(245, 158, 11, 0.3);\n --icpay-error-bg: rgba(239, 68, 68, 0.1);\n --icpay-error-text: #f87171;\n --icpay-error-border: rgba(239, 68, 68, 0.3);\n --icpay-processing-bg: rgba(59, 130, 246, 0.1);\n --icpay-processing-text: #60a5fa;\n --icpay-processing-border: rgba(59, 130, 246, 0.3);\n }\n /* New design styles (scoped) */\n .icpay-modal-overlay {\n position: fixed !important;\n inset: 0 !important;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0,0,0,0.5);\n z-index: 99999 !important;\n /* Ensure modal breaks out of any parent constraints */\n transform: none !important;\n will-change: auto;\n isolation: isolate;\n }\n @media (max-width: 768px) {\n .icpay-modal-overlay {\n align-items: flex-end;\n justify-content: stretch;\n }\n }\n .modal { background-color:var(--icpay-background); border-radius:24px; width:100%; max-width:420px; padding:24px; color:var(--icpay-foreground); display:flex; flex-direction:column; border:1px solid var(--icpay-border); height:460px; margin:auto; transition:transform 0.3s ease; }\n @media (max-width: 768px) {\n .icpay-modal-overlay {\n align-items: flex-end;\n justify-content: stretch;\n padding: 0;\n }\n .modal { \n max-width:100%; \n width:100%; \n height:auto;\n max-height:50vh; \n border-radius:24px 24px 0 0; \n margin:0; \n padding:16px;\n transform:translateY(100%); \n overflow:hidden; \n display:flex; \n flex-direction:column;\n transition:transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);\n align-self: flex-end;\n }\n .icpay-modal-overlay:not([style*=\"display: none\"]) .modal { \n transform:translateY(0); \n }\n .wallet-list { \n overflow-y:auto; \n flex:1; \n min-height:0; \n max-height:calc(50vh - 120px); /* Account for header, footer, and padding */\n }\n }\n .header { display:flex; align-items:center; justify-content:center; margin-bottom:12px; padding-bottom:12px; border-bottom:1px solid var(--icpay-border); flex-shrink:0; position:relative; }\n .close-button { background:none; border:none; color:var(--icpay-foreground); font-size:20px; cursor:pointer; padding:4px; margin:0; line-height:1; opacity:0.7; transition:opacity 0.2s; position:absolute; right:0; }\n .close-button:hover { opacity:1; }\n .title { font-size:20px; font-weight:600; text-align:center; margin:0; }\n .wallet-list { display:flex; flex-direction:column; gap:0; overflow-y:auto; flex:1; padding-right:8px; padding-top:4px; scrollbar-gutter: stable; }\n .wallet-item { display:flex; align-items:center; padding:16px 12px; cursor:pointer; transition:background-color 0.2s; border-radius:12px; }\n .wallet-item:hover { background-color:var(--icpay-accent); }\n .wallet-icon { width:48px; height:48px; border-radius:12px; margin-right:16px; display:flex; align-items:center; justify-content:center; font-size:24px; overflow:hidden; }\n .oisy-icon { background-color:var(--icpay-primary); }\n .plug-icon { background:linear-gradient(135deg,#667eea 0%, #764ba2 100%); }\n .wallet-info { flex:1; }\n .wallet-name { font-size:16px; font-weight:500; margin-bottom:4px; }\n .wallet-status { font-size:14px; color:var(--icpay-muted-foreground); }\n .divider { height:0; border-top:1px solid var(--icpay-border); margin:8px 0; border-radius:1px; width:100%; }\n .footer { display:flex; justify-content:space-between; align-items:center; margin-top:16px; padding-top:16px; flex-shrink:0; }\n .need-wallet { font-size:14px; color:var(--icpay-muted-foreground); }\n .get-started { font-size:14px; color:var(--icpay-primary); background:none; border:none; cursor:pointer; font-weight:500; }\n .get-started:hover { text-decoration:underline; }\n </style>\n ${renderPayWithStyles()}\n <div class=\"modal\" @click=${(e: MouseEvent) => e.stopPropagation()}>\n ${opts.step === 'balances' ? html`\n ${renderPayWithContent({\n isLoading: !!opts.balancesLoading,\n error: opts.balancesError,\n balances: opts.balances,\n onBack: () => opts.onBack && opts.onBack(),\n onSelect: (symbol: string) => opts.onSelectBalance && opts.onSelectBalance(symbol)\n })}\n ` : html`\n <div class=\"header\">\n <h1 class=\"title\">Connect</h1>\n <button class=\"close-button\" @click=${() => { try { onClose(); } catch {} }} aria-label=\"Close\">×</button>\n </div>\n <div class=\"wallet-list\">\n ${opts.showCreditCard && opts.onCreditCard ? html`\n <div class=\"wallet-item\" style=\"border:1px solid var(--icpay-primary);background:var(--icpay-processing-bg)\" @click=${() => opts.onCreditCard && opts.onCreditCard()}>\n <div class=\"wallet-icon\">\n 💳\n </div>\n <div class=\"wallet-info\">\n <div class=\"wallet-name\">${opts.creditCardLabel || 'Pay with credit card'}</div>\n ${opts.creditCardTooltip ? html`<div class=\"wallet-status\">${opts.creditCardTooltip}</div>` : null}\n </div>\n </div>\n <div class=\"divider\"></div>\n ` : null}\n ${(() => {\n const items: TemplateResult[] = [];\n let lastGroup: 'sol' | 'evm' | 'ic' | null = null;\n normalizedWallets.forEach((w) => {\n const id = (w.id || '').toLowerCase();\n const displayName = getWalletFriendlyName(w.id, w.label);\n const isEvm = isEvmWalletId(id);\n const type: 'sol' | 'evm' | 'ic' = (id === 'phantom' || id === 'backpack') ? 'sol' : (isEvm ? 'evm' : 'ic');\n // Insert a divider whenever transitioning between wallet groups (sol -> evm -> ic)\n if (lastGroup !== null && type !== lastGroup) {\n items.push(html`<div class=\"divider\"></div>`);\n }\n const chainLabel =\n (id === 'oisy' || id === 'plug' || id === 'nfid' || id === 'ii')\n ? 'Internet Computer'\n : (id === 'phantom' || id === 'backpack'\n ? 'Solana'\n : (isEvm ? 'Ethereum-compatible' : ''));\n items.push(html`\n <div class=\"wallet-item\" style=\"opacity:${isConnecting?0.6:1}\" @click=${() => onSelect(w.id)}>\n <div class=\"wallet-icon\">\n ${w.icon\n ? html`<img src=\"${sanitizeDataUrl(w.icon)}\" alt=\"${displayName} logo\" class=\"icpay-w-8 icpay-h-8\" style=\"object-fit:contain\" />`\n : html`<span>${displayName.charAt(0)}</span>`}\n </div>\n <div class=\"wallet-info\">\n <div class=\"wallet-name\">${displayName}</div>\n ${chainLabel ? html`<div class=\"wallet-status\">${chainLabel}</div>` : null}\n </div>\n </div>\n `);\n lastGroup = type;\n });\n return items;\n })()}\n </div>\n <div class=\"footer\">\n <span class=\"need-wallet\">Need a wallet?</span>\n <button class=\"get-started\" @click=${() => { try { window.open('https://metamask.io/en-GB/download','_blank','noopener,noreferrer'); } catch {} }}>Get started</button>\n </div>\n `}\n </div>\n </div>\n `;\n}\n\n\n\n","export type WalletBalanceEntry = {\n ledgerId: string;\n ledgerName: string;\n ledgerSymbol: string;\n tokenShortcode?: string | null;\n canisterId: string;\n // Whether this ledger supports x402/EIP-3009 flow (if provided by API)\n eip3009Version?: string | null;\n x402Accepts?: boolean;\n balance: string;\n formattedBalance: string;\n decimals: number;\n currentPrice?: number;\n lastPriceUpdate?: Date;\n lastUpdated: Date;\n chainId?: string; // EVM chain id as string (e.g., '1', '137')\n chainName?: string;\n rpcUrlPublic?: string;\n chainUuid?: string; // UUID of chains table row\n requiredAmount?: string;\n requiredAmountFormatted?: string;\n hasSufficientBalance?: boolean;\n logoUrl?: string | null;\n};\n\nconst EVM_WALLET_IDS = new Set(['metamask', 'walletconnect', 'coinbase', 'brave', 'rainbow', 'rabby', 'okx', 'trust']);\nconst SOL_WALLET_IDS = new Set(['phantom', 'backpack']);\n\nexport function isEvmWalletId(walletId?: string | null): boolean {\n if (!walletId) return false;\n return EVM_WALLET_IDS.has(String(walletId).toLowerCase());\n}\n\nexport type WalletRaw = { id?: string; provider?: string; key?: string; label?: string; name?: string; title?: string; icon?: string; logo?: string; image?: string } & Record<string, any>;\nexport type WalletEntry = { id: string; label: string; icon?: string | null };\n\nexport function getWalletId(w: WalletRaw): string {\n return (w && (w.id || w.provider || w.key)) || '';\n}\n\nexport function getWalletLabel(w: WalletRaw): string {\n return (w && (w.label || w.name || w.title || w.id)) || 'Wallet';\n}\n\nexport function getWalletIcon(w: WalletRaw): string | null {\n return (w && (w.icon || w.logo || w.image)) || null;\n}\n\nexport function buildWalletEntries(raw: WalletRaw[]): WalletEntry[] {\n return (raw || []).map((w) => ({ id: getWalletId(w), label: getWalletLabel(w), icon: getWalletIcon(w) }));\n}\n\ndeclare global {\n interface Window { ethereum?: any }\n}\n\nexport async function ensureEvmChain(\n targetChainId?: number | string,\n opts?: { provider?: any; chainName?: string; rpcUrlPublic?: string; nativeSymbol?: string; decimals?: number }\n): Promise<boolean> {\n try {\n const provider: any = (opts as any)?.provider || (typeof window !== 'undefined' ? (window as any).ethereum : null);\n if (!provider || targetChainId === undefined || targetChainId === null) return true;\n const desiredDec = typeof targetChainId === 'number'\n ? targetChainId\n : (String(targetChainId).startsWith('0x') ? parseInt(String(targetChainId), 16) : parseInt(String(targetChainId), 10));\n if (!Number.isFinite(desiredDec)) return true;\n const currentHex: string = await provider.request({ method: 'eth_chainId' });\n const current = parseInt(currentHex, 16);\n if (current === desiredDec) return true;\n const hex = '0x' + desiredDec.toString(16);\n await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: hex }] });\n return true;\n } catch (e) {\n // Try addEthereumChain fallback using provided chain metadata\n try {\n const provider: any = (opts as any)?.provider || (typeof window !== 'undefined' ? (window as any).ethereum : null);\n if (!provider || targetChainId === undefined || targetChainId === null) return false;\n const desiredDec = typeof targetChainId === 'number'\n ? targetChainId\n : (String(targetChainId).startsWith('0x') ? parseInt(String(targetChainId), 16) : parseInt(String(targetChainId), 10));\n const hex = '0x' + desiredDec.toString(16);\n const chainName = opts?.chainName || `Network ${desiredDec}`;\n const rpcUrls = (opts?.rpcUrlPublic ? [opts.rpcUrlPublic] : []).filter(Boolean) as string[];\n const nativeCurrency = {\n name: opts?.nativeSymbol || 'ETH',\n symbol: opts?.nativeSymbol || 'ETH',\n decimals: (typeof opts?.decimals === 'number' && isFinite(opts.decimals) ? opts.decimals : 18)\n } as any;\n await provider.request({ method: 'wallet_addEthereumChain', params: [{ chainId: hex, chainName, rpcUrls, nativeCurrency }] });\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport async function getWalletBalanceEntries(params: {\n sdk: any;\n lastWalletId?: string | null;\n connectedWallet?: { owner?: string; principal?: string } | any;\n amountUsd?: number;\n fiatCurrency?: string;\n chainShortcodes?: string[];\n tokenShortcodes?: string[];\n}): Promise<{ balances: WalletBalanceEntry[]; totalBalancesUSD?: number; lastUpdated: Date }>\n{\n const { sdk, lastWalletId, connectedWallet, amountUsd, fiatCurrency, chainShortcodes, tokenShortcodes } = params;\n let response: any;\n const lowerId = (lastWalletId || '').toLowerCase();\n const addrOrPrincipal = (connectedWallet?.owner || connectedWallet?.principal || '').toString();\n try {\n if (lowerId && EVM_WALLET_IDS.has(lowerId)) {\n response = await (sdk?.client as any)?.getExternalWalletBalances?.({ network: 'evm', address: addrOrPrincipal, amountUsd, fiatCurrency, chainShortcodes, tokenShortcodes });\n } else if (lowerId && SOL_WALLET_IDS.has(lowerId)) {\n response = await (sdk?.client as any)?.getExternalWalletBalances?.({ network: 'sol', address: addrOrPrincipal, amountUsd, fiatCurrency, chainShortcodes, tokenShortcodes });\n } else {\n // Prefer API for IC balances too for uniform behavior\n response = await (sdk?.client as any)?.getExternalWalletBalances?.({ network: 'ic', principal: addrOrPrincipal, amountUsd, fiatCurrency, chainShortcodes, tokenShortcodes });\n }\n } catch {\n // Fallbacks: for IC wallets use client method; for EVM wallets, return empty set\n response = { balances: [], totalBalancesUSD: 0, lastUpdated: new Date() };\n }\n\n const balances: WalletBalanceEntry[] = (response?.balances || []).map((b: any) => ({\n ledgerId: b.ledgerId,\n ledgerName: b.ledgerName,\n ledgerSymbol: b.ledgerSymbol,\n tokenShortcode: b.tokenShortcode ?? b.shortcode ?? null,\n canisterId: b.canisterId,\n eip3009Version: b?.eip3009Version ?? null,\n x402Accepts: b?.x402Accepts != null ? Boolean(b.x402Accepts) : undefined,\n balance: b.balance,\n formattedBalance: b.formattedBalance,\n decimals: b.decimals,\n currentPrice: b.currentPrice,\n lastPriceUpdate: b.lastPriceUpdate ? new Date(b.lastPriceUpdate) : undefined,\n lastUpdated: b.lastUpdated ? new Date(b.lastUpdated) : new Date(),\n chainId: typeof b.chainId === 'string' ? b.chainId : (typeof b.chainId === 'number' ? String(b.chainId) : undefined),\n // Accept multiple API shapes: chainName, chain.name, networkName, etc.\n chainName: b.chainName || (b.chain && (b.chain.name || b.chain.chainName)) || b.networkName || undefined,\n rpcUrlPublic: b.rpcUrlPublic,\n chainUuid: b.chainUuid,\n requiredAmount: b.requiredAmount,\n requiredAmountFormatted: b.requiredAmountFormatted,\n hasSufficientBalance: b.hasSufficientBalance,\n logoUrl: b.logoUrl ?? null,\n }));\n\n return {\n balances,\n totalBalancesUSD: response?.totalBalancesUSD,\n lastUpdated: response?.lastUpdated ? new Date(response.lastUpdated) : new Date(),\n };\n}\n\n\n","export function formatTokenAmountThirdwebStyle(value: string | number): string {\n const n = Number(value);\n if (!isFinite(n) || n === 0) return '0';\n const abs = Math.abs(n);\n // Threshold at 1e-5 → show compact lower-than indicator\n if (abs < 1e-5) return '< 0.00001';\n // Truncate (not round) to 5 decimal places, then trim trailing zeros\n const factor = 1e5;\n const truncated = Math.trunc(n * factor) / factor;\n const fixed = truncated.toFixed(5);\n return fixed.replace(/\\.0+$/, '').replace(/(\\.[0-9]*?)0+$/, '$1');\n}\n\n\n","import { html, TemplateResult } from 'lit';\nimport type { WalletBalanceEntry } from '../../../utils/balances';\nimport { formatTokenAmountThirdwebStyle } from '../../../utils/format';\n\nexport type PayWithOptions = {\n isLoading: boolean;\n error?: string | null;\n balances: WalletBalanceEntry[] | undefined;\n onBack: () => void;\n onSelect: (symbol: string) => void;\n};\n\nfunction toUsd(b: WalletBalanceEntry): number {\n const amt = parseFloat(String(b.formattedBalance || '0'));\n const price = Number((b as any).currentPrice ?? 0);\n const usd = (isFinite(amt) ? amt : 0) * (isFinite(price) ? price : 0);\n return isFinite(usd) ? usd : 0;\n}\n\nconst byUsdDesc = (a: WalletBalanceEntry, b: WalletBalanceEntry) => toUsd(b) - toUsd(a);\n\nexport function renderPayWithStyles(): TemplateResult {\n return html`<style>\n /* Theme-aware color variables - Light mode defaults */\n .modal {\n --icpay-background: #ffffff;\n --icpay-foreground: #171717;\n --icpay-muted-foreground: #6b7280;\n --icpay-primary: #3b82f6;\n --icpay-primary-foreground: #ffffff;\n --icpay-secondary: #f3f4f6;\n --icpay-secondary-foreground: #171717;\n --icpay-accent: #f9fafb;\n --icpay-border: #e5e7eb;\n --icpay-error-text: #dc2626;\n }\n /* Dark mode */\n [data-theme=\"dark\"] .modal,\n [data-icpay-theme=\"dark\"] .modal,\n :root[data-theme=\"dark\"] .modal,\n :root[data-icpay-theme=\"dark\"] .modal,\n html[data-theme=\"dark\"] .modal,\n html[data-icpay-theme=\"dark\"] .modal,\n .modal[data-theme=\"dark\"] {\n --icpay-background: hsl(222.2 84% 4.9%);\n --icpay-foreground: hsl(210 40% 98%);\n --icpay-muted-foreground: hsl(215 20.2% 65.1%);\n --icpay-primary: hsl(210 40% 98%);\n --icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n --icpay-secondary: hsl(217.2 32.6% 17.5%);\n --icpay-secondary-foreground: hsl(210 40% 98%);\n --icpay-accent: hsl(217.2 32.6% 17.5%);\n --icpay-border: hsl(217.2 32.6% 30%);\n --icpay-error-text: #f87171;\n }\n .modal { background-color:var(--icpay-background); border-radius:24px; width:100%; max-width:420px; padding:24px; color:var(--icpay-foreground); display:flex; flex-direction:column; border:1px solid var(--icpay-border); height:460px; margin:auto; transition:transform 0.3s ease; position:relative; z-index:1; }\n @media (max-width: 768px) {\n .modal { max-width:100%; width:100%; height:70vh; max-height:70vh; border-radius:24px 24px 0 0; margin:0; transform:translateY(100%); overflow:hidden; display:flex; flex-direction:column; }\n .currency-list { overflow-y:auto; flex:1; min-height:0; }\n .wallet-list { overflow-y:auto; flex:1; min-height:0; }\n }\n .header { display:flex; align-items:center; margin-bottom:20px; padding-bottom:20px; border-bottom:1px solid var(--icpay-border); flex-shrink:0; }\n .back-button { background:none; border:none; color:var(--icpay-foreground); font-size:24px; cursor:pointer; padding:0; margin-right:16px; }\n .title { font-size:20px; font-weight:600; flex:1; text-align:center; margin-right:40px; }\n .currency-list { display:flex; flex-direction:column; gap:0; overflow-y:auto; flex:1; margin-bottom:0; }\n .currency-item { display:flex; align-items:center; padding:16px 12px; cursor:pointer; transition:background-color 0.2s; border-radius:12px; }\n .currency-item:hover { background-color:var(--icpay-accent); }\n .currency-item[disabled] { opacity:0.6; cursor:not-allowed; }\n .currency-icon { width:48px; height:48px; border-radius:50%; margin-right:16px; display:flex; align-items:center; justify-content:center; font-size:28px; flex-shrink:0; overflow:hidden; }\n .eth-icon { background:linear-gradient(135deg,#627eea 0%, #8a9bff 100%); }\n .usdc-icon { background:linear-gradient(135deg,#2775ca 0%, #4da4ff 100%); }\n .usdt-icon { background:linear-gradient(135deg,#26a17b 0%, #50af95 100%); }\n .currency-info { flex:1; }\n .currency-name { font-size:16px; font-weight:500; margin-bottom:4px; }\n .currency-network { font-size:14px; color:var(--icpay-muted-foreground); }\n .currency-balance { text-align:right; }\n .balance-amount { font-size:16px; font-weight:500; margin-bottom:4px; }\n .balance-available { font-size:14px; color:var(--icpay-muted-foreground); }\n .footer { display:flex; justify-content:space-between; align-items:center; margin-top:16px; padding-top:16px; border-top:1px solid var(--icpay-border); flex-shrink:0; }\n .need-wallet { font-size:14px; color:var(--icpay-muted-foreground); }\n .get-started { font-size:14px; color:var(--icpay-primary); background:none; border:none; cursor:pointer; font-weight:500; }\n .get-started:hover { text-decoration:underline; }\n .muted { color:var(--icpay-muted-foreground); }\n </style>`;\n}\n\nexport function renderPayWithContent(opts: PayWithOptions): TemplateResult {\n const formatTokenAmount = (val: string | number): string => formatTokenAmountThirdwebStyle(val);\n return html`\n <div class=\"header\">\n <button class=\"back-button\" @click=${opts.onBack}>‹</button>\n <h1 class=\"title\">Pay with</h1>\n </div>\n ${opts.isLoading ? html`\n <div class=\"muted\">Loading your balances…</div>\n ` : (opts.error ? html`\n <div style=\"color:var(--icpay-error-text)\">${opts.error}</div>\n ` : html`\n <div class=\"currency-list\">\n ${(() => {\n const sufficient = (opts.balances || [])\n .filter(b => b.hasSufficientBalance === true || b.hasSufficientBalance === undefined)\n .sort(byUsdDesc);\n return sufficient.length > 0 ? html`\n ${sufficient.map((b) => {\n const sym = (b.ledgerSymbol || '').toUpperCase();\n const iconClass = b.logoUrl ? '' : (sym === 'ETH' ? 'eth-icon' : (sym === 'USDC' ? 'usdc-icon' : (sym === 'USDT' ? 'usdt-icon' : '')));\n return html`\n <div class=\"currency-item\" @click=${() => opts.onSelect((b as any).tokenShortcode || b.ledgerSymbol)}>\n <div class=\"currency-icon ${iconClass}\">\n ${b.logoUrl\n ? html`<img src=\"${b.logoUrl}\" alt=\"${sym} logo\" style=\"width:100%;height:100%;object-fit:fill\" />`\n : html`<span>${sym.slice(0,1)}</span>`}\n </div>\n <div class=\"currency-info\">\n <div class=\"currency-name\">${b.ledgerName}</div>\n <div class=\"currency-network\">${b.chainName || ''}</div>\n </div>\n <div class=\"currency-balance\">\n <div class=\"balance-amount\">${formatTokenAmount(b.formattedBalance)} ${sym}</div>\n <div class=\"balance-available\">$${toUsd(b).toFixed(2)}</div>\n </div>\n </div>\n `;\n })}\n ` : html`<div class=\"muted\" style=\"margin-bottom:8px\">You have no balances on verified tokens.</div>`;\n })()}\n\n ${(() => {\n const insufficient = (opts.balances || [])\n .filter(b => b.hasSufficientBalance === false)\n .sort(byUsdDesc);\n return insufficient.length > 0 ? html`\n ${insufficient.map((b) => {\n const sym = (b.ledgerSymbol || '').toUpperCase();\n const iconClass = b.logoUrl ? '' : (sym === 'ETH' ? 'eth-icon' : (sym === 'USDC' ? 'usdc-icon' : (sym === 'USDT' ? 'usdt-icon' : '')));\n return html`\n <div class=\"currency-item\" disabled title=\"Insufficient balance\">\n <div class=\"currency-icon ${iconClass}\">\n ${b.logoUrl\n ? html`<img src=\"${b.logoUrl}\" alt=\"${sym} logo\" style=\"width:100%;height:100%;object-fit:fill\" />`\n : html`<span>${sym.slice(0,1)}</span>`}\n </div>\n <div class=\"currency-info\">\n <div class=\"currency-name\">${b.ledgerName}</div>\n <div class=\"currency-network\">${b.chainName || ''}</div>\n </div>\n <div class=\"currency-balance\">\n <div class=\"balance-amount\">need ${b.requiredAmountFormatted || '--'}</div>\n <div class=\"balance-available\">${formatTokenAmount(b.formattedBalance)} ${sym} available</div>\n </div>\n </div>\n `;\n })}\n ` : null;\n })()}\n </div>\n `)}\n <div class=\"footer\">\n <span class=\"need-wallet\">Need a wallet?</span>\n <button class=\"get-started\" @click=${() => { try { window.open('https://internetcomputer.org/wallets','_blank','noopener,noreferrer'); } catch {} }}>Get started</button>\n </div>\n `;\n}\n\n\n","import { html, TemplateResult } from 'lit';\nimport type { WalletBalanceEntry } from '../../utils/balances';\nimport { renderPayWithStyles, renderPayWithContent } from './shared/pay-with';\n\n// Helper to detect current theme mode\nfunction getThemeMode(themeOverride?: 'light' | 'dark'): 'light' | 'dark' {\n // If theme is explicitly provided, use it\n if (themeOverride === 'light' || themeOverride === 'dark') return themeOverride;\n \n if (typeof document === 'undefined') return 'light';\n // Check for ICPay-specific theme attribute first\n const icpayTheme = document.documentElement.getAttribute('data-icpay-theme');\n if (icpayTheme === 'light' || icpayTheme === 'dark') return icpayTheme;\n // Fallback to generic data-theme\n const theme = document.documentElement.getAttribute('data-theme');\n if (theme === 'light' || theme === 'dark') return theme;\n // Default to light\n return 'light';\n}\n\ntype Options = {\n visible: boolean;\n isLoading: boolean;\n error?: string | null;\n balances: WalletBalanceEntry[];\n onSelect: (symbol: string) => void;\n onClose: () => void;\n theme?: 'light' | 'dark'; // Theme mode from widget config\n};\n\nexport function renderWalletBalanceModal(opts: Options): TemplateResult | null {\n if (!opts.visible) return null as any;\n\n const themeMode = getThemeMode(opts.theme);\n return html`\n <div class=\"icpay-modal-overlay\" data-theme=\"${themeMode}\" style=\"position:fixed !important;inset:0 !important;display:flex;align-items:center;justify-content:center;background:rgba(0, 0, 0, 0.5);z-index:99999 !important;transform:none !important;\">\n <style>\n /* Theme-aware color variables - Light mode defaults */\n .icpay-modal-overlay {\n --icpay-background: #ffffff;\n --icpay-foreground: #171717;\n --icpay-muted-foreground: #6b7280;\n --icpay-primary: #3b82f6;\n --icpay-primary-foreground: #ffffff;\n --icpay-secondary: #f3f4f6;\n --icpay-secondary-foreground: #171717;\n --icpay-accent: #f9fafb;\n --icpay-border: #e5e7eb;\n --icpay-error-text: #dc2626;\n }\n /* Dark mode */\n [data-theme=\"dark\"] .icpay-modal-overlay,\n [data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n :root[data-theme=\"dark\"] .icpay-modal-overlay,\n :root[data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n html[data-theme=\"dark\"] .icpay-modal-overlay,\n html[data-icpay-theme=\"dark\"] .icpay-modal-overlay,\n .icpay-modal-overlay[data-theme=\"dark\"] {\n --icpay-background: hsl(222.2 84% 4.9%);\n --icpay-foreground: hsl(210 40% 98%);\n --icpay-muted-foreground: hsl(215 20.2% 65.1%);\n --icpay-primary: hsl(210 40% 98%);\n --icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n --icpay-secondary: hsl(217.2 32.6% 17.5%);\n --icpay-secondary-foreground: hsl(210 40% 98%);\n --icpay-accent: hsl(217.2 32.6% 17.5%);\n --icpay-border: hsl(217.2 32.6% 30%);\n --icpay-error-text: #f87171;\n }\n .icpay-modal-overlay {\n position: fixed !important;\n inset: 0 !important;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n z-index: 99999 !important;\n /* Ensure modal breaks out of any parent constraints */\n transform: none !important;\n will-change: auto;\n isolation: isolate;\n }\n @media (max-width: 768px) {\n .icpay-modal-overlay {\n align-items: flex-end;\n justify-content: stretch;\n }\n }\n </style>\n ${renderPayWithStyles()}\n <div class=\"modal\">\n ${renderPayWithContent({\n isLoading: opts.isLoading,\n error: opts.error,\n balances: opts.balances,\n onBack: opts.onClose,\n onSelect: opts.onSelect\n })}\n </div>\n </div>\n `;\n}\n\n\n\n","// Minimal detection utility for X402-capable clients\n// This centralizes all future X402-related checks\n\n/**\n * Returns true when the connected wallet is Base/Coinbase on iOS.\n * On iOS, Base Wallet uses Passkeys (WebAuthn) and returns an assertion blob, not raw ECDSA r,s,v,\n * so x402 (EIP-3009) cannot be used on-chain. Use normal payment flow instead.\n */\nexport function shouldSkipX402ForBaseOnIos(walletId: string | null | undefined): boolean {\n if (!walletId || String(walletId).toLowerCase() !== 'coinbase') return false;\n try {\n const ua = typeof navigator !== 'undefined' ? String(navigator.userAgent || '').toLowerCase() : '';\n return ua.includes('iphone') || ua.includes('ipad');\n } catch {\n return false;\n }\n}\n\nfunction debugLogLocal(debug: boolean, message: string, data?: any): void {\n if (!debug) return;\n try {\n if (data !== undefined) {\n console.log(`[ICPay Widget][x402] ${message}`, data);\n } else {\n console.log(`[ICPay Widget][x402] ${message}`);\n }\n } catch {}\n}\n\n/**\n * Checks whether the currently available wallet supports EIP-712 signing (required for new x402 flow).\n * Call this after a token is selected and right before executing createPayment.\n * Note: This uses eth_requestAccounts which may prompt the wallet to connect.\n */\nexport async function clientSupportsX402(debug = false, opts?: { chainId?: number; verifyingContract?: string }): Promise<boolean> {\n try {\n debugLogLocal(debug, 'Starting EIP-712 capability check for x402');\n const hasWindow = typeof window !== 'undefined';\n const hasEthereum = hasWindow && typeof (window as any)?.ethereum !== 'undefined';\n if (!hasEthereum) {\n debugLogLocal(debug, 'No wallet detected (window.ethereum missing)');\n return false;\n }\n\n // Request accounts (may prompt) and attempt EIP-712 signTypedData_v4\n const eth: any = (window as any).ethereum;\n const accounts: string[] = await eth.request({ method: 'eth_requestAccounts' });\n const from = Array.isArray(accounts) && accounts[0] ? accounts[0] : null;\n if (!from) {\n debugLogLocal(debug, 'Wallet present but no accounts returned');\n return false;\n }\n\n const chainId = (opts && typeof opts.chainId === 'number' ? opts.chainId : 1);\n const verifyingContract = (opts && opts.verifyingContract) || '0x0000000000000000000000000000000000000000';\n const typedData = {\n domain: { name: 'x402', version: '1', chainId, verifyingContract },\n message: { purpose: 'Test EIP-712 signing' },\n primaryType: 'Message',\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n Message: [{ name: 'purpose', type: 'string' }],\n },\n };\n const payload = JSON.stringify(typedData);\n const signature = await eth.request({\n method: 'eth_signTypedData_v4',\n params: [from, payload],\n });\n debugLogLocal(debug, 'EIP-712 signing supported', { from, signature: typeof signature === 'string' ? `${signature.slice(0, 10)}…` : typeof signature });\n return true;\n } catch (e) {\n debugLogLocal(debug, 'EIP-712 check error', e);\n }\n debugLogLocal(debug, 'EIP-712 not supported or user denied');\n return false;\n}\n\n","export function hidePnPDefaultModal(): void {\n try {\n if (typeof document === 'undefined') return;\n const hideNow = () => {\n // Scoped and global overlays\n const selectors = [\n '.icpay-widget-base .modal-overlay',\n '.modal-overlay',\n // legacy roots/selectors\n '.plug-n-play-modal',\n '.pnp-modal',\n '#plug-n-play-root',\n '#pnp-root',\n '[data-pnp-root]',\n '[data-pnp-modal]'\n ];\n document.querySelectorAll(selectors.join(',')).forEach((el) => {\n const overlay = el as HTMLElement;\n try {\n const hasWalletSelector = !!overlay.querySelector?.('.wallet-selector-container');\n if (overlay.classList?.contains('modal-overlay')) {\n if (hasWalletSelector) overlay.style.display = 'none';\n } else {\n overlay.style.display = 'none';\n }\n } catch {}\n });\n };\n\n hideNow();\n\n // Briefly observe DOM mutations to hide overlays that appear after async connects\n try {\n const Observer = (window as any).MutationObserver || (window as any).WebKitMutationObserver;\n if (Observer) {\n const observer = new Observer((mutations: any[]) => {\n for (const m of mutations) {\n if (!m.addedNodes) continue;\n for (const node of m.addedNodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches?.('.modal-overlay') || node.querySelector?.('.wallet-selector-container')) {\n hideNow();\n }\n }\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n setTimeout(() => { try { observer.disconnect(); } catch {} }, 3000);\n }\n } catch {}\n } catch {}\n}\n\n\n// Force Oisy to open in a browser tab (not a sized popup) by clearing window features\n// This relies on @windoge98/plug-n-play honoring adapter.config.transport.windowOpenerFeatures\n// When features string is empty, most browsers open a new tab instead of a popup window\nexport function applyOisyNewTabConfig(cfg: any): any {\n try {\n const next = cfg || {};\n next.adapters = next.adapters || {};\n const oisy = next.adapters.oisy || {};\n const oisyConfig = oisy.config || {};\n const transport = {\n ...(oisyConfig.transport || {}),\n windowOpenerFeatures: '',\n // Allow establishing channel even if not in the same click stack (Oisy signer requirement is strict)\n detectNonClickEstablishment: false\n };\n next.adapters.oisy = { ...oisy, config: { ...oisyConfig, transport } };\n return next;\n } catch {\n return cfg;\n }\n}\n\n// Normalize the connected wallet object to the shape expected by icpay-sdk\n// Ensures there is an `owner` (principal string) available for intent creation\nexport function normalizeConnectedWallet(pnp: any, connectResult: any): any {\n try {\n const fromResult = (connectResult && (connectResult.owner || connectResult.principal)) || null;\n const fromAccount = (pnp && pnp.account && (pnp.account.owner || pnp.account.principal)) || null;\n const toStringSafe = (v: any) => (typeof v === 'string' ? v : (v && typeof v.toString === 'function' ? v.toString() : null));\n const principal = toStringSafe(fromResult) || toStringSafe(fromAccount) || null;\n if (principal) {\n return { owner: principal, principal };\n }\n // Fallback to raw result to maintain other data, but SDK will still require owner\n return connectResult || { owner: null };\n } catch {\n return connectResult || { owner: null };\n }\n}\n\n// Read saved Plug N Play session (provider/principal) from localStorage\n// Try to detect existing Oisy session via adapter APIs (no localStorage/cookies)\n// Returns principal string if an active session is detected, else null\nexport async function detectOisySessionViaAdapter(pnp: any): Promise<string | null> {\n try {\n // Support both external PNP and internal wallet-select implementation\n const getEnabled = typeof pnp?.getEnabledWallets === 'function' ? pnp.getEnabledWallets.bind(pnp) : null;\n if (!getEnabled) return null;\n const enabled = getEnabled() || [];\n const oisyCfg = enabled.find((w: any) => (w?.id || '').toLowerCase() === 'oisy');\n if (!oisyCfg || !oisyCfg.adapter) return null;\n const AdapterCtor = oisyCfg.adapter;\n const adapterInstance = new AdapterCtor({ config: (pnp as any)?.config || {} });\n const connected: boolean = await adapterInstance.isConnected();\n if (!connected) return null;\n const principal: string | null = await adapterInstance.getPrincipal();\n if (principal && principal !== '2vxsx-fae') return principal;\n return null;\n } catch {\n return null;\n }\n}\n\n","/**\n * Shared payment flow reset for all widgets.\n * Dispatches icpay-payment-reset, clears widget state, stops onramp polling, and disconnects wallet\n * so every create-payment button press starts from scratch (connect wallet, select token, etc.).\n */\n\nexport type PaymentFlowPendingAction = 'pay' | 'unlock' | 'order' | 'donate' | 'tip';\n\n/** Context passed by widgets (this). Use unknown so widgets with private members are accepted. */\nexport type PaymentFlowResetContext = unknown;\n\n/**\n * Dispatches the global icpay-payment-reset event (progress bar listens and resets).\n */\nexport function dispatchPaymentReset(): void {\n try {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('icpay-payment-reset'));\n }\n } catch {}\n}\n\n/**\n * Stops onramp polling and clears controller/timer on the context.\n */\nexport function stopOnrampPolling(ctx: PaymentFlowResetContext): void {\n const c = ctx as Record<string, unknown>;\n if (!c || typeof c !== 'object') return;\n const controller = c.onrampNotifyController as { stop: () => void } | null | undefined;\n if (controller) {\n try {\n controller.stop();\n } catch {}\n c.onrampNotifyController = null;\n }\n const timer = c.onrampPollTimer as number | null | undefined;\n if (timer != null) {\n try {\n clearTimeout(timer);\n } catch {}\n c.onrampPollTimer = null;\n }\n if ('onrampPollingActive' in c) c.onrampPollingActive = false;\n}\n\n/**\n * Disconnects wallet and clears actorProvider/connectedWallet from config when not useOwnWallet.\n */\nexport function disconnectWalletForReset(ctx: PaymentFlowResetContext): void {\n const c = ctx as Record<string, unknown>;\n if (!c || typeof c !== 'object') return;\n const config = c.config as { useOwnWallet?: boolean; [key: string]: unknown } | undefined;\n const pnp = c.pnp as { disconnect?: () => void | Promise<void> } | null | undefined;\n if (config?.useOwnWallet || !pnp || !config) return;\n try {\n pnp.disconnect?.();\n } catch {}\n c.config = { ...config, actorProvider: undefined, connectedWallet: undefined };\n}\n\n/**\n * Resets all common payment flow state on the widget context and performs disconnect + onramp cleanup.\n * Call this at the start of every create-payment action (pay, unlock, order, donate, tip).\n * When keepWalletConnected is true (e.g. user already connected via pre-generated WalletConnect QR),\n * wallet state is preserved and disconnect is skipped so Pay goes straight to token selection.\n */\nexport function resetPaymentFlow(\n ctx: PaymentFlowResetContext,\n options: { pendingAction: PaymentFlowPendingAction; keepWalletConnected?: boolean }\n): void {\n const c = (ctx as Record<string, unknown>) ?? {};\n if (typeof c !== 'object') return;\n const keepWallet = !!options.keepWalletConnected;\n dispatchPaymentReset();\n\n c.errorMessage = null;\n c.errorSeverity = null;\n c.errorAction = null;\n c.processing = false;\n c.showBalanceModal = false;\n c.selectedSymbol = null;\n c.pendingAction = options.pendingAction;\n c.oisyReadyToPay = false;\n c.showOnrampModal = false;\n c.onrampUrl = null;\n c.onrampPaymentIntentId = null;\n c.onrampErrorMessage = null;\n\n if (!keepWallet) {\n c.showWalletModal = true;\n c.walletModalStep = 'connect';\n c.lastWalletId = null;\n c.walletConnected = false;\n }\n\n if ('succeeded' in c) c.succeeded = false;\n if ('skipDisconnectOnce' in c) c.skipDisconnectOnce = false;\n if ('oisySignerPreopened' in c) c.oisySignerPreopened = false;\n if ('showProviderPicker' in c) c.showProviderPicker = false;\n if ('selectedOnrampProvider' in c) c.selectedOnrampProvider = null;\n\n stopOnrampPolling(ctx);\n if (!keepWallet) disconnectWalletForReset(ctx);\n\n const req = (ctx as Record<string, unknown>).requestUpdate;\n if (typeof req === 'function') req.call(ctx);\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport { buildWalletEntries } from '../utils/balances';\nimport type { TipJarConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { resetPaymentFlow as resetPaymentFlowUtil } from '../utils/payment-flow-reset';\nimport { getWalletBalanceEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport { shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// wallet will be imported dynamically when needed\nlet WalletSelect: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-tip-jar')\nexport class ICPayTipJar extends LitElement {\n static styles = [baseStyles, css`\n .jar { width: 120px; height: 160px; margin: 0 auto 12px; position: relative; background: linear-gradient(135deg, #374151 0%, #4b5563 100%); border-radius: 0 0 60px 60px; border: 3px solid #6b7280; border-top: 8px solid #6b7280; overflow: hidden; }\n .fill { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(135deg, #d1d5db 0%, #9ca3af 100%); transition: height 0.8s ease; height: 0%; }\n .amounts { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin: 12px 0; }\n .chip { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .chip.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: var(--icpay-processing-bg);\n border-color: var(--icpay-processing-border);\n color: var(--icpay-processing-text);\n }\n\n .error-message.warning {\n background: var(--icpay-warning-bg);\n border-color: var(--icpay-warning-border);\n color: var(--icpay-warning-text);\n }\n\n .error-message.error {\n background: var(--icpay-error-bg);\n border-color: var(--icpay-error-border);\n color: var(--icpay-error-text);\n }\n `];\n\n @property({ type: Object }) config!: TipJarConfig;\n @state() private selectedAmount = 1;\n @state() private selectedSymbol: string | null = null;\n @state() private total = 0;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'tip' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private sdk: WidgetSdk | null = null;\n // Integrated balances\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: any[] = [];\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const _cfg1: any = applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) });\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new WalletSelect(_cfg1);\n // Do not call connect here; just hydrate saved principal for UI/history.\n // Keep walletConnected false so pressing pay triggers real connect.\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private get amounts(): number[] {\n return this.config?.amountsUsd || [1, 5, 10];\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Tip jar connected', { config: this.config });\n\n if (this.config && this.config.defaultAmountUsd) this.selectedAmount = this.config.defaultAmountUsd;\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close wallet modal after SDK transaction creation\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n // No ledger preload; balances flow handles token availability\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n // Resume the original action after external wallet connected\n setTimeout(() => { if (action === 'tip') this.tip(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'tip';\n this.showWalletModal = true;\n this.requestUpdate();\n try {\n const amount = Number(this.selectedAmount || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'tip', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload\n\n private selectAmount(v: number) { this.selectedAmount = v; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get fillPercentage() {\n const max = 50; // visual cap\n return Math.min((this.total / max) * 100, 100);\n }\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this, { pendingAction: 'tip' });\n }\n\n private async tip() {\n if (!isBrowser) return;\n\n this.resetPaymentFlow();\n\n debugLog(this.config?.debug || false, 'Tip button clicked!', { config: this.config, processing: this.processing });\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'tip', type: 'sendUsd', amount: this.selectedAmount, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n // External wallet handling - always require explicit connect before pay\n if (!this.config.actorProvider) {\n this.pendingAction = 'tip';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with wallet\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via wallet');\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _cfg2: any = wantsOisyTab ? applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) }) : ({ ...(this.config?.plugNPlay || {}) });\n if ((this.config as any)?.chainTypes) _cfg2.chainTypes = (this.config as any).chainTypes;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg2);\n try {\n const principal = await detectOisySessionViaAdapter(this.pnp);\n if (principal) {\n this.walletConnected = true;\n const normalized = normalizeConnectedWallet(this.pnp, { owner: principal, principal, connected: true });\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n this.tip();\n return;\n }\n } catch {}\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'tip';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected; proceed to token selection to initiate payment via selection handler\n this.showWalletModal = true;\n await this.fetchAndShowBalances();\n return;\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const resp = await (sdk as any).startOnrampUsd(this.selectedAmount, undefined, { context: 'tip:onramp', onrampPayment: true, onrampProvider: (this as any)?.selectedOnrampProvider || 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n (this as any).onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n (this as any).onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n (this as any).onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances();\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances() {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.selectedAmount || 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances as any[];\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n // Close wallet modal before starting progress to reveal progress bar\n this.showBalanceModal = false;\n this.showWalletModal = false;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedAmount || 0);\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'tip:x402'\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n this.showBalanceModal = false;\n return;\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n this.showBalanceModal = false;\n });\n return;\n }\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'tip') {\n // IC/SOL flow: prefer x402 for Solana tokens when available\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedAmount || 0);\n const chainName = String((sel as any)?.ledgerName || (sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const isIc = chainName.includes('ic');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n if ((sel as any)?.x402Accepts) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: isSol ? 'sol' : (isIc ? 'ic' : (this.config as any)?.icpay_network),\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'tip:x402'\n }\n },\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // No fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\" style=\"text-align:center;\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedAmount || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"jar\"><div class=\"fill\" style=\"height:${this.fillPercentage}%\"></div></div>\n <div class=\"label\">Total Tips: $${this.total}</div>\n\n <div class=\"amounts\">\n ${this.amounts.map(a => html`<div class=\"chip ${this.selectedAmount===a?'selected':''}\" @click=${() => this.selectAmount(a)}>$${a}</div>`)}\n </div>\n\n\n\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.tip()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : (this.config?.buttonLabel\n ? this.config.buttonLabel.replace('{amount}', String(this.selectedAmount)).replace('{symbol}', (this.selectedSymbol || 'ICP'))\n : `Tip $${this.selectedAmount} with crypto`))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = (buildWalletEntries as any)(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? this.walletBalances as any : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSwitchAccount: () => this.onSwitchAccount(null),\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.selectedAmount || this.config?.defaultAmountUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.tip(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances as any,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: (this as any).onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-tip-jar': ICPayTipJar } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { ArticlePaywallConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\nimport type { WalletBalanceEntry } from '../utils/balances';\nimport { getWalletBalanceEntries, buildWalletEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport { shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { resetPaymentFlow as resetPaymentFlowUtil, type PaymentFlowResetContext } from '../utils/payment-flow-reset';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet WalletSelect: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-article-paywall')\nexport class ICPayArticlePaywall extends LitElement {\n static styles = [baseStyles, css`\n .container { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); border-radius: 16px; padding: 16px; margin-bottom: 16px; }\n .title { color: var(--icpay-text); font-weight: 700; margin-bottom: 8px; }\n .preview { color: var(--icpay-muted-foreground); margin-bottom: 12px; line-height: 1.6; }\n .locked { filter: blur(3px); color: #6b7280; margin-bottom: 12px; }\n .unlocked { filter: blur(0); color: var(--icpay-text); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: var(--icpay-processing-bg);\n border-color: var(--icpay-processing-border);\n color: var(--icpay-processing-text);\n }\n\n .error-message.warning {\n background: var(--icpay-warning-bg);\n border-color: var(--icpay-warning-border);\n color: var(--icpay-warning-text);\n }\n\n .error-message.error {\n background: var(--icpay-error-bg);\n border-color: var(--icpay-error-border);\n color: var(--icpay-error-text);\n }\n `];\n\n @property({ type: Object }) config!: ArticlePaywallConfig;\n @property({ type: String }) title: string = 'Article Title';\n @property({ type: String }) preview: string = '';\n @property({ type: String }) lockedContent: string = '';\n private get obfuscatedLockedContent(): string {\n try {\n const s = this.lockedContent || '';\n // Replace all non-whitespace characters with 'x' to avoid leaking content\n return s.replace(/[^\\s]/g, 'x');\n } catch {\n return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n }\n }\n @state() private selectedSymbol: string | null = null;\n @state() private unlocked = false;\n @state() private succeeded = false;\n @state() private processing = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'unlock' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n // Post-connect token selection\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: WalletBalanceEntry[] = [];\n private sdk: WidgetSdk | null = null;\n private onTransactionCompleted: EventListener | null = null;\n private onUnlock: EventListener | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new WalletSelect(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const resp = await (sdk as any).startOnrampUsd(this.config.priceUsd, undefined, { context: 'article:onramp', onrampPayment: true, onrampProvider: 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n this.onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n this.onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Article paywall connected', { config: this.config });\n\n // Apply config-driven content if provided\n if (this.config) {\n if (typeof (this.config as any).title === 'string') this.title = (this.config as any).title;\n if (typeof (this.config as any).preview === 'string') this.preview = (this.config as any).preview;\n if (typeof (this.config as any).lockedContent === 'string') this.lockedContent = (this.config as any).lockedContent;\n }\n\n this.tryAutoConnectPNP();\n // Listen for switch-account request\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close wallet/balance modals when SDK intent is created\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.showBalanceModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n // Unlock content when transaction completes (wallet or onramp)\n this.onTransactionCompleted = (() => {\n this.unlocked = true;\n this.succeeded = true;\n this.processing = false;\n try { window.dispatchEvent(new CustomEvent('icpay-unlock', { detail: { amount: this.config?.priceUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n this.requestUpdate();\n }) as EventListener;\n try {\n window.addEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted);\n } catch {}\n // Also listen for unlock event (in case it's dispatched elsewhere)\n this.onUnlock = (() => {\n this.unlocked = true;\n this.succeeded = true;\n this.processing = false;\n this.requestUpdate();\n }) as EventListener;\n try {\n window.addEventListener('icpay-unlock', this.onUnlock);\n } catch {}\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n try { window.removeEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (this.onTransactionCompleted) {\n try { window.removeEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted); } catch {}\n }\n if (this.onUnlock) {\n try { window.removeEventListener('icpay-unlock', this.onUnlock); } catch {}\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config')) {\n // Re-apply content on config update\n if (this.config) {\n if (typeof (this.config as any).title === 'string') this.title = (this.config as any).title;\n if (typeof (this.config as any).preview === 'string') this.preview = (this.config as any).preview;\n if (typeof (this.config as any).lockedContent === 'string') this.lockedContent = (this.config as any).lockedContent;\n }\n }\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'unlock') this.unlock(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n // Prepare to restart flow after reconnect\n this.pendingAction = 'unlock';\n this.showWalletModal = true;\n this.requestUpdate();\n // Restart progress from step 0 for unlock\n try {\n const amount = Number(this.config?.priceUsd || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'unlock', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload; relying on balances flow instead\n\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this as PaymentFlowResetContext, { pendingAction: 'unlock' });\n }\n\n private async unlock() {\n if (!isBrowser) return;\n if (this.unlocked) return;\n\n this.resetPaymentFlow();\n\n debugLog(this.config?.debug || false, 'Article paywall unlock started', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'unlock', type: 'sendUsd', amount: this.config.priceUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'unlock';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _cfg2: any = wantsOisyTab ? applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) }) : ({ ...(this.config?.plugNPlay || {}) });\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg2);\n try {\n const principal = await detectOisySessionViaAdapter(this.pnp);\n if (principal) {\n this.walletConnected = true;\n const normalized = normalizeConnectedWallet(this.pnp, { owner: principal, principal, connected: true });\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n this.unlock();\n return;\n }\n } catch {}\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'unlock';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected; proceed to token selection to initiate payment via selection handler\n // Ensure wallet selector is closed before opening balances\n this.showWalletModal = false;\n await this.fetchAndShowBalances();\n return;\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances();\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances() {\n // Opens modal with balances; falls back to showing all verified ledgers if balance fetch fails\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.config?.priceUsd ?? 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances;\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find(b => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n // Close modals immediately on selection to reveal progress UI\n this.showBalanceModal = false;\n this.showWalletModal = false;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.config?.priceUsd ?? 0);\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'article:x402'\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // Surface x402 error but continue to fallback flow if appropriate\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n });\n return;\n }\n this.showBalanceModal = false;\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'unlock') {\n // IC/SOL flow: prefer x402 for Solana tokens when available\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.config?.priceUsd ?? 0);\n const chainName = String((sel as any)?.ledgerName || (sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n if (isSol && (sel as any)?.x402Accepts) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'sol',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'article:x402'\n }\n },\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // No fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"container\">\n <div class=\"title\">${this.title}</div>\n <div class=\"preview\">${this.preview}</div>\n <div class=\"${this.unlocked ? 'unlocked' : 'locked'}\">${this.unlocked ? this.lockedContent : this.obfuscatedLockedContent}</div>\n </div>\n\n <button class=\"pay-button ${this.processing?'processing':''}\" ?disabled=${this.processing||this.unlocked || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)} @click=${() => this.unlock()}>\n ${this.unlocked ? 'Unlocked' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Pay with crypto')\n .replace('{amount}', `${Number(this.config?.priceUsd ?? 0).toFixed(2)}`)\n .replace('{symbol}', (this.selectedSymbol || 'ICP'))\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = buildWalletEntries(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? this.walletBalances : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.config?.priceUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.unlock(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: this.onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-article-paywall': ICPayArticlePaywall } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { CoffeeShopConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { resetPaymentFlow as resetPaymentFlowUtil } from '../utils/payment-flow-reset';\nimport { buildWalletEntries, getWalletBalanceEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport { shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet WalletSelect: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-coffee-shop')\nexport class ICPayCoffeeShop extends LitElement {\n static styles = [baseStyles, css`\n .menu { display: grid; gap: 8px; margin-bottom: 12px; }\n .item { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 16px; display:flex; justify-content: space-between; align-items:center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .item.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .total { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; margin-bottom: 12px; color: var(--icpay-text); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: var(--icpay-processing-bg);\n border-color: var(--icpay-processing-border);\n color: var(--icpay-processing-text);\n }\n\n .error-message.warning {\n background: var(--icpay-warning-bg);\n border-color: var(--icpay-warning-border);\n color: var(--icpay-warning-text);\n }\n\n .error-message.error {\n background: var(--icpay-error-bg);\n border-color: var(--icpay-error-border);\n color: var(--icpay-error-text);\n }\n `];\n\n @property({ type: Object }) config!: CoffeeShopConfig;\n @state() private selectedIndex = 0;\n @state() private selectedSymbol: string | null = null;\n @state() private processing = false;\n // Ledger options removed; token selection comes from balances modal\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'order' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private sdk: WidgetSdk | null = null;\n // Integrated balances\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: any[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Coffee shop connected', { config: this.config });\n\n if (this.config && typeof this.config.defaultItemIndex === 'number') this.selectedIndex = this.config.defaultItemIndex;\n // No ledger preload; balances flow handles token availability\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close wallet/balance modals once SDK transaction is created\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'order') this.order(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'order';\n this.showWalletModal = true;\n this.requestUpdate();\n try {\n const amount = Number(this.selectedItem?.priceUsd || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'order', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload\n\n private selectItem(i: number) { this.selectedIndex = i; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get selectedItem() { return this.config?.items?.[this.selectedIndex] || { name: 'Loading...', priceUsd: 0 }; }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this, { pendingAction: 'order' });\n }\n\n private async order() {\n if (!isBrowser) return;\n\n this.resetPaymentFlow();\n\n debugLog(this.config?.debug || false, 'Coffee order started', {\n selectedItem: this.selectedItem,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'order', type: 'sendUsd', amount: this.selectedItem.priceUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'order';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) }) : ({ ...(this.config?.plugNPlay || {}) });\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _cfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _cfg.chainTypes = (this.config as any).chainTypes;\n }\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n try {\n const principal = await detectOisySessionViaAdapter(this.pnp);\n if (principal) {\n this.walletConnected = true;\n const normalized = normalizeConnectedWallet(this.pnp, { owner: principal, principal, connected: true });\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n this.order();\n return;\n }\n } catch {}\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'order';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected; proceed to token selection to initiate payment via selection handler\n this.pendingAction = 'order';\n this.showWalletModal = true;\n await this.fetchAndShowBalances();\n return;\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const resp = await (sdk as any).startOnrampUsd(this.selectedItem.priceUsd, undefined, { context: 'coffee:onramp', onrampPayment: true, item: this.selectedItem.name, onrampProvider: 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n this.onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n this.onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances();\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances() {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.selectedItem?.priceUsd ?? 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances as any[];\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n // Close wallet modal before starting progress to reveal progress bar\n this.showBalanceModal = false;\n this.showWalletModal = false;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedItem?.priceUsd || 0);\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'coffee:x402',\n item: this.selectedItem?.name\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n this.showBalanceModal = false;\n return;\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n item: this.selectedItem?.name\n }\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n this.showBalanceModal = false;\n });\n return;\n }\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'order') {\n // IC/SOL flow: prefer x402 for Solana tokens when available\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedItem?.priceUsd || 0);\n const chainName = String((sel as any)?.ledgerName || (sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const isIc = chainName.includes('ic');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n if ((sel as any)?.x402Accepts) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: isSol ? 'sol' : (isIc ? 'ic' : (this.config as any)?.icpay_network),\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'coffee:x402',\n item: this.selectedItem?.name\n }\n },\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // No fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: sel?.ledgerId,\n item: this.selectedItem?.name\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedItem?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"menu\">\n ${this.config.items.map((it, i) => html`\n <div class=\"item ${this.selectedIndex===i?'selected':''}\" @click=${() => this.selectItem(i)}>\n <span>${it.name}</span>\n <span>$${Number(it?.priceUsd ?? 0).toFixed(2)}</span>\n </div>\n `)}\n </div>\n\n <div class=\"total\">Order Total: $${Number(this.selectedItem?.priceUsd ?? 0).toFixed(2)}</div>\n\n\n\n <button class=\"pay-button ${this.processing?'processing':''}\" ?disabled=${this.processing} @click=${() => this.order()}>\n ${this.processing ? 'Processing…' : `Order ${this.selectedItem.name}`}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = (buildWalletEntries as any)(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? this.walletBalances as any : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSwitchAccount: () => this.onSwitchAccount(null),\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const i = this.config?.defaultItemIndex ?? 0; const amt = Number((this.config?.items?.[i]?.priceUsd) || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.order(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances as any,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: this.onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-coffee-shop': ICPayCoffeeShop } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport { buildWalletEntries } from '../utils/balances';\nimport type { DonationThermometerConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { resetPaymentFlow as resetPaymentFlowUtil } from '../utils/payment-flow-reset';\nimport { getWalletBalanceEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport { shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet WalletSelect: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-donation-thermometer')\nexport class ICPayDonationThermometer extends LitElement {\n static styles = [baseStyles, css`\n .thermo { width: 60px; height: 200px; background: var(--icpay-surface-alt); border: 3px solid #6b7280; border-radius: 30px; margin: 0 auto 12px; position: relative; overflow: hidden; }\n .fill { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(135deg, #d1d5db 0%, #9ca3af 100%); transition: height 0.8s ease; height: 0%; border-radius: 0 0 27px 27px; }\n .amounts { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin: 12px 0; }\n .chip { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .chip.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: var(--icpay-processing-bg);\n border-color: var(--icpay-processing-border);\n color: var(--icpay-processing-text);\n }\n\n .error-message.warning {\n background: var(--icpay-warning-bg);\n border-color: var(--icpay-warning-border);\n color: var(--icpay-warning-text);\n }\n\n .error-message.error {\n background: var(--icpay-error-bg);\n border-color: var(--icpay-error-border);\n color: var(--icpay-error-text);\n }\n `];\n\n @property({ type: Object }) config!: DonationThermometerConfig;\n @state() private selectedAmount = 10;\n @state() private selectedSymbol: string | null = null;\n @state() private raised = 0;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'donate' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private sdk: WidgetSdk | null = null;\n // Integrated balances\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: any[] = [];\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const _cfg1: any = applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) });\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new WalletSelect(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private get amounts(): number[] {\n return this.config?.amountsUsd || [10, 25, 50, 100, 250, 500];\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Donation thermometer connected', { config: this.config });\n\n if (this.config && typeof this.config.defaultAmountUsd === 'number') this.selectedAmount = this.config.defaultAmountUsd;\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close wallet modal after SDK transaction created\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n // No ledger preload; balances flow handles token availability\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'donate') this.donate(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'donate';\n this.showWalletModal = true;\n this.requestUpdate();\n try {\n const amount = Number(this.selectedAmount || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'donate', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload\n\n private selectAmount(v: number) { this.selectedAmount = v; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get fillPercentage() {\n const goal = Number(this.config?.goalUsd ?? 1000);\n const denom = goal > 0 ? goal : 1000;\n return Math.min((this.raised / denom) * 100, 100);\n }\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this, { pendingAction: 'donate' });\n }\n\n private async donate() {\n if (!isBrowser) return;\n\n this.resetPaymentFlow();\n\n debugLog(this.config?.debug || false, 'Donation started', {\n amount: this.selectedAmount,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'donate', type: 'sendUsd', amount: this.selectedAmount, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'donate';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _cfg2: any = wantsOisyTab ? applyOisyNewTabConfig({ ...(this.config?.plugNPlay || {}) }) : ({ ...(this.config?.plugNPlay || {}) });\n if ((this.config as any)?.chainTypes) _cfg2.chainTypes = (this.config as any).chainTypes;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg2);\n try {\n const principal = await detectOisySessionViaAdapter(this.pnp);\n if (principal) {\n this.walletConnected = true;\n const normalized = normalizeConnectedWallet(this.pnp, { owner: principal, principal, connected: true });\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n this.donate();\n return;\n }\n } catch {}\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'donate';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected; proceed to token selection to initiate payment via selection handler\n this.showWalletModal = true;\n await this.fetchAndShowBalances();\n return;\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const resp = await (sdk as any).startOnrampUsd(this.selectedAmount, undefined, { context: 'donation:onramp', onrampPayment: true, onrampProvider: 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n this.onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n this.onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp URL';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances();\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances() {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.selectedAmount || 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances as any[];\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n // Close wallet modal before starting progress to reveal progress bar\n this.showBalanceModal = false;\n this.showWalletModal = false;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedAmount || 0);\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'donation:x402'\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n this.showBalanceModal = false;\n return;\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n this.showBalanceModal = false;\n });\n return;\n }\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'donate') {\n // IC/SOL flow: prefer x402 for Solana tokens when available\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.selectedAmount || 0);\n const chainName = String((sel as any)?.ledgerName || (sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n if (isSol && (sel as any)?.x402Accepts) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'sol',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'donation:x402'\n }\n },\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // No fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\" style=\"text-align:center;\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedAmount || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"thermo\"><div class=\"fill\" style=\"height:${this.fillPercentage}%\"></div></div>\n <div class=\"total\">$${Number(this.raised).toFixed(0)} / $${Number(this.config?.goalUsd ?? 0).toFixed(2)}</div>\n\n <div class=\"amounts\">\n ${this.amounts.map(a => html`<div class=\"chip ${this.selectedAmount===a?'selected':''}\" @click=${() => this.selectAmount(a)}>$${a}</div>`)}\n </div>\n\n\n\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.donate()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Donated' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Donate {amount} with crypto')\n .replace('{amount}', `${this.selectedAmount}`)\n .replace('{symbol}', (this.selectedSymbol || 'ICP'))\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = (buildWalletEntries as any)(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? this.walletBalances as any : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSwitchAccount: () => this.onSwitchAccount(null),\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.selectedAmount || this.config?.defaultAmountUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.donate(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances as any,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: this.onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-donation-thermometer': ICPayDonationThermometer } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { PayButtonConfig } from '../types';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { renderOnrampProviderPicker } from './ui/onramp-provider-picker';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './ui/progress-bar';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { getWalletBalanceEntries, buildWalletEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport type { WalletBalanceEntry } from '../utils/balances';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { clientSupportsX402, shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { resetPaymentFlow as resetPaymentFlowUtil, type PaymentFlowResetContext } from '../utils/payment-flow-reset';\nimport { fetchPaymentIntent, isPaymentIntentCompleted, type PaymentIntentResponse } from '../utils/fetch-payment-intent';\n\nconst isBrowser = typeof window !== 'undefined';\nlet WalletSelect: any = null;\n\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-pay-button')\nexport class ICPayPayButton extends LitElement {\n static styles = [baseStyles, css`\n .row { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; }\n .row.single { grid-template-columns: 1fr; }\n select { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; }\n .error-message { border: 1px solid; font-weight: 500; }\n .error-message.info { background: var(--icpay-processing-bg); border-color: var(--icpay-processing-border); color: var(--icpay-processing-text); }\n .error-message.warning { background: var(--icpay-warning-bg); border-color: var(--icpay-warning-border); color: var(--icpay-warning-text); }\n .error-message.error { background: var(--icpay-error-bg); border-color: var(--icpay-error-border); color: var(--icpay-error-text); }\n `];\n\n @property({ type: Object }) config!: PayButtonConfig;\n @state() private selectedSymbol: string | null = null;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n @state() private showProviderPicker: boolean = false;\n @state() private selectedOnrampProvider: string | null = null;\n @state() private oisyReadyToPay: boolean = false;\n @state() private oisySignerPreopened: boolean = false;\n @state() private skipDisconnectOnce: boolean = false;\n @state() private lastWalletId: string | null = null;\n // Post-connect token selection\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: WalletBalanceEntry[] = [];\n @state() private loadedPaymentIntent: PaymentIntentResponse | null = null;\n @state() private paymentIntentLoading = false;\n private onrampPollTimer: number | null = null;\n private pnp: any | null = null;\n private oisyConnectRetriedNewTab: boolean = false;\n private sdk: WidgetSdk | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private onTransactionCompleted: (() => void) | null = null;\n\n private getSdk(): WidgetSdk {\n if (!this.sdk) {\n let cfg: any = this.config;\n const usePnpEvm = (this.lastWalletId === 'walletconnect' || this.lastWalletId === 'coinbase') && this.pnp;\n if (usePnpEvm) {\n const evmProv = (this.pnp as any).getEvmProvider?.();\n if (evmProv) cfg = { ...cfg, evmProvider: evmProv };\n }\n // Pass payment intent so SDK uses existing intent instead of creating a new one (e.g. from pay page ?paymentIntent= in URL)\n if (this.loadedPaymentIntent?.paymentIntent) {\n cfg = { ...cfg, paymentIntent: this.loadedPaymentIntent.paymentIntent };\n } else if ((this.config as any)?.paymentIntent != null && typeof (this.config as any).paymentIntent === 'object') {\n cfg = { ...cfg, paymentIntent: (this.config as any).paymentIntent };\n }\n // When we never loaded the full object, pass paymentIntentId so the SDK can fetch/use the existing intent by id\n if (!cfg.paymentIntent && (this.loadedPaymentIntent?.paymentIntentId ?? (this.config as any)?.paymentIntentId)) {\n cfg = { ...cfg, paymentIntentId: this.loadedPaymentIntent?.paymentIntentId ?? (this.config as any).paymentIntentId };\n }\n this.sdk = createSdk(cfg);\n }\n return this.sdk;\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return;\n debugLog(this.config?.debug || false, 'Pay button connected', { config: this.config });\n // Apply theme\n if (this.config?.theme) {\n applyThemeVars(this, this.config.theme);\n }\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n try {\n window.addEventListener('icpay-sdk-transaction-created', ((e: any) => {\n debugLog(this.config?.debug || false, 'SDK transaction created', { detail: e?.detail });\n this.showWalletModal = false;\n this.showBalanceModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n this.onTransactionCompleted = () => {\n this.succeeded = true;\n this.processing = false;\n this.requestUpdate();\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener); } catch {}\n this.loadPaymentIntentIfNeeded();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.onTransactionCompleted) {\n try { window.removeEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener); } catch {}\n }\n }\n\n /** Load payment intent by id from config; if completed show success, else merge intent into config for amount/currency and pass to SDK. */\n private async loadPaymentIntentIfNeeded(): Promise<void> {\n const intentId = (this.config as any)?.paymentIntentId;\n if (!intentId || typeof intentId !== 'string' || intentId.trim() === '') return;\n if (this.loadedPaymentIntent != null) return;\n const key = this.config?.publishableKey;\n const apiUrl = this.config?.apiUrl || 'https://api.icpay.org';\n if (!key) return;\n this.paymentIntentLoading = true;\n this.requestUpdate();\n try {\n const data = await fetchPaymentIntent(apiUrl, key, intentId.trim(), !!this.config?.debug);\n this.loadedPaymentIntent = data ?? null;\n if (data?.paymentIntent) {\n if (isPaymentIntentCompleted(data.paymentIntent.status)) {\n this.succeeded = true;\n this.requestUpdate();\n } else {\n const pi = data.paymentIntent;\n this.config = {\n ...this.config,\n paymentIntent: pi,\n amountUsd: typeof pi.amountUsd === 'number' ? pi.amountUsd : (this.config?.amountUsd ?? 0),\n fiat_currency: (pi.fiatCurrencyCode ?? (this.config as any)?.fiat_currency) ?? undefined,\n } as any;\n this.sdk = null;\n this.requestUpdate();\n }\n }\n } catch (e) {\n debugLog(this.config?.debug || false, 'Load payment intent error', e);\n } finally {\n this.paymentIntentLoading = false;\n this.requestUpdate();\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.config?.theme) {\n applyThemeVars(this, this.config.theme);\n }\n if (changed.has('config')) {\n const newId = (this.config as any)?.paymentIntentId;\n if (this.loadedPaymentIntent && this.loadedPaymentIntent.paymentIntentId !== newId) {\n this.loadedPaymentIntent = null;\n this.sdk = null;\n }\n if (newId && this.loadedPaymentIntent == null && !this.paymentIntentLoading) {\n this.loadPaymentIntentIfNeeded();\n }\n }\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction as 'pay';\n // Always emit wallet-connected for progress bar\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue to pay if we're in balances step (waiting for user to pick a token)\n // or if Oisy single-CTA mode is active. Defer until user confirms.\n if (this.walletModalStep !== 'balances' && !this.oisyReadyToPay) {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'pay') this.pay(); }, 0);\n }\n }\n // No longer pull sessionId from config; it is obtained from SDK response\n if (changed.has('config')) {\n // Recreate SDK on config changes\n this.sdk = null;\n // selectedSymbol kept until user picks a token\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'pay';\n this.walletModalStep = 'connect';\n this.showWalletModal = true;\n this.oisyReadyToPay = false;\n this.lastWalletId = null;\n this.requestUpdate();\n try {\n const amount = Number(this.config?.amountUsd || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload\n\n private selectSymbol(symbol: string) { this.selectedSymbol = symbol; }\n\n private async ensureWallet(): Promise<boolean> {\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return false;\n }\n return true;\n }\n\n if (this.walletConnected) return true;\n try {\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n // Optional: open Oisy in a new tab if explicitly enabled\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n // Pass chainTypes to wallet selector to filter wallets\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n // Show chooser modal and resume later\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return false;\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n if (this.lastWalletId === 'oisy') this.oisyConnectRetriedNewTab = false;\n // Minimal: connect immediately within click (no pre-open or detection)\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n debugLog(this.config?.debug || false, 'Wallet connect result', result);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // Keep wallet modal open; advance to balances step and load balances inside it\n this.walletModalStep = 'balances';\n this.fetchAndShowBalances('pay');\n }).catch((error: any) => {\n debugLog(this.config?.debug || false, 'Wallet connection error', error);\n const isOisy = (walletId || '').toLowerCase() === 'oisy';\n const message = (error && (error.message || String(error))) || '';\n const blocked = isOisy && (!this.oisyConnectRetriedNewTab) && (message.includes('Signer window could not be opened') || message.includes('Communication channel could not be established'));\n if (blocked) {\n // Retry Oisy connect by forcing new-tab transport\n this.oisyConnectRetriedNewTab = true;\n (async () => {\n try {\n if (!WalletSelect) { const module = await import('../wallet-select'); WalletSelect = module.WalletSelect; }\n const raw: any = { ...(this.config?.plugNPlay || {}) };\n const _dest2 = (this.config as any)?.recipientAddresses;\n if (_dest2 && (_dest2.ic || _dest2.evm || _dest2.sol)) {\n const allowed2: Array<'ic'|'evm'|'sol'> = [];\n if (_dest2.ic) allowed2.push('ic');\n if (_dest2.evm) allowed2.push('evm');\n if (_dest2.sol) allowed2.push('sol');\n if (allowed2.length) raw.chainTypes = allowed2 as any;\n } else if ((this.config as any)?.chainTypes) {\n raw.chainTypes = (this.config as any).chainTypes;\n }\n const cfg: any = applyOisyNewTabConfig(raw);\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(cfg);\n const retry = this.pnp.connect('oisy');\n retry.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'oisy' } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}) } as any;\n this.sdk = null;\n // Advance directly to balances like Plug (IC)\n this.walletModalStep = 'balances';\n this.fetchAndShowBalances('pay');\n }).catch((err2: any) => {\n debugLog(this.config?.debug || false, 'Oisy retry connect (new tab) failed', err2);\n this.errorMessage = err2 instanceof Error ? err2.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (initErr) {\n debugLog(this.config?.debug || false, 'Oisy new-tab init failed', initErr);\n this.errorMessage = initErr instanceof Error ? initErr.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n })();\n return;\n }\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error (sync)', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances(action: 'pay') {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n this.walletModalStep = 'balances';\n this.showBalanceModal = false; // integrated flow uses wallet modal\n const sdk = this.getSdk();\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.config?.amountUsd ?? 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances as WalletBalanceEntry[];\n this.pendingAction = action;\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n // Resolve selection by tokenShortcode; set selectedSymbol from entry for UI\n const sel = (this.walletBalances || []).find(b => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n\n // Close wallet modal before starting progress to reveal progress bar\n this.showBalanceModal = false;\n this.showWalletModal = false;\n\n // If EVM wallet, ensure correct network first, then emit EVM payment start\n if (isEvmWalletId(this.lastWalletId)) {\n debugLog(this.config?.debug || false, 'EVM selection made', {\n selectedSymbol: this.selectedSymbol,\n selPresent: !!sel,\n selSnapshot: sel ? {\n ledgerId: (sel as any)?.ledgerId,\n ledgerSymbol: (sel as any)?.ledgerSymbol,\n ledgerName: (sel as any)?.ledgerName,\n chainUuid: (sel as any)?.chainUuid,\n chainId: (sel as any)?.chainId,\n chainName: (sel as any)?.chainName,\n x402Accepts: (sel as any)?.x402Accepts,\n requiredAmount: (sel as any)?.requiredAmount,\n hasSufficientBalance: (sel as any)?.hasSufficientBalance,\n } : null,\n });\n const targetChain = sel?.chainId;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = this.getSdk();\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const symbolNow = sel?.ledgerSymbol;\n const skipX402BaseIos = shouldSkipX402ForBaseOnIos(this.lastWalletId);\n const tryX402 = Boolean(sel && sel.x402Accepts) && !skipX402BaseIos;\n debugLog(this.config?.debug || false, 'EVM post-ensure chain snapshot', {\n targetChain,\n amountUsd,\n symbolNow,\n tryX402,\n skipX402BaseIos,\n x402Accepts: sel?.x402Accepts,\n });\n if (tryX402) {\n try {\n const evmDest = (((this.config as any)?.recipientAddresses)?.evm) || '0x0000000000000000000000000000000000000000';\n debugLog(this.config?.debug || false, 'Using recipientAddress (x402)', { recipientAddress: evmDest });\n const metadata = {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'pay-button:x402'\n }\n };\n debugLog(this.config?.debug || false, 'Attempting X402 flow (EVM selection)', { amountUsd, tokenShortcode: sel?.tokenShortcode, x402Accepts: sel?.x402Accepts });\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata,\n recipientAddress: evmDest,\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (x402Err: any) {\n debugLog(this.config?.debug || false, 'X402 payment failed (EVM selection), falling back', {\n message: x402Err?.message, code: x402Err?.code, data: x402Err?.details || x402Err?.data\n });\n }\n } else {\n debugLog(this.config?.debug || false, 'Skipping X402 path', {\n reason: sel ? (sel.x402Accepts ? 'unknown' : 'x402Accepts false') : 'no selection',\n selPresent: !!sel,\n x402Accepts: sel?.x402Accepts,\n });\n }\n // Normal wallet flow (native or non-x402 token)\n debugLog(this.config?.debug || false, 'Falling back to normal EVM wallet flow', {\n amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n });\n const evmDest2 = (((this.config as any)?.recipientAddresses)?.evm) || '0x0000000000000000000000000000000000000000';\n debugLog(this.config?.debug || false, 'Using recipientAddress (normal)', { recipientAddress: evmDest2 });\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: evmDest2,\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n });\n return;\n }\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') {\n // IC flow: send using tokenShortcode same as EVM\n try {\n const sel = (this.walletBalances || []).find(b => (b as any)?.tokenShortcode === shortcode);\n const sdk = this.getSdk();\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n debugLog(this.config?.debug || false, 'IC selection made', {\n selectedSymbol: this.selectedSymbol,\n selPresent: !!sel,\n selSnapshot: sel ? {\n ledgerId: (sel as any)?.ledgerId,\n ledgerSymbol: (sel as any)?.ledgerSymbol,\n ledgerName: (sel as any)?.ledgerName,\n requiredAmount: (sel as any)?.requiredAmount,\n hasSufficientBalance: (sel as any)?.hasSufficientBalance,\n tokenShortcode: (sel as any)?.tokenShortcode,\n } : null,\n });\n const chainName = String((sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic || (this.config as any)?.recipientAddress) : (dest.ic || (this.config as any)?.recipientAddress);\n // If Solana or IC token supports x402, start x402 flow (request 402 + auto-settle by SDK)\n const isIc = chainName.includes('ic');\n if (sel?.x402Accepts) {\n try {\n const metadata = {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: isSol ? 'sol' : (isIc ? 'ic' : (this.config as any)?.icpay_network),\n icpay_ledger_id: (sel as any)?.ledgerId,\n icpay_context: 'pay-button:x402'\n }\n };\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata,\n recipientAddress: chosen || '',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (x402Err: any) {\n debugLog(this.config?.debug || false, 'X402 payment failed (SOL selection), falling back', {\n message: x402Err?.message, code: x402Err?.code, data: x402Err?.details || x402Err?.data\n });\n // Do not fallback to normal flow for Solana x402; require relayer settlement\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: (sel as any)?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n private renderWalletModal() {\n if (!this.showWalletModal || !this.pnp) return null as any;\n const walletsRaw = this.pnp.getEnabledWallets() || [];\n const wallets = buildWalletEntries(walletsRaw);\n const onrampEnabled = (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true);\n // Coinbase sandbox minimum is $2 (use lower default until dynamic provider min is wired)\n const minOnramp = 2;\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const showTooltip = onrampEnabled && amountUsd > 0 && amountUsd < minOnramp;\n const diff = Math.max(0, minOnramp - amountUsd);\n const tooltip = showTooltip ? `Note: Minimum card amount is $${minOnramp}. You will pay about $${diff.toFixed(2)} more.` : null;\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: this.showWalletModal,\n wallets,\n isConnecting: false,\n onSwitchAccount: () => this.onSwitchAccount(null),\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? (this.walletBalances || []) : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSelect: (walletId: string) => {\n // Ensure any signer window/channel establishment happens directly in this click handler\n this.connectWithWallet(walletId);\n },\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: onrampEnabled ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: onrampEnabled,\n creditCardTooltip: tooltip,\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => {\n this.showWalletModal = false; // Close modal so progress bar can proceed\n this.skipDisconnectOnce = true;\n this.oisyReadyToPay = false;\n this.pay(); // Trigger pay within same user gesture\n },\n theme: themeMode\n });\n }\n\n private startOnramp() {\n // Signal to progress bar that onramp flow is starting\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n // Determine available providers from config\n const list = Array.isArray(this.config?.onramp?.providers)\n ? (this.config.onramp!.providers!.filter(p => p && (p.enabled !== false)))\n : [];\n const providers = list.length ? list : [{ slug: 'coinbase', name: 'Coinbase', enabled: true }];\n if (providers.length > 1) {\n this.showProviderPicker = true;\n } else {\n this.selectedOnrampProvider = providers[0]?.slug || 'coinbase';\n // Kick off onramp intent creation through SDK and open provider modal with returned sessionId\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n }\n\n private async createOnrampIntent() {\n try {\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const sdk = this.getSdk();\n if (!this.selectedSymbol) this.selectedSymbol = 'ICP';\n const resp = await sdk.startOnrampUsd(amountUsd, undefined as any, {\n context: 'pay-button:onramp',\n onrampPayment: true,\n onrampProvider: this.selectedOnrampProvider || 'coinbase',\n });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const errorMessage =\n resp?.metadata?.icpay_onramp?.errorMessage ||\n resp?.metadata?.onramp?.errorMessage ||\n resp?.paymentIntent?.metadata?.icpay?.onrampError ||\n resp?.paymentIntent?.metadata?.icpay?.errorMessage ||\n resp?.metadata?.icpay?.onrampError ||\n resp?.metadata?.icpay?.errorMessage ||\n null;\n this.onrampErrorMessage = errorMessage || null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n this.onrampUrl = url;\n // Open Coinbase Onramp in a new tab/window (CSP-safe)\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n // Inform progress component to advance to step 2 (onramp started)\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n // Begin polling payment intent status while user completes onramp\n this.startOnrampPolling(undefined);\n } else {\n // Open modal in friendly error state (sessionId missing)\n this.onrampUrl = null;\n this.showOnrampModal = true;\n }\n } catch (e) {\n // Also show friendly error modal on any error\n this.onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || null;\n this.showOnrampModal = true;\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n // Clear any previous polling\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n\n const sdk = this.getSdk();\n const handleComplete = () => {\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n // Also listen to completion event to tidy up\n const listener = (e: any) => { handleComplete(); };\n try { window.addEventListener('icpay-sdk-transaction-completed', listener as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = sdk.notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n // Store a no-op timer id placeholder so our cleanup path remains intact\n this.onrampPollTimer = 1 as any;\n }\n\n private resetPaymentFlow(keepWalletConnected = false) {\n resetPaymentFlowUtil(this as PaymentFlowResetContext, { pendingAction: 'pay', keepWalletConnected });\n }\n\n private async pay() {\n if (!isBrowser) return;\n\n // When already connected (e.g. via pre-generated WalletConnect QR), keep wallet so Pay goes to token selection\n this.resetPaymentFlow(this.walletConnected);\n\n // Emit method start to open progress modal and set first step\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.config?.amountUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n const ready = await this.ensureWallet();\n if (!ready) return;\n\n const sdk = this.getSdk();\n // Debug: snapshot wallet state before resolving canister and sending\n try {\n const cw = (this.config as any)?.connectedWallet;\n const pnpAcct = (this as any)?.pnp?.account;\n debugLog(this.config?.debug || false, 'Wallet state before payment', {\n connectedWallet: cw,\n pnpAccount: pnpAcct,\n principal: (cw?.owner || cw?.principal || pnpAcct?.owner || pnpAcct?.principal || null)\n });\n } catch {}\n // Always proceed to balances selection modal; selection handler will create the payment\n this.walletModalStep = 'balances';\n this.showWalletModal = true;\n await this.fetchAndShowBalances('pay');\n return;\n } catch (e) {\n debugLog(this.config?.debug || false, 'Payment error', {\n message: (e as any)?.message,\n code: (e as any)?.code,\n details: (e as any)?.details,\n stack: (e as any)?.stack\n });\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n render() {\n if (!this.config) return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n\n if (this.paymentIntentLoading && (this.config as any)?.paymentIntentId) {\n return html`<div class=\"icpay-card icpay-section\">Loading payment...</div>`;\n }\n\n const selectedSymbol = this.selectedSymbol || 'ICP';\n const amountUsd = typeof this.config?.amountUsd === 'number' ? this.config.amountUsd : (this.loadedPaymentIntent?.paymentIntent?.amountUsd != null ? Number(this.loadedPaymentIntent.paymentIntent.amountUsd) : undefined);\n const amountPart = typeof amountUsd === 'number' ? `${Number(amountUsd).toFixed(2)}` : '';\n const rawLabel = this.config?.buttonLabel || (typeof amountUsd === 'number' ? 'Pay with crypto' : 'Pay with {symbol}');\n const label = rawLabel.replace('{amount}', amountPart || '$0.00').replace('{symbol}', selectedSymbol);\n const progressEnabled = this.config?.progressBar?.enabled !== false;\n const showProgressBar = progressEnabled;\n const suspendProgress = this.showWalletModal || this.showBalanceModal;\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\">\n ${showProgressBar ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.amountUsd ?? this.loadedPaymentIntent?.paymentIntent?.amountUsd ?? 0)}\n .ledgerSymbol=${selectedSymbol}\n .suspended=${suspendProgress}\n ></icpay-progress-bar>\n ` : null}\n\n <div class=\"row single\">\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.pay()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : label)}\n </button>\n </div>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`<button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">${this.errorAction}</button>` : ''}\n </div>\n ` : ''}\n ${this.renderWalletModal()}\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: this.onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n ${renderOnrampProviderPicker({\n visible: this.showProviderPicker,\n providers: (() => {\n const list = Array.isArray(this.config?.onramp?.providers) ? (this.config!.onramp!.providers!.filter(p => p && (p.enabled !== false))) : [];\n const src = list.length ? list : [{ slug: 'coinbase', name: 'Coinbase', enabled: true }];\n return src.map(p => ({ slug: p.slug, name: p.name || (p.slug === 'coinbase' ? 'Coinbase' : p.slug), logoUrl: (p as any).logoUrl || null }));\n })(),\n onSelect: (slug: string) => {\n this.selectedOnrampProvider = slug;\n this.showProviderPicker = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n },\n onClose: () => { this.showProviderPicker = false; },\n title: 'Choose onramp provider',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-pay-button': ICPayPayButton } }\n\n\n","import { html, TemplateResult } from 'lit';\n\n// Helper to detect current theme mode\nfunction getThemeMode(themeOverride?: 'light' | 'dark'): 'light' | 'dark' {\n // If theme is explicitly provided, use it\n if (themeOverride === 'light' || themeOverride === 'dark') return themeOverride;\n \n if (typeof document === 'undefined') return 'light';\n // Check for ICPay-specific theme attribute first\n const icpayTheme = document.documentElement.getAttribute('data-icpay-theme');\n if (icpayTheme === 'light' || icpayTheme === 'dark') return icpayTheme;\n // Fallback to generic data-theme\n const theme = document.documentElement.getAttribute('data-theme');\n if (theme === 'light' || theme === 'dark') return theme;\n // Default to light\n return 'light';\n}\n\nexport type OnrampProviderItem = {\n\tslug: string;\n\tname: string;\n\tlogoUrl?: string | null;\n};\n\nexport function renderOnrampProviderPicker(opts: {\n\tvisible: boolean;\n\tproviders: OnrampProviderItem[];\n\tonSelect: (slug: string) => void;\n\tonClose: () => void;\n\ttitle?: string;\n\ttheme?: 'light' | 'dark'; // Theme mode from widget config\n}): TemplateResult | null {\n\tif (!opts.visible) return null as any;\n\tconst providers = opts.providers || [];\n\tconst themeMode = getThemeMode(opts.theme);\n\treturn html`\n\t\t<style>\n\t\t\t/* Theme-aware color variables - Light mode defaults */\n\t\t\t.icpay-onramp-overlay {\n\t\t\t\t--icpay-background: #ffffff;\n\t\t\t\t--icpay-foreground: #171717;\n\t\t\t\t--icpay-muted-foreground: #6b7280;\n\t\t\t\t--icpay-primary: #3b82f6;\n\t\t\t\t--icpay-primary-foreground: #ffffff;\n\t\t\t\t--icpay-secondary: #f3f4f6;\n\t\t\t\t--icpay-secondary-foreground: #171717;\n\t\t\t\t--icpay-accent: #f9fafb;\n\t\t\t\t--icpay-border: #e5e7eb;\n\t\t\t}\n\t\t\t/* Dark mode */\n\t\t\t[data-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\t[data-icpay-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\t:root[data-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\t:root[data-icpay-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\thtml[data-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\thtml[data-icpay-theme=\"dark\"] .icpay-onramp-overlay,\n\t\t\t.icpay-onramp-overlay[data-theme=\"dark\"] {\n\t\t\t\t--icpay-background: hsl(222.2 84% 4.9%);\n\t\t\t\t--icpay-foreground: hsl(210 40% 98%);\n\t\t\t\t--icpay-muted-foreground: hsl(215 20.2% 65.1%);\n\t\t\t\t--icpay-primary: hsl(210 40% 98%);\n\t\t\t\t--icpay-primary-foreground: hsl(222.2 47.4% 11.2%);\n\t\t\t\t--icpay-secondary: hsl(217.2 32.6% 17.5%);\n\t\t\t\t--icpay-secondary-foreground: hsl(210 40% 98%);\n\t\t\t\t--icpay-accent: hsl(217.2 32.6% 17.5%);\n\t\t\t\t--icpay-border: hsl(217.2 32.6% 30%);\n\t\t\t}\n\t\t\t.icpay-onramp-provider-btn {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\tbackground: var(--icpay-secondary);\n\t\t\t\tborder: 1px solid var(--icpay-border);\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tcolor: var(--icpay-foreground);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-align: left;\n\t\t\t\ttransition: background-color 0.2s;\n\t\t\t}\n\t\t\t.icpay-onramp-provider-btn:hover {\n\t\t\t\tbackground: var(--icpay-accent);\n\t\t\t}\n\t\t\t.icpay-onramp-overlay {\n\t\t\t\tposition: fixed !important;\n\t\t\t\tinset: 0 !important;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: rgba(0,0,0,0.85);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\tz-index: 99999 !important;\n\t\t\t\t/* Ensure modal breaks out of any parent constraints */\n\t\t\t\ttransform: none !important;\n\t\t\t\twill-change: auto;\n\t\t\t\tisolation: isolate;\n\t\t\t}\n\t\t\t.icpay-onramp-container {\n\t\t\t\tposition: relative;\n\t\t\t\tbackground: var(--icpay-background);\n\t\t\t\tborder: 1px solid var(--icpay-border);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbox-shadow: 0 20px 60px rgba(0,0,0,0.5);\n\t\t\t\tmin-width: 320px;\n\t\t\t\tmax-width: 420px;\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t@media (max-width: 768px) {\n\t\t\t\t.icpay-onramp-overlay {\n\t\t\t\t\talign-items: flex-end;\n\t\t\t\t\tjustify-content: stretch;\n\t\t\t\t}\n\t\t\t\t.icpay-onramp-container {\n\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 70vh;\n\t\t\t\t\tmax-height: 70vh;\n\t\t\t\t\tborder-radius: 16px 16px 0 0;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\toverflow-y: auto;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t\t<div class=\"icpay-onramp-overlay\" data-theme=\"${themeMode}\">\n\t\t\t<div class=\"icpay-onramp-container\">\n\t\t\t\t<button @click=${opts.onClose} style=\"position:absolute;right:12px;top:12px;background:transparent;border:none;color:var(--icpay-foreground);cursor:pointer;font-size:20px;opacity:0.8\">×</button>\n\t\t\t\t<div style=\"color:var(--icpay-foreground);font-weight:600;font-size:16px;margin-bottom:12px\">${opts.title || 'Choose a provider'}</div>\n\t\t\t\t<div style=\"display:flex;flex-direction:column;gap:10px\">\n\t\t\t\t\t${providers.map((p) => html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"icpay-onramp-provider-btn\"\n\t\t\t\t\t\t\t@click=${() => opts.onSelect(p.slug)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${p.logoUrl ? html`<img src=\"${p.logoUrl}\" style=\"width:24px;height:24px;border-radius:4px\" />` : html`<div style=\"width:24px;height:24px;border-radius:4px;background:var(--icpay-secondary)\"></div>`}\n\t\t\t\t\t\t\t<span style=\"font-size:14px\">${p.name}</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\n","/**\n * Fetch a payment intent by id from icpay-api (GET /sdk/public/payments/intents/:id).\n * Uses publishable key for auth. Returns the same shape as create-intent response.\n */\n\nconst isBrowser = typeof window !== 'undefined';\n\nexport type PaymentIntentResponse = {\n paymentIntentId: string;\n paymentIntentCode: number | null;\n payment: null;\n paymentIntent: {\n id: string;\n accountId: string;\n amount: string;\n amountUsd?: number | null;\n amountInFiat?: number | null;\n ledgerCanisterId: string;\n description?: string | null;\n expectedSenderPrincipal?: string | null;\n status: string;\n metadata?: Record<string, unknown>;\n intentCode: number;\n chainId?: string | null;\n chainName?: string | null;\n chainType?: string | null;\n accountCanisterId?: string | number | null;\n contractAddress?: string | null;\n rpcUrlPublic?: string | null;\n rpcChainId?: string | number | null;\n functionSelectors?: Record<string, string> | null;\n externalCostAmount?: string | null;\n transactionBase64?: string | null;\n fiatCurrencyCode?: string | null;\n fiatCurrencySymbol?: string | null;\n tokenShortcode?: string | null;\n shortcode?: string | null;\n [key: string]: unknown;\n };\n onramp: null;\n};\n\nexport async function fetchPaymentIntent(\n apiUrl: string,\n publishableKey: string,\n intentId: string,\n debug = false\n): Promise<PaymentIntentResponse | null> {\n if (!isBrowser || !intentId || !publishableKey) return null;\n const base = (apiUrl || 'https://api.icpay.org').replace(/\\/$/, '');\n const url = `${base}/sdk/public/payments/intents/${encodeURIComponent(intentId)}`;\n try {\n if (debug) {\n console.log('[ICPay Widget] Fetching payment intent', { intentId, url: url.replace(publishableKey, '***') });\n }\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n if (!res.ok) {\n if (debug) console.log('[ICPay Widget] Fetch payment intent failed', res.status, await res.text());\n return null;\n }\n const data = (await res.json()) as PaymentIntentResponse;\n if (!data?.paymentIntent?.id) return null;\n return data;\n } catch (e) {\n if (debug) console.log('[ICPay Widget] Fetch payment intent error', e);\n return null;\n }\n}\n\n/** Terminal statuses: intent already completed/failed/canceled so no payment needed */\nexport function isPaymentIntentTerminal(status: string | undefined): boolean {\n if (!status) return false;\n const s = String(status).toLowerCase();\n return (\n s === 'succeeded' ||\n s === 'completed' ||\n s === 'failed' ||\n s === 'canceled' ||\n s === 'cancelled' ||\n s === 'mismatched'\n );\n}\n\nexport function isPaymentIntentCompleted(status: string | undefined): boolean {\n if (!status) return false;\n const s = String(status).toLowerCase();\n return s === 'succeeded' || s === 'completed';\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles, applyThemeVars } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { AmountInputConfig } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport { buildWalletEntries } from '../utils/balances';\nimport './ui/progress-bar';\nimport { getWalletBalanceEntries, isEvmWalletId, ensureEvmChain } from '../utils/balances';\nimport { renderWalletBalanceModal } from './ui/wallet-balance-modal';\nimport { renderWalletSelectorModal } from './ui/wallet-selector-modal';\nimport { renderOnrampModal } from './ui/onramp-modal';\nimport { applyOisyNewTabConfig, normalizeConnectedWallet, detectOisySessionViaAdapter } from '../utils/pnp';\nimport { clientSupportsX402, shouldSkipX402ForBaseOnIos } from '../utils/x402';\nimport { resetPaymentFlow as resetPaymentFlowUtil, type PaymentFlowResetContext } from '../utils/payment-flow-reset';\n\nconst isBrowser = typeof window !== 'undefined';\nlet WalletSelect: any = null;\n\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-amount-input')\nexport class ICPayAmountInput extends LitElement {\n static styles = [baseStyles, css`\n .row { display: grid; grid-template-columns: 1fr; gap: 12px; align-items: stretch; }\n .top-row { display: grid; grid-template-columns: 1fr; gap: 10px; align-items: center; }\n .top-row.with-selector { grid-template-columns: 1fr 2fr; }\n icpay-token-selector { width: 100%; }\n .amount-field { position: relative; width: 100%; }\n .amount-field .currency-prefix { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--icpay-muted, #a3a3a3); font-weight: 600; pointer-events: none; z-index: 2; }\n .amount-field input[type=\"number\"] { padding-left: 32px; position: relative; z-index: 1; }\n input[type=\"number\"] { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; width: 100%; box-sizing: border-box; height: 54px; }\n select { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; }\n .pay-button { width: 100%; }\n .error-message { border: 1px solid; font-weight: 500; }\n .error-message.info { background: var(--icpay-processing-bg); border-color: var(--icpay-processing-border); color: var(--icpay-processing-text); }\n .error-message.warning { background: var(--icpay-warning-bg); border-color: var(--icpay-warning-border); color: var(--icpay-warning-text); }\n .error-message.error { background: var(--icpay-error-bg); border-color: var(--icpay-error-border); color: var(--icpay-error-text); }\n .hint { font-size: 12px; color: var(--icpay-muted); margin-top: 6px; }\n\n @media (max-width: 520px) {\n .top-row { grid-template-columns: 1fr; }\n }\n `];\n\n @property({ type: Object }) config!: AmountInputConfig;\n @state() private amountUsd: number = 0;\n @state() private hasUserAmount: boolean = false;\n @state() private selectedSymbol: string | null = null;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n @state() private walletModalStep: 'connect' | 'balances' = 'connect';\n @state() private showOnrampModal = false;\n @state() private onrampUrl: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n @state() private oisyReadyToPay: boolean = false;\n @state() private lastWalletId: string | null = null;\n private pnp: any | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n // Integrated balances\n @state() private showBalanceModal = false;\n @state() private balancesLoading = false;\n @state() private balancesError: string | null = null;\n @state() private walletBalances: any[] = [];\n private sdk: WidgetSdk | null = null;\n\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return;\n debugLog(this.config?.debug || false, 'Amount input connected', { config: this.config });\n this.amountUsd = Number(this.config?.defaultAmountUsd ?? 0);\n this.hasUserAmount = false;\n // No ledger preload; balances flow handles token availability\n // selectedSymbol will be set after balance selection\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n // Close any wallet/balance modals once an SDK transaction is created\n try {\n window.addEventListener('icpay-sdk-transaction-created', (() => {\n this.showWalletModal = false;\n this.requestUpdate();\n }) as EventListener);\n } catch {}\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config')) {\n // Apply defaults only if user hasn't edited the amount\n if (!this.hasUserAmount && typeof this.config?.defaultAmountUsd === 'number') {\n if (this.amountUsd === 0 || this.amountUsd == null || Number.isNaN(this.amountUsd)) {\n this.amountUsd = Number(this.config.defaultAmountUsd);\n }\n }\n // No ledger preload\n\n // If we were waiting on wallet connect, resume action\n if (this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Do NOT auto-continue if we're already in balances step; wait for user to pick a token\n if (this.walletModalStep !== 'balances') {\n this.pendingAction = null;\n setTimeout(() => { if (action === 'pay') this.pay(); }, 0);\n }\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (this.pnp) {\n try { await this.pnp.disconnect(); } catch {}\n }\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n this.requestUpdate();\n try {\n const amount = Number(this.amountUsd || 0);\n const curr = this.selectedSymbol || 'ICP';\n window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount, currency: curr } }));\n } catch {}\n } catch {}\n };\n\n // Removed ledger preload\n\n private onInputChange(e: any) {\n const step = Number(this.config?.stepUsd ?? 0.5);\n const value = Math.max(0, Number(e.target.value || 0));\n const rounded = Math.round(value / step) * step;\n this.amountUsd = Number(rounded.toFixed(2));\n this.hasUserAmount = true;\n }\n\n private selectSymbol(symbol: string) { this.selectedSymbol = symbol; }\n\n private isValidAmount(): boolean {\n const min = Number(this.config?.minUsd ?? 0.5);\n const max = this.config?.maxUsd !== undefined ? Number(this.config.maxUsd) : Infinity;\n return this.amountUsd >= min && this.amountUsd <= max;\n }\n\n /** Ensure WalletSelect (pnp) is created with same config as wallet modal; used by generateWalletConnectQr / connectWallet. */\n private async getOrCreatePnp(): Promise<any> {\n if (this.pnp) return this.pnp;\n if (!WalletSelect) {\n const module = await import('../wallet-select');\n WalletSelect = module.WalletSelect;\n }\n const wantsOisyTab = !!((this.config as any)?.openOisyInNewTab || (this.config as any)?.plugNPlay?.openOisyInNewTab);\n const _rawCfg: any = { ...(this.config?.plugNPlay || {}) };\n const _dest = (this.config as any)?.recipientAddresses;\n if (_dest && (_dest.ic || _dest.evm || _dest.sol)) {\n const allowed: Array<'ic'|'evm'|'sol'> = [];\n if (_dest.ic) allowed.push('ic');\n if (_dest.evm) allowed.push('evm');\n if (_dest.sol) allowed.push('sol');\n if (allowed.length) _rawCfg.chainTypes = allowed as any;\n } else if ((this.config as any)?.chainTypes) {\n _rawCfg.chainTypes = (this.config as any).chainTypes;\n }\n const _cfg: any = wantsOisyTab ? applyOisyNewTabConfig(_rawCfg) : _rawCfg;\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new WalletSelect(_cfg);\n return this.pnp;\n }\n\n /**\n * Pre-generate WalletConnect QR as a data URL. Host can show it in a placeholder (e.g. pay page left column).\n * When user scans and approves, the widget is updated to \"connected\" so Pay does not open the wallet selector.\n * hostOptions.onConnected is called when the phone wallet connects so the host can show \"Connected\" etc.\n * Returns the QR image as data URL, or null if WalletConnect is not enabled/available.\n */\n async generateWalletConnectQr(hostOptions?: { onConnected?: () => void }): Promise<string | null> {\n try {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || typeof pnp.generateWalletConnectQr !== 'function') return null;\n return await pnp.generateWalletConnectQr({\n onConnected: (account: any) => {\n this.walletConnected = true;\n this.lastWalletId = 'walletconnect';\n const normalized = normalizeConnectedWallet(this.pnp, account);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'walletconnect' } })); } catch {}\n try { hostOptions?.onConnected?.(); } catch {}\n this.requestUpdate();\n },\n });\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Coinbase/Base wallet is already connected (e.g. user returned from Base app deep link).\n * Host can call this on load when showing Base option on mobile to show \"Connected\".\n */\n async checkCoinbaseConnection(): Promise<boolean> {\n try {\n const pnp = await this.getOrCreatePnp();\n return (pnp as any)?.hasCoinbaseAccounts?.() ?? false;\n } catch {\n return false;\n }\n }\n\n /**\n * Connect a specific wallet by id (e.g. 'coinbase' for Base Wallet deep link on mobile).\n * Host can use this for \"Connect with Base\" without opening the wallet modal.\n * Resolves when connected; rejects on error.\n */\n async connectWallet(walletId: string): Promise<void> {\n const pnp = await this.getOrCreatePnp();\n if (!pnp || !walletId) throw new Error('Wallet not available');\n const id = (walletId || '').toLowerCase();\n const result = await pnp.connect(id);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || pnp.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n this.lastWalletId = id;\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: id } })); } catch {}\n this.requestUpdate();\n }\n\n private async ensureWallet(): Promise<boolean> {\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return false;\n }\n return true;\n }\n\n if (this.walletConnected) return true;\n try {\n const pnp = await this.getOrCreatePnp();\n const availableWallets = pnp.getEnabledWallets();\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return false;\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n\n private connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n this.lastWalletId = (walletId || '').toLowerCase();\n const promise = this.pnp.connect(walletId);\n promise.then((result: any) => {\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n const normalized = normalizeConnectedWallet(this.pnp, result);\n const evmProvider = (this.pnp as any)?.getEvmProvider?.();\n const solanaProvider = (this.pnp as any)?.getSolanaProvider?.();\n this.config = { ...this.config, connectedWallet: normalized, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }), ...(evmProvider ? { evmProvider } : {}), ...(solanaProvider ? { solanaProvider } : {}) } as any;\n this.sdk = null;\n // After any successful wallet connect (including Oisy), open token-balance picker inside wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n this.showWalletModal = true;\n this.fetchAndShowBalances();\n }).catch((error: any) => {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n });\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-error', { detail: { message: this.errorMessage, code: 'WALLET_CONNECT_ERROR' } })); } catch {}\n }\n }\n\n private async fetchAndShowBalances() {\n try {\n this.balancesLoading = true;\n this.balancesError = null;\n // Integrated into wallet modal\n this.walletModalStep = 'balances';\n this.showBalanceModal = false;\n const sdk = createSdk(this.config);\n const { balances } = await getWalletBalanceEntries({\n sdk,\n lastWalletId: this.lastWalletId,\n connectedWallet: (this.config as any)?.connectedWallet,\n amountUsd: Number(this.amountUsd ?? 0),\n fiatCurrency: (this.config as any)?.fiat_currency,\n chainShortcodes: (this.config as any)?.chainShortcodes,\n tokenShortcodes: (this.config as any)?.tokenShortcodes,\n });\n this.walletBalances = balances as any[];\n } catch (e: any) {\n this.walletBalances = [];\n this.balancesError = (e && (e.message || String(e))) || 'Failed to load balances';\n } finally {\n this.balancesLoading = false;\n }\n }\n\n private onSelectBalanceSymbol = async (shortcode: string) => {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n if (sel?.ledgerSymbol) this.selectedSymbol = sel.ledgerSymbol;\n // Close wallet modal before starting progress to reveal progress bar\n this.showBalanceModal = false;\n this.showWalletModal = false;\n if (isEvmWalletId(this.lastWalletId)) {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const targetChain = sel?.chainId;\n ensureEvmChain(targetChain, { provider: (this.pnp as any)?.getEvmProvider?.() || (this.config as any)?.evmProvider, chainName: sel?.chainName, rpcUrlPublic: (sel as any)?.rpcUrlPublic, nativeSymbol: sel?.ledgerSymbol, decimals: sel?.decimals }).then(async () => {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.amountUsd || 0);\n // Attempt X402 flow first if accepted (skip on Base/iOS: Passkey returns WebAuthn blob, not ECDSA)\n if (sel?.x402Accepts && !shouldSkipX402ForBaseOnIos(this.lastWalletId)) {\n try {\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId,\n icpay_context: 'amount-input:x402'\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n this.showBalanceModal = false;\n return;\n } catch (e) {\n // fall back to normal flow, but surface error if user should see it\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay_network: 'evm',\n icpay_ledger_id: sel?.ledgerId\n },\n recipientAddress: ((((this.config as any)?.recipientAddresses) || {})?.evm) || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n this.showBalanceModal = false;\n });\n return;\n }\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') {\n // IC flow: send using tokenShortcode same as EVM\n try {\n const sel = (this.walletBalances || []).find((b: any) => (b as any)?.tokenShortcode === shortcode);\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.amountUsd || 0);\n const chainName = String((sel as any)?.ledgerName || (sel as any)?.chainName || '').toLowerCase();\n const isSol = chainName.includes('sol');\n const isIc = chainName.includes('ic');\n const dest = (this.config as any)?.recipientAddresses || {};\n const chosen = isSol ? (dest.sol || dest.ic) : (dest.ic);\n // If Solana token supports x402, try x402 flow first\n if ((sel as any)?.x402Accepts) {\n try {\n const metadata = {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: isSol ? 'sol' : (isIc ? 'ic' : (this.config as any)?.icpay_network),\n icpay_ledger_id: (sel as any)?.ledgerId,\n icpay_context: 'amount-input:x402'\n }\n };\n await (sdk.client as any).createPaymentX402Usd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata,\n recipientAddress: (chosen || ''),\n fiat_currency: (this.config as any)?.fiat_currency,\n });\n return;\n } catch (e) {\n // Do not fallback to normal flow for Solana x402; surface error\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n return;\n }\n }\n await (sdk.client as any).createPaymentUsd({\n usdAmount: amountUsd,\n tokenShortcode: (sel as any)?.tokenShortcode,\n metadata: {\n ...(this.config as any)?.metadata,\n icpay: {\n ...(((this.config as any)?.metadata || {})?.icpay || {}),\n icpay_network: 'ic',\n icpay_ledger_id: sel?.ledgerId\n }\n },\n recipientAddress: chosen || '0x0000000000000000000000000000000000000000',\n }).catch((err: any) => { throw err; });\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n };\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n // Close modal and start our own flow\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const amountUsd = Number(this.amountUsd);\n const resp = await (sdk as any).startOnrampUsd(amountUsd, undefined, { context: 'amount-input:onramp', onrampPayment: true, onrampProvider: (this as any)?.selectedOnrampProvider || 'coinbase' });\n const url =\n resp?.metadata?.onramp?.url ||\n resp?.onramp?.url ||\n resp?.metadata?.icpay_onramp?.url ||\n resp?.paymentIntent?.metadata?.icpay?.onrampUrl ||\n resp?.metadata?.icpay?.onrampUrl ||\n null;\n const paymentIntentId = resp?.metadata?.icpay_payment_intent_id || resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.icpay_onramp?.errorMessage || resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (url) {\n (this as any).onrampUrl = url;\n this.onrampErrorMessage = null;\n try {\n window.open(url, 'icpay_onramp', 'noopener,noreferrer');\n try { window.dispatchEvent(new CustomEvent('icpay-onramp-opened', { detail: { url } })); } catch {}\n } catch {}\n this.startOnrampPolling();\n } else {\n (this as any).onrampUrl = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n (this as any).onrampUrl = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private resetPaymentFlow() {\n resetPaymentFlowUtil(this as PaymentFlowResetContext, { pendingAction: 'pay' });\n }\n\n private async pay() {\n if (!isBrowser) return;\n\n this.resetPaymentFlow();\n\n if (!this.isValidAmount()) {\n this.errorMessage = 'Please enter a valid amount';\n this.errorSeverity = ErrorSeverity.WARNING;\n return;\n }\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.amountUsd, currency: this.selectedSymbol || 'ICP' } })); } catch {}\n\n this.processing = true;\n try {\n const ready = await this.ensureWallet();\n if (!ready) return;\n\n this.showWalletModal = true;\n await this.fetchAndShowBalances();\n return;\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n // On failure, disconnect so next attempt triggers wallet selection again\n try {\n if (!this.config.useOwnWallet && this.pnp) {\n await this.pnp.disconnect?.();\n this.walletConnected = false;\n this.config = { ...this.config, actorProvider: undefined as any, connectedWallet: undefined } as any;\n }\n } catch {}\n } finally {\n this.processing = false;\n }\n }\n\n render() {\n if (!this.config) return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n const placeholder = this.config?.placeholder || 'Enter amount in USD';\n const payLabelRaw = this.config?.buttonLabel || 'Pay with crypto';\n const payLabel = payLabelRaw\n .replace('{amount}', this.amountUsd ? `${Number(this.amountUsd).toFixed(2)}` : '$0.00')\n .replace('{symbol}', this.selectedSymbol || 'ICP');\n const selectedLabel = this.selectedSymbol || 'ICP';\n const progressEnabled = this.config?.progressBar?.enabled !== false;\n const showProgressBar = progressEnabled;\n\n return html`\n <div class=\"icpay-card icpay-section icpay-widget-base\">\n ${showProgressBar ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.amountUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n\n <div class=\"row\">\n <div class=\"top-row\">\n <div class=\"amount-field\">\n <span class=\"currency-prefix\">$</span>\n <input type=\"number\" min=\"0\" step=\"${Number(this.config?.stepUsd ?? 0.5)}\" .value=${String(this.amountUsd || '')} placeholder=\"${placeholder}\" @input=${(e: any) => this.onInputChange(e)} />\n </div>\n ${null}\n </div>\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.pay()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : payLabel)}\n </button>\n </div>\n <div class=\"hint\">Min: $${Number(this.config?.minUsd ?? 0.5).toFixed(2)}${this.config?.maxUsd ? `, Max: $${Number(this.config.maxUsd).toFixed(2)}` : ''}</div>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`<button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">${this.errorAction}</button>` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = (buildWalletEntries as any)(walletsRaw);\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n step: this.walletModalStep,\n balances: this.walletModalStep === 'balances' ? (this.walletBalances as any) : [],\n balancesLoading: this.walletModalStep === 'balances' ? this.balancesLoading : false,\n balancesError: this.walletModalStep === 'balances' ? this.balancesError : null,\n onSelectBalance: (s: string) => this.onSelectBalanceSymbol(s),\n onBack: () => { this.walletModalStep = 'connect'; },\n onSwitchAccount: () => this.onSwitchAccount(null),\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; this.oisyReadyToPay = false; try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-cancelled', { detail: { reason: 'user_cancelled' } })); } catch {} },\n onDismiss: () => { this.showWalletModal = false; this.oisyReadyToPay = false; }, // Close without triggering cancellation events\n onCreditCard: ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.amountUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled === true) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n oisyReadyToPay: this.oisyReadyToPay,\n onOisyPay: () => { this.showWalletModal = false; this.oisyReadyToPay = false; this.pay(); },\n theme: themeMode\n });\n })()}\n\n ${(() => {\n const themeMode = this.config?.theme ? (typeof this.config.theme === 'string' ? this.config.theme : (this.config.theme.mode || 'light')) : undefined;\n return html`\n ${renderWalletBalanceModal({\n visible: this.showBalanceModal,\n isLoading: this.balancesLoading,\n error: this.balancesError,\n balances: this.walletBalances as any,\n onSelect: (s: string) => this.onSelectBalanceSymbol(s),\n onClose: () => { this.showBalanceModal = false; },\n theme: themeMode\n })}\n\n ${renderOnrampModal({\n visible: this.showOnrampModal,\n url: (this as any).onrampUrl || undefined,\n errorMessage: this.onrampErrorMessage || undefined,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; },\n title: 'Pay with credit card',\n theme: themeMode\n })}\n `;\n })()}\n <div class=\"icpay-powered-by\">\n <a href=\"https://icpay.org\" target=\"_blank\" rel=\"noopener noreferrer\">Powered by icpay</a>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-amount-input': ICPayAmountInput } }\n\n\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA4vBaC,EAAA,CAA5BC,GAAS,CAAE,KAAM,OAAQ,CAAC,GA7vBhB/D,EA6vBkB,oBACA8D,EAAA,CAA5BC,GAAS,CAAE,KAAM,OAAQ,CAAC,GA9vBhB/D,EA8vBkB,yBACF8D,EAAA,CAA1BC,GAAS,CAAE,KAAM,KAAM,CAAC,GA/vBd/D,EA+vBgB,qBACC8D,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAhwBf/D,EAgwBiB,sBACA8D,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAjwBf/D,EAiwBiB,wBACA8D,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAlwBf/D,EAkwBiB,4BACC8D,EAAA,CAA5BC,GAAS,CAAE,KAAM,OAAQ,CAAC,GAnwBhB/D,EAmwBkB,qBACZ8D,EAAA,CAAhBE,EAAM,GApwBIhE,EAowBM,2BACA8D,EAAA,CAAhBE,EAAM,GArwBIhE,EAqwBM,yBACA8D,EAAA,CAAhBE,EAAM,GAtwBIhE,EAswBM,sBACA8D,EAAA,CAAhBE,EAAM,GAvwBIhE,EAuwBM,4BACA8D,EAAA,CAAhBE,EAAM,GAxwBIhE,EAwwBM,2BACA8D,EAAA,CAAhBE,EAAM,GAzwBIhE,EAywBM,4BACA8D,EAAA,CAAhBE,EAAM,GA1wBIhE,EA0wBM,4BACA8D,EAAA,CAAhBE,EAAM,GA3wBIhE,EA2wBM,6BACA8D,EAAA,CAAhBE,EAAM,GA5wBIhE,EA4wBM,+BACA8D,EAAA,CAAhBE,EAAM,GA7wBIhE,EA6wBM,mCAEA8D,EAAA,CAAhBE,EAAM,GA/wBIhE,EA+wBM,+BACA8D,EAAA,CAAhBE,EAAM,GAhxBIhE,EAgxBM,iCACA8D,EAAA,CAAhBE,EAAM,GAjxBIhE,EAixBM,uCAEA8D,EAAA,CAAhBE,EAAM,GAnxBIhE,EAmxBM,iCACA8D,EAAA,CAAhBE,EAAM,GApxBIhE,EAoxBM,kCACA8D,EAAA,CAAhBE,EAAM,GArxBIhE,EAqxBM,+BACA8D,EAAA,CAAhBE,EAAM,GAtxBIhE,EAsxBM,4BAEW8D,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAxxBf/D,EAwxBiB,qBAxxBjBA,EAAN8D,EAAA,CADNG,GAAc,oBAAoB,GACtBjE,GExDb,OAAS,QAAAkE,OAA4B,MAGrC,SAASC,GAAaC,EAAoD,CAExE,GAAIA,IAAkB,SAAWA,IAAkB,OAAQ,OAAOA,EAElE,GAAI,OAAO,SAAa,IAAa,MAAO,QAE5C,IAAMC,EAAa,SAAS,gBAAgB,aAAa,kBAAkB,EAC3E,GAAIA,IAAe,SAAWA,IAAe,OAAQ,OAAOA,EAE5D,IAAMC,EAAQ,SAAS,gBAAgB,aAAa,YAAY,EAChE,OAAIA,IAAU,SAAWA,IAAU,OAAeA,EAE3C,OACT,CAcO,SAASC,EAAkBC,EAAiD,CAClF,GAAI,CAACA,EAAK,QAAS,OAAO,KAC1B,IAAMC,EAAQD,EAAK,OAAS,IACtBE,EAASF,EAAK,QAAU,IACxBG,EAAS,OAAOH,EAAK,KAAQ,WAAaA,EAAK,KAAO,IAAI,WAAW,MAAM,EAC3EI,EAAYT,GAAaK,EAAK,KAAK,EACzC,OAAON;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDA0EgDU,CAAS;AAAA;AAAA,qBAE5CJ,EAAK,OAAO;AAAA,MAC3BA,EAAK,OAASN,oBAAsBM,EAAK,MAAM,gPAAkP,IAAI;AAAA,mGACxMA,EAAK,OAAS,mBAAmB;AAAA,MAC9HG,EAAST;AAAA;AAAA;AAAA,aAGFM,EAAK,GAAG;AAAA,8BACS,OAAOC,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAK,WAAW,OAAOC,GAAW,SAAW,GAAGA,CAAM,KAAOA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,iBAK3HF,EAAK,GAAG;AAAA;AAAA,MAEjBN;AAAA,yBACiB,OAAOO,GAAU,SAAW,GAAGA,CAAK,KAAOA,CAAK,WAAW,OAAOC,GAAW,SAAW,GAAGA,CAAM,KAAOA,CAAM;AAAA,QAC/HF,EAAK,cAAgB,0BAA0B;AAAA;AAAA,KAElD;AAAA;AAAA;AAAA,EAIL,CCtIA,OAAS,cAAAK,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBCD/C,OAAS,QAAAC,OAA4B,MCyBrC,IAAMC,GAAiB,IAAI,IAAI,CAAC,WAAY,gBAAiB,WAAY,QAAS,UAAW,QAAS,MAAO,OAAO,CAAC,EAC/GC,GAAiB,IAAI,IAAI,CAAC,UAAW,UAAU,CAAC,EAE/C,SAASC,EAAcC,EAAmC,CAC/D,OAAKA,EACEH,GAAe,IAAI,OAAOG,CAAQ,EAAE,YAAY,CAAC,EADlC,EAExB,CAKO,SAASC,GAAYC,EAAsB,CAChD,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EACjD,CAEO,SAASC,GAAeD,EAAsB,CACnD,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAC1D,CAEO,SAASE,GAAcF,EAA6B,CACzD,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IACjD,CAEO,SAASG,EAAmBC,EAAiC,CAClE,OAAQA,GAAO,CAAC,GAAG,IAAKJ,IAAO,CAAE,GAAID,GAAYC,CAAC,EAAG,MAAOC,GAAeD,CAAC,EAAG,KAAME,GAAcF,CAAC,CAAE,EAAE,CAC1G,CAMA,eAAsBK,EACpBC,EACAC,EACkB,CAClB,GAAI,CACF,IAAMC,EAAiBD,GAAc,WAAa,OAAO,OAAW,IAAe,OAAe,SAAW,MAC7G,GAAI,CAACC,GAAYF,IAAkB,QAAaA,IAAkB,KAAM,MAAO,GAC/E,IAAMG,EAAa,OAAOH,GAAkB,SACxCA,EACC,OAAOA,CAAa,EAAE,WAAW,IAAI,EAAI,SAAS,OAAOA,CAAa,EAAG,EAAE,EAAI,SAAS,OAAOA,CAAa,EAAG,EAAE,EACtH,GAAI,CAAC,OAAO,SAASG,CAAU,EAAG,MAAO,GACzC,IAAMC,EAAqB,MAAMF,EAAS,QAAQ,CAAE,OAAQ,aAAc,CAAC,EAE3E,GADgB,SAASE,EAAY,EAAE,IACvBD,EAAY,MAAO,GACnC,IAAME,EAAM,KAAOF,EAAW,SAAS,EAAE,EACzC,aAAMD,EAAS,QAAQ,CAAE,OAAQ,6BAA8B,OAAQ,CAAC,CAAE,QAASG,CAAI,CAAC,CAAE,CAAC,EACpF,EACT,MAAY,CAEV,GAAI,CACF,IAAMH,EAAiBD,GAAc,WAAa,OAAO,OAAW,IAAe,OAAe,SAAW,MAC7G,GAAI,CAACC,GAAYF,IAAkB,QAAaA,IAAkB,KAAM,MAAO,GAC/E,IAAMG,EAAa,OAAOH,GAAkB,SACxCA,EACC,OAAOA,CAAa,EAAE,WAAW,IAAI,EAAI,SAAS,OAAOA,CAAa,EAAG,EAAE,EAAI,SAAS,OAAOA,CAAa,EAAG,EAAE,EAChHK,EAAM,KAAOF,EAAW,SAAS,EAAE,EACnCG,EAAYL,GAAM,WAAa,WAAWE,CAAU,GACpDI,GAAWN,GAAM,aAAe,CAACA,EAAK,YAAY,EAAI,CAAC,GAAG,OAAO,OAAO,EACxEO,EAAiB,CACrB,KAAMP,GAAM,cAAgB,MAC5B,OAAQA,GAAM,cAAgB,MAC9B,SAAW,OAAOA,GAAM,UAAa,UAAY,SAASA,EAAK,QAAQ,EAAIA,EAAK,SAAW,EAC7F,EACA,aAAMC,EAAS,QAAQ,CAAE,OAAQ,0BAA2B,OAAQ,CAAC,CAAE,QAASG,EAAK,UAAAC,EAAW,QAAAC,EAAS,eAAAC,CAAe,CAAC,CAAE,CAAC,EACrH,EACT,MAAQ,CACN,MAAO,EACT,CACF,CACF,CAEA,eAAsBC,EAAwBC,EAS9C,CACE,GAAM,CAAE,IAAAC,EAAK,aAAAC,EAAc,gBAAAC,EAAiB,UAAAC,EAAW,aAAAC,EAAc,gBAAAC,EAAiB,gBAAAC,CAAgB,EAAIP,EACtGQ,EACEC,GAAWP,GAAgB,IAAI,YAAY,EAC3CQ,GAAmBP,GAAiB,OAASA,GAAiB,WAAa,IAAI,SAAS,EAC9F,GAAI,CACEM,GAAW9B,GAAe,IAAI8B,CAAO,EACvCD,EAAW,MAAOP,GAAK,QAAgB,4BAA4B,CAAE,QAAS,MAAO,QAASS,EAAiB,UAAAN,EAAW,aAAAC,EAAc,gBAAAC,EAAiB,gBAAAC,CAAgB,CAAC,EACjKE,GAAW7B,GAAe,IAAI6B,CAAO,EAC9CD,EAAW,MAAOP,GAAK,QAAgB,4BAA4B,CAAE,QAAS,MAAO,QAASS,EAAiB,UAAAN,EAAW,aAAAC,EAAc,gBAAAC,EAAiB,gBAAAC,CAAgB,CAAC,EAG1KC,EAAW,MAAOP,GAAK,QAAgB,4BAA4B,CAAE,QAAS,KAAM,UAAWS,EAAiB,UAAAN,EAAW,aAAAC,EAAc,gBAAAC,EAAiB,gBAAAC,CAAgB,CAAC,CAE/K,MAAQ,CAENC,EAAW,CAAE,SAAU,CAAC,EAAG,iBAAkB,EAAG,YAAa,IAAI,IAAO,CAC1E,CA2BA,MAAO,CACL,UA1BsCA,GAAU,UAAY,CAAC,GAAG,IAAKG,IAAY,CACjF,SAAUA,EAAE,SACZ,WAAYA,EAAE,WACd,aAAcA,EAAE,aAChB,eAAgBA,EAAE,gBAAkBA,EAAE,WAAa,KACnD,WAAYA,EAAE,WACd,eAAgBA,GAAG,gBAAkB,KACrC,YAAaA,GAAG,aAAe,KAAO,EAAQA,EAAE,YAAe,OAC/D,QAASA,EAAE,QACX,iBAAkBA,EAAE,iBACpB,SAAUA,EAAE,SACZ,aAAcA,EAAE,aAChB,gBAAiBA,EAAE,gBAAkB,IAAI,KAAKA,EAAE,eAAe,EAAI,OACnE,YAAaA,EAAE,YAAc,IAAI,KAAKA,EAAE,WAAW,EAAI,IAAI,KAC3D,QAAS,OAAOA,EAAE,SAAY,SAAWA,EAAE,QAAW,OAAOA,EAAE,SAAY,SAAW,OAAOA,EAAE,OAAO,EAAI,OAE1G,UAAWA,EAAE,WAAcA,EAAE,QAAUA,EAAE,MAAM,MAAQA,EAAE,MAAM,YAAeA,EAAE,aAAe,OAC/F,aAAcA,EAAE,aAChB,UAAWA,EAAE,UACb,eAAgBA,EAAE,eAClB,wBAAyBA,EAAE,wBAC3B,qBAAsBA,EAAE,qBACxB,QAASA,EAAE,SAAW,IACxB,EAAE,EAIA,iBAAkBH,GAAU,iBAC5B,YAAaA,GAAU,YAAc,IAAI,KAAKA,EAAS,WAAW,EAAI,IAAI,IAC5E,CACF,CC3JO,SAASI,GAA+BC,EAAgC,CAC7E,IAAMC,EAAI,OAAOD,CAAK,EACtB,GAAI,CAAC,SAASC,CAAC,GAAKA,IAAM,EAAG,MAAO,IAGpC,GAFY,KAAK,IAAIA,CAAC,EAEZ,KAAM,MAAO,YAEvB,IAAMC,EAAS,IAGf,OAFkB,KAAK,MAAMD,EAAIC,CAAM,EAAIA,GACnB,QAAQ,CAAC,EACpB,QAAQ,QAAS,EAAE,EAAE,QAAQ,iBAAkB,IAAI,CAClE,CCXA,OAAS,QAAAC,MAA4B,MAYrC,SAASC,GAAMC,EAA+B,CAC5C,IAAMC,EAAM,WAAW,OAAOD,EAAE,kBAAoB,GAAG,CAAC,EAClDE,EAAQ,OAAQF,EAAU,cAAgB,CAAC,EAC3CG,GAAO,SAASF,CAAG,EAAIA,EAAM,IAAM,SAASC,CAAK,EAAIA,EAAQ,GACnE,OAAO,SAASC,CAAG,EAAIA,EAAM,CAC/B,CAEA,IAAMC,GAAY,CAACC,EAAuBL,IAA0BD,GAAMC,CAAC,EAAID,GAAMM,CAAC,EAE/E,SAASC,IAAsC,CACpD,OAAOC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WA8DT,CAEO,SAASC,GAAqBC,EAAsC,CACzE,IAAMC,EAAqBC,GAAiCC,GAA+BD,CAAG,EAC9F,OAAOJ;AAAA;AAAA,2CAEkCE,EAAK,MAAM;AAAA;AAAA;AAAA,MAGhDA,EAAK,UAAYF;AAAA;AAAA,MAEdE,EAAK,MAAQF;AAAA,mDAC6BE,EAAK,KAAK;AAAA,MACrDF;AAAA;AAAA,WAEG,IAAM,CACP,IAAMM,GAAcJ,EAAK,UAAY,CAAC,GACnC,OAAOT,GAAKA,EAAE,uBAAyB,IAAQA,EAAE,uBAAyB,MAAS,EACnF,KAAKI,EAAS,EACjB,OAAOS,EAAW,OAAS,EAAIN;AAAA,cAC3BM,EAAW,IAAKb,GAAM,CACtB,IAAMc,GAAOd,EAAE,cAAgB,IAAI,YAAY,EACzCe,EAAYf,EAAE,QAAU,GAAMc,IAAQ,MAAQ,WAAcA,IAAQ,OAAS,YAAeA,IAAQ,OAAS,YAAc,GACjI,OAAOP;AAAA,oDAC+B,IAAME,EAAK,SAAUT,EAAU,gBAAkBA,EAAE,YAAY,CAAC;AAAA,8CACtEe,CAAS;AAAA,sBACjCf,EAAE,QACAO,cAAiBP,EAAE,OAAO,UAAUc,CAAG,2DACvCP,UAAaO,EAAI,MAAM,EAAE,CAAC,CAAC,SAAS;AAAA;AAAA;AAAA,iDAGXd,EAAE,UAAU;AAAA,oDACTA,EAAE,WAAa,EAAE;AAAA;AAAA;AAAA,kDAGnBU,EAAkBV,EAAE,gBAAgB,CAAC,IAAIc,CAAG;AAAA,sDACxCf,GAAMC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,eAI7D,CAAC,CAAC;AAAA,YACAO,8FACN,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMS,GAAgBP,EAAK,UAAY,CAAC,GACrC,OAAOT,GAAKA,EAAE,uBAAyB,EAAK,EAC5C,KAAKI,EAAS,EACjB,OAAOY,EAAa,OAAS,EAAIT;AAAA,cAC7BS,EAAa,IAAKhB,GAAM,CACxB,IAAMc,GAAOd,EAAE,cAAgB,IAAI,YAAY,EACzCe,EAAYf,EAAE,QAAU,GAAMc,IAAQ,MAAQ,WAAcA,IAAQ,OAAS,YAAeA,IAAQ,OAAS,YAAc,GACjI,OAAOP;AAAA;AAAA,8CAEyBQ,CAAS;AAAA,sBACjCf,EAAE,QACAO,cAAiBP,EAAE,OAAO,UAAUc,CAAG,2DACvCP,UAAaO,EAAI,MAAM,EAAE,CAAC,CAAC,SAAS;AAAA;AAAA;AAAA,iDAGXd,EAAE,UAAU;AAAA,oDACTA,EAAE,WAAa,EAAE;AAAA;AAAA;AAAA,uDAGdA,EAAE,yBAA2B,IAAI;AAAA,qDACnCU,EAAkBV,EAAE,gBAAgB,CAAC,IAAIc,CAAG;AAAA;AAAA;AAAA,eAIrF,CAAC,CAAC;AAAA,YACA,IACN,GAAG,CAAC;AAAA;AAAA,KAEN;AAAA;AAAA;AAAA,2CAGqC,IAAM,CAAE,GAAI,CAAE,OAAO,KAAK,uCAAuC,SAAS,qBAAqB,CAAG,MAAQ,CAAC,CAAE,CAAC;AAAA;AAAA,GAGzJ,CH5JA,SAASG,GAAaC,EAAoD,CAExE,GAAIA,IAAkB,SAAWA,IAAkB,OAAQ,OAAOA,EAElE,GAAI,OAAO,SAAa,IAAa,MAAO,QAE5C,IAAMC,EAAa,SAAS,gBAAgB,aAAa,kBAAkB,EAC3E,GAAIA,IAAe,SAAWA,IAAe,OAAQ,OAAOA,EAE5D,IAAMC,EAAQ,SAAS,gBAAgB,aAAa,YAAY,EAChE,OAAIA,IAAU,SAAWA,IAAU,OAAeA,EAE3C,OACT,CAIA,SAASC,GAAgBC,EAAqB,CAE5C,MADI,CAACA,GACD,CAACA,EAAI,WAAW,OAAO,EAAUA,EAE9BA,EAAI,QAAQ,OAAQ,EAAE,CAC/B,CAEA,SAASC,GAAsBC,EAAYC,EAA2B,CACpE,IAAMC,GAASF,GAAM,IAAI,YAAY,EACrC,OAAIE,IAAU,KAAa,oBACvBA,IAAU,OAAe,OACzBA,IAAU,OAAe,OACzBA,IAAU,OAAe,OACzBD,GAAYA,EAAS,KAAK,EAAUA,EACjCD,EAAKA,EAAG,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAG,MAAM,CAAC,EAAI,QACzD,CA2BO,SAASG,EAA0BC,EAA6F,CACrI,GAAI,CAACA,EAAK,QAAS,OAAO,KAC1B,GAAM,CAAE,QAAAC,EAAS,SAAAC,EAAU,QAAAC,EAAS,aAAAC,CAAa,EAAIJ,EAC/CK,EAAqBC,GAAiCC,GAA+BD,CAAG,EACxFE,EAASC,GAAkC,CAC/C,IAAMC,EAAM,WAAW,OAAOD,EAAE,kBAAoB,GAAG,CAAC,EAClDE,EAAQ,OAAQF,EAAU,cAAgB,CAAC,EAC3CG,GAAO,SAASF,CAAG,EAAIA,EAAM,IAAM,SAASC,CAAK,EAAIA,EAAQ,GACnE,OAAO,SAASC,CAAG,EAAIA,EAAM,CAC/B,EACMC,EAAY,CAACC,EAAuBL,IAA0BD,EAAMC,CAAC,EAAID,EAAMM,CAAC,EAChFC,EAAoBd,EAAQ,IAAIe,GAAK,CACzC,IAAMpB,GAAMoB,EAAE,IAAM,IAAI,YAAY,EACpC,MAAO,CACL,GAAGA,EAEH,KAAMA,EAAE,MAAQ,IAClB,CACF,CAAC,EACKC,EAAY5B,GAAaW,EAAK,KAAK,EAgBzC,OAAOkB;AAAA,mDAC0CD,CAAS,YAhB9BE,GAAkB,CAExCA,EAAE,SAAWA,EAAE,gBACjBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAGdnB,EAAK,UACPA,EAAK,UAAU,EAGfA,EAAK,QAAQ,EAGnB,CAEwF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAiIlFoB,GAAoB,CAAC;AAAA,kCACMD,GAAkBA,EAAE,gBAAgB,CAAC;AAAA,UAC9DnB,EAAK,OAAS,WAAakB;AAAA,YACzBG,GAAqB,CACrB,UAAW,CAAC,CAACrB,EAAK,gBAClB,MAAOA,EAAK,cACZ,SAAUA,EAAK,SACf,OAAQ,IAAMA,EAAK,QAAUA,EAAK,OAAO,EACzC,SAAWsB,GAAmBtB,EAAK,iBAAmBA,EAAK,gBAAgBsB,CAAM,CACnF,CAAC,CAAC;AAAA,UACAJ;AAAA;AAAA;AAAA,kDAGsC,IAAM,CAAE,GAAI,CAAEf,EAAQ,CAAG,MAAQ,CAAC,CAAE,CAAC;AAAA;AAAA;AAAA,cAGzEH,EAAK,gBAAkBA,EAAK,aAAekB;AAAA,oIAC2E,IAAMlB,EAAK,cAAgBA,EAAK,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,6CAKrIA,EAAK,iBAAmB,sBAAsB;AAAA,oBACvEA,EAAK,kBAAoBkB,gCAAkClB,EAAK,iBAAiB,SAAW,IAAI;AAAA;AAAA;AAAA;AAAA,cAIpG,IAAI;AAAA,eACL,IAAM,CACP,IAAMuB,EAA0B,CAAC,EAC7BC,EAAyC,KAC7C,OAAAT,EAAkB,QAASC,GAAM,CAC/B,IAAMpB,GAAMoB,EAAE,IAAM,IAAI,YAAY,EAC9BS,EAAc9B,GAAsBqB,EAAE,GAAIA,EAAE,KAAK,EACjDU,GAAQC,EAAc/B,CAAE,EACxBgC,GAA8BhC,IAAO,WAAaA,IAAO,WAAc,MAAS8B,GAAQ,MAAQ,KAElGF,IAAc,MAAQI,KAASJ,GACjCD,EAAM,KAAKL,+BAAiC,EAE9C,IAAMW,GACHjC,IAAO,QAAUA,IAAO,QAAUA,IAAO,QAAUA,IAAO,KACvD,oBACCA,IAAO,WAAaA,IAAO,WAC1B,SACC8B,GAAQ,sBAAwB,GACzCH,EAAM,KAAKL;AAAA,4DACiCd,EAAa,GAAI,CAAC,YAAY,IAAMF,EAASc,EAAE,EAAE,CAAC;AAAA;AAAA,wBAEtFA,EAAE,KACAE,eAAiBzB,GAAgBuB,EAAE,IAAI,CAAC,UAAUS,CAAW,mEAC7DP,WAAaO,EAAY,OAAO,CAAC,CAAC,SAAS;AAAA;AAAA;AAAA,iDAGpBA,CAAW;AAAA,wBACpCI,GAAaX,gCAAkCW,EAAU,SAAW,IAAI;AAAA;AAAA;AAAA,iBAG/E,EACDL,EAAYI,EACd,CAAC,EACML,CACT,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,iDAIiC,IAAM,CAAE,GAAI,CAAE,OAAO,KAAK,qCAAqC,SAAS,qBAAqB,CAAG,MAAQ,CAAC,CAAE,CAAC;AAAA;AAAA,SAEpJ;AAAA;AAAA;AAAA,GAIT,CI/SA,OAAS,QAAAO,OAA4B,MAKrC,SAASC,GAAaC,EAAoD,CAExE,GAAIA,IAAkB,SAAWA,IAAkB,OAAQ,OAAOA,EAElE,GAAI,OAAO,SAAa,IAAa,MAAO,QAE5C,IAAMC,EAAa,SAAS,gBAAgB,aAAa,kBAAkB,EAC3E,GAAIA,IAAe,SAAWA,IAAe,OAAQ,OAAOA,EAE5D,IAAMC,EAAQ,SAAS,gBAAgB,aAAa,YAAY,EAChE,OAAIA,IAAU,SAAWA,IAAU,OAAeA,EAE3C,OACT,CAYO,SAASC,EAAyBC,EAAsC,CAC7E,GAAI,CAACA,EAAK,QAAS,OAAO,KAE1B,IAAMC,EAAYN,GAAaK,EAAK,KAAK,EACzC,OAAOE;AAAA,mDAC0CD,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAsDpDE,GAAoB,CAAC;AAAA;AAAA,UAEnBC,GAAqB,CACrB,UAAWJ,EAAK,UAChB,MAAOA,EAAK,MACZ,SAAUA,EAAK,SACf,OAAQA,EAAK,QACb,SAAUA,EAAK,QACjB,CAAC,CAAC;AAAA;AAAA;AAAA,GAIV,CC7FO,SAASK,EAA2BC,EAA8C,CACvF,GAAI,CAACA,GAAY,OAAOA,CAAQ,EAAE,YAAY,IAAM,WAAY,MAAO,GACvE,GAAI,CACF,IAAMC,EAAK,OAAO,UAAc,IAAc,OAAO,UAAU,WAAa,EAAE,EAAE,YAAY,EAAI,GAChG,OAAOA,EAAG,SAAS,QAAQ,GAAKA,EAAG,SAAS,MAAM,CACpD,MAAQ,CACN,MAAO,EACT,CACF,CCyCO,SAASC,EAAsBC,EAAe,CACnD,GAAI,CACF,IAAMC,EAAOD,GAAO,CAAC,EACrBC,EAAK,SAAWA,EAAK,UAAY,CAAC,EAClC,IAAMC,EAAOD,EAAK,SAAS,MAAQ,CAAC,EAC9BE,EAAaD,EAAK,QAAU,CAAC,EAC7BE,EAAY,CAChB,GAAID,EAAW,WAAa,CAAC,EAC7B,qBAAsB,GAEtB,4BAA6B,EAC/B,EACA,OAAAF,EAAK,SAAS,KAAO,CAAE,GAAGC,EAAM,OAAQ,CAAE,GAAGC,EAAY,UAAAC,CAAU,CAAE,EAC9DH,CACT,MAAQ,CACN,OAAOD,CACT,CACF,CAIO,SAASK,EAAyBC,EAAUC,EAAyB,CAC1E,GAAI,CACF,IAAMC,EAAcD,IAAkBA,EAAc,OAASA,EAAc,YAAe,KACpFE,EAAeH,GAAOA,EAAI,UAAYA,EAAI,QAAQ,OAASA,EAAI,QAAQ,YAAe,KACtFI,EAAgBC,GAAY,OAAOA,GAAM,SAAWA,EAAKA,GAAK,OAAOA,EAAE,UAAa,WAAaA,EAAE,SAAS,EAAI,KAChHC,EAAYF,EAAaF,CAAU,GAAKE,EAAaD,CAAW,GAAK,KAC3E,OAAIG,EACK,CAAE,MAAOA,EAAW,UAAAA,CAAU,EAGhCL,GAAiB,CAAE,MAAO,IAAK,CACxC,MAAQ,CACN,OAAOA,GAAiB,CAAE,MAAO,IAAK,CACxC,CACF,CAKA,eAAsBM,GAA4BP,EAAkC,CAClF,GAAI,CAEF,IAAMQ,EAAa,OAAOR,GAAK,mBAAsB,WAAaA,EAAI,kBAAkB,KAAKA,CAAG,EAAI,KACpG,GAAI,CAACQ,EAAY,OAAO,KAExB,IAAMC,GADUD,EAAW,GAAK,CAAC,GACT,KAAME,IAAYA,GAAG,IAAM,IAAI,YAAY,IAAM,MAAM,EAC/E,GAAI,CAACD,GAAW,CAACA,EAAQ,QAAS,OAAO,KACzC,IAAME,EAAcF,EAAQ,QACtBG,EAAkB,IAAID,EAAY,CAAE,OAASX,GAAa,QAAU,CAAC,CAAE,CAAC,EAE9E,GAAI,CADuB,MAAMY,EAAgB,YAAY,EAC7C,OAAO,KACvB,IAAMN,EAA2B,MAAMM,EAAgB,aAAa,EACpE,OAAIN,GAAaA,IAAc,YAAoBA,EAC5C,IACT,MAAQ,CACN,OAAO,IACT,CACF,CCrGO,SAASO,IAA6B,CAC3C,GAAI,CACE,OAAO,OAAW,KACpB,OAAO,cAAc,IAAI,YAAY,qBAAqB,CAAC,CAE/D,MAAQ,CAAC,CACX,CAKO,SAASC,GAAkBC,EAAoC,CACpE,IAAMC,EAAID,EACV,GAAI,CAACC,GAAK,OAAOA,GAAM,SAAU,OACjC,IAAMC,EAAaD,EAAE,uBACrB,GAAIC,EAAY,CACd,GAAI,CACFA,EAAW,KAAK,CAClB,MAAQ,CAAC,CACTD,EAAE,uBAAyB,IAC7B,CACA,IAAME,EAAQF,EAAE,gBAChB,GAAIE,GAAS,KAAM,CACjB,GAAI,CACF,aAAaA,CAAK,CACpB,MAAQ,CAAC,CACTF,EAAE,gBAAkB,IACtB,CACI,wBAAyBA,IAAGA,EAAE,oBAAsB,GAC1D,CAKO,SAASG,GAAyBJ,EAAoC,CAC3E,IAAMC,EAAID,EACV,GAAI,CAACC,GAAK,OAAOA,GAAM,SAAU,OACjC,IAAMI,EAASJ,EAAE,OACXK,EAAML,EAAE,IACd,GAAI,EAAAI,GAAQ,cAAgB,CAACC,GAAO,CAACD,GACrC,IAAI,CACFC,EAAI,aAAa,CACnB,MAAQ,CAAC,CACTL,EAAE,OAAS,CAAE,GAAGI,EAAQ,cAAe,OAAW,gBAAiB,MAAU,EAC/E,CAQO,SAASE,GACdP,EACAQ,EACM,CACN,IAAMP,EAAKD,GAAmC,CAAC,EAC/C,GAAI,OAAOC,GAAM,SAAU,OAC3B,IAAMQ,EAAa,CAAC,CAACD,EAAQ,oBAC7BV,GAAqB,EAErBG,EAAE,aAAe,KACjBA,EAAE,cAAgB,KAClBA,EAAE,YAAc,KAChBA,EAAE,WAAa,GACfA,EAAE,iBAAmB,GACrBA,EAAE,eAAiB,KACnBA,EAAE,cAAgBO,EAAQ,cAC1BP,EAAE,eAAiB,GACnBA,EAAE,gBAAkB,GACpBA,EAAE,UAAY,KACdA,EAAE,sBAAwB,KAC1BA,EAAE,mBAAqB,KAElBQ,IACHR,EAAE,gBAAkB,GACpBA,EAAE,gBAAkB,UACpBA,EAAE,aAAe,KACjBA,EAAE,gBAAkB,IAGlB,cAAeA,IAAGA,EAAE,UAAY,IAChC,uBAAwBA,IAAGA,EAAE,mBAAqB,IAClD,wBAAyBA,IAAGA,EAAE,oBAAsB,IACpD,uBAAwBA,IAAGA,EAAE,mBAAqB,IAClD,2BAA4BA,IAAGA,EAAE,uBAAyB,MAE9DF,GAAkBC,CAAG,EAChBS,GAAYL,GAAyBJ,CAAG,EAE7C,IAAMU,EAAOV,EAAgC,cACzC,OAAOU,GAAQ,YAAYA,EAAI,KAAKV,CAAG,CAC7C,CRxFA,IAAMW,GAAY,OAAO,OAAW,IAGhCC,GAAoB,KAGxB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAAkCC,EAAW,CAA7C,kCAuDI,KAAQ,eAAgC,KACxC,KAAQ,SAAW,GACnB,KAAQ,UAAY,GACpB,KAAQ,WAAa,GACrB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAA8B,KACtC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KACjB,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KACrD,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAErD,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAuC,CAAC,EACzD,KAAQ,IAAwB,KAChC,KAAQ,uBAA+C,KACvD,KAAQ,SAAiC,KA0LzC,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,MACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC1CC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACtI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EAuQA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAQ,KAAK,gBAAkB,CAAC,GAAG,KAAKC,GAAMA,GAAW,iBAAmBF,CAAS,EAE3F,GADIC,GAAM,eAAc,KAAK,eAAiBA,EAAK,cAC/CE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAKF,GAAMA,GAAW,iBAAmBF,CAAS,EACpFK,EAAcD,GAAK,QAEzB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvBE,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWD,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMG,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,QAAQ,UAAY,CAAC,EACnD,GAAIL,GAAK,aAAe,CAACM,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBL,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,cACjB,CACF,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASO,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBL,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,QACxB,CACF,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOc,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACF,CAAC,EACD,MACF,CACA,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,MAEb,GAAI,CACF,IAAMf,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMF,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FO,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC7CW,EAAY,OAAQhB,GAAa,WAAcA,GAAa,YAAc,EAAE,EAAE,YAAY,EAC1FiB,EAAQD,EAAU,SAAS,KAAK,EAChCE,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASF,GAASC,EAAK,KAAOA,EAAK,GACnCE,EAAOJ,EAAU,SAAS,IAAI,EACpC,GAAKhB,GAAa,YAChB,GAAI,CACF,MAAOG,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBL,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAeiB,EAAQ,MAASG,EAAO,KAAQ,KAAK,QAAgB,cACpE,gBAAkBpB,GAAa,SAC/B,cAAe,cACjB,CACF,EACA,iBAAkBmB,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASZ,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBL,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAkBA,GAAa,QACjC,CACF,EACA,iBAAkBmB,GAAU,4CAC9B,CAAC,EAAE,MAAOL,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EAlmBA,MAAc,mBAAoB,CAChC,GAAI,CACF,GAAI,CAAC,KAAK,QAAU,KAAK,QAAQ,aAAc,OAC/C,IAAMY,EAAM,aAAa,QAAQ,WAAW,EAC5C,GAAI,CAACA,EAAK,OACV,IAAMC,EAAQ,KAAK,MAAMD,CAAG,EAC5B,GAAI,CAACC,GAAO,UAAY,CAACA,GAAO,UAAW,OACtCnC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMoC,EAAa,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACvD,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAC,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClED,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBC,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,IAAMC,EAAM,IAAItC,GAAaoC,CAAK,EAElC,KAAK,gBAAkB,GACvB,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,gBAAiB,CAAE,MAAOD,EAAM,UAAW,UAAWA,EAAM,UAAW,UAAW,EAAM,CAC1F,CACF,MAAQ,CAAC,CACX,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBnC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMuC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAH,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEM,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBN,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAIrC,GAAa2C,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBE,EAAoE,CAChG,GAAI,CACF,IAAMP,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcQ,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEL,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcQ,EAAiC,CACnD,IAAMf,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACe,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMjB,EAAI,QAAQgB,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAASjB,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAegB,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACvD,GAEL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,4BAA6B,CAAE,OAAQ,KAAK,MAAO,CAAC,EAC1F,KAAK,kBAAkB,EACvB,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,iBAAmB,GACxB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,CAET,KAAK,wBAA0B,IAAM,CACnC,KAAK,SAAW,GAChB,KAAK,UAAY,GACjB,KAAK,WAAa,GAElB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,eAAgB,CAAE,OAAQ,CAAE,OAAQ,KAAK,QAAQ,SAAU,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC7J,KAAK,cAAc,CACrB,GACA,GAAI,CACF,OAAO,iBAAiB,kCAAmC,KAAK,sBAAsB,CACxF,MAAQ,CAAC,CAET,KAAK,UAAY,IAAM,CACrB,KAAK,SAAW,GAChB,KAAK,UAAY,GACjB,KAAK,WAAa,GAClB,KAAK,cAAc,CACrB,GACA,GAAI,CACF,OAAO,iBAAiB,eAAgB,KAAK,QAAQ,CACvD,MAAQ,CAAC,EACX,CAEA,sBAA6B,CAC3B,MAAM,qBAAqB,EAC3B,GAAI,CAAE,OAAO,oBAAoB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAC1G,GAAI,KAAK,uBACP,GAAI,CAAE,OAAO,oBAAoB,kCAAmC,KAAK,sBAAsB,CAAG,MAAQ,CAAC,CAE7G,GAAI,KAAK,SACP,GAAI,CAAE,OAAO,oBAAoB,eAAgB,KAAK,QAAQ,CAAG,MAAQ,CAAC,CAE9E,CAEU,QAAQuD,EAAqC,CACrD,GAAIA,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAM5B,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,OAAO,KAAK,MAAM,CAAG,EAAG,CAAC,EAE/D,CACF,CAsBQ,kBAAmB,CACzB6B,GAAqB,KAAM,CAAE,cAAe,KAAM,CAAC,CACrD,CAEA,MAAc,OAAQ,CACpB,GAAK1D,IACD,MAAK,SAET,MAAK,iBAAiB,EAEtBE,GAAS,KAAK,QAAQ,OAAS,GAAO,kCAAmC,CACvE,SAAU,KAAK,OAAO,SACtB,eAAgB,KAAK,eACrB,aAAc,KAAK,OAAO,YAC5B,CAAC,EAED,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,KAAK,OAAO,SAAU,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEpM,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,KAAK,OAAO,cACd,GAAI,CAAC,KAAK,OAAO,cAAe,CAC9B,KAAK,cAAgB,MACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EAC7E,MACF,UAGI,CAAC,KAAK,gBAAiB,CACzBA,GAAS,KAAK,QAAQ,OAAS,GAAO,sCAAsC,EAC5E,GAAI,CACGD,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAE5F,IAAM0D,EADe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBACjEd,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAAK,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACjI,KAAK,QAAgB,aAAYc,EAAM,WAAc,KAAK,OAAe,YAC9E,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAArB,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEqB,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBrB,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAIrC,GAAa0D,CAAK,EACjC,GAAI,CACF,IAAMC,EAAY,MAAMC,GAA4B,KAAK,GAAG,EAC5D,GAAID,EAAW,CACb,KAAK,gBAAkB,GACvB,IAAMZ,EAAaC,EAAyB,KAAK,IAAK,CAAE,MAAOW,EAAW,UAAAA,EAAW,UAAW,EAAK,CAAC,EAChGV,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEhI,KAAK,MAAM,EACH,MACF,CACF,MAAQ,CAAC,CACT,IAAMY,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADA5D,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqB4D,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,KAAK,cAAgB,MACrB,KAAK,gBAAkB,GACvB,MACF,OAASvC,EAAO,CACdrB,GAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4BqB,CAAK,EACvE,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,MACF,CACF,CAKF,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,KAAK,EACrC,MACF,OAAS,EAAG,CAEVD,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAG/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8BwC,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAM1D,EAAY0D,GAAO,KACnBC,EAA8B3D,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAAC2D,GAAW,OAAOA,GAAY,WAC/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAC9B,KAAK,gBAAkB,GACvB,IAAMC,EAAW5D,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmB4D,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CAEF,IAAMC,EAAO,MADDhD,EAAU,KAAK,MAAM,EACD,eAAe,KAAK,OAAO,SAAU,OAAW,CAAE,QAAS,iBAAkB,cAAe,GAAM,eAAgB,UAAW,CAAC,EACxJiD,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EACJH,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KAEF,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACP,KAAK,UAAYA,EACjB,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACE,KAAK,UAAY,KACjB,KAAK,mBAAqBE,GAAgB,8BAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACV,KAAK,UAAY,KACjB,KAAK,mBAAsB,GAAW,SAAW,8BACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAC7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OACtB,IAAMnD,EAAMC,EAAU,KAAK,MAAM,EAC3BoD,EAAiB,IAAM,CAE3B,GADA,KAAK,6BAA6B,EAC9B,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0BrD,EAAY,0BAA0BmD,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAEQ,OAAOM,EAAgB,CAC7B,KAAK,eAAiBA,CACxB,CAEQ,YAAYC,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAE5F,kBAAkBlB,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,KAAK,CACjC,CAAC,EAAE,MAAO5B,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,qBAAqBM,EAAe,CAChD,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMZ,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAAuD,CAAS,EAAI,MAAMC,EAAwB,CAAE,IAAAzD,EAAK,aAAc,KAAK,aAAc,gBAAkB,KAAK,QAAgB,gBAAiB,UAAW,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAG,aAAe,KAAK,QAAgB,aAAc,CAAC,EACrP,KAAK,eAAiBwD,EACtB,KAAK,cAAgB5C,CACvB,OAASR,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiBA,IAAMA,EAAE,SAAW,OAAOA,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAsJA,QAAS,CACP,OAAK,KAAK,OAIHsD;AAAA;AAAA,UAED,KAAK,QAAQ,aAAa,UAAY,GAAQA;AAAA;AAAA,qBAEnC,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,QAAQ,UAAY,CAAC,CAAC;AAAA,4BAC5B,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA;AAAA,qCAEqB,KAAK,SAAW,WAAa,EAAE,kCAAkC,KAAK,OAAO,UAAY,EAAE;AAAA,YACpH,KAAK,SAAW,KAAOA,sCAAwC;AAAA;AAAA;AAAA;AAAA,gCAI3C,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAMzC,KAAK,WAAa,aAAe,EAAE,eAAe,KAAK,YAAc,KAAK,UAAa,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK,WAAW,IAAM,KAAK,MAAM,CAAC;AAAA,YACxP,KAAK,SAAW,WAAc,KAAK,WAAa,oBAC/C,KAAK,QAAQ,aAAe,mBAC1B,QAAQ,WAAY,GAAG,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,EACtE,QAAQ,WAAa,KAAK,gBAAkB,KAAM,CACrD;AAAA;AAAA;AAAA,UAGF,KAAK,aAAeA;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA;AAAA;AAAA,kBAEf,KAAK,WAAW;AAAA;AAAA,cAElB,EAAE;AAAA;AAAA,UAEN,EAAE;AAAA,WACH,IAAM,CACP,IAAMC,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAUC,EAAmBF,CAAU,EACvCG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAc,KAAK,eAAyB,CAAC,EAChF,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBI,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,SAAW3B,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM4B,EAAM,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IAC9S,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,MAAM,CAAG,EAC5F,MAAOH,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOJ;AAAA,cACHQ,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAWF,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOF,CACT,CAAC,CAAC;AAAA;AAAA,cAEAK,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAK,KAAK,WAAa,OACvB,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOL,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAlGCJ,0DAwGX,CACF,EApyBarE,EACJ,OAAS,CAAC+E,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmD5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAtDflF,EAsDiB,sBACXiF,EAAA,CAAhBE,EAAM,GAvDInF,EAuDM,8BACAiF,EAAA,CAAhBE,EAAM,GAxDInF,EAwDM,wBACAiF,EAAA,CAAhBE,EAAM,GAzDInF,EAyDM,yBACAiF,EAAA,CAAhBE,EAAM,GA1DInF,EA0DM,0BACAiF,EAAA,CAAhBE,EAAM,GA3DInF,EA2DM,4BACAiF,EAAA,CAAhBE,EAAM,GA5DInF,EA4DM,6BACAiF,EAAA,CAAhBE,EAAM,GA7DInF,EA6DM,2BACAiF,EAAA,CAAhBE,EAAM,GA9DInF,EA8DM,+BACAiF,EAAA,CAAhBE,EAAM,GA/DInF,EA+DM,6BACAiF,EAAA,CAAhBE,EAAM,GAhEInF,EAgEM,+BACAiF,EAAA,CAAhBE,EAAM,GAjEInF,EAiEM,+BACAiF,EAAA,CAAhBE,EAAM,GAlEInF,EAkEM,8BACAiF,EAAA,CAAhBE,EAAM,GAnEInF,EAmEM,4BAEAiF,EAAA,CAAhBE,EAAM,GArEInF,EAqEM,+BACAiF,EAAA,CAAhBE,EAAM,GAtEInF,EAsEM,yBACAiF,EAAA,CAAhBE,EAAM,GAvEInF,EAuEM,qCACAiF,EAAA,CAAhBE,EAAM,GAxEInF,EAwEM,kCAMAiF,EAAA,CAAhBE,EAAM,GA9EInF,EA8EM,gCACAiF,EAAA,CAAhBE,EAAM,GA/EInF,EA+EM,+BACAiF,EAAA,CAAhBE,EAAM,GAhFInF,EAgFM,6BACAiF,EAAA,CAAhBE,EAAM,GAjFInF,EAiFM,8BAjFNA,EAANiF,EAAA,CADNG,GAAc,uBAAuB,GACzBpF,GSnCb,OAAS,cAAAqF,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBAiB/C,IAAMC,GAAY,OAAO,OAAW,IAGhCC,GAAoB,KAGxB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAA0BC,EAAW,CAArC,kCAoCI,KAAQ,eAAiB,EACzB,KAAQ,eAAgC,KACxC,KAAQ,MAAQ,EAChB,KAAQ,WAAa,GACrB,KAAQ,UAAY,GACpB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAA8B,KACtC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KACjB,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KACrD,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAC9D,KAAQ,IAAwB,KAEvB,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAwB,CAAC,EAiK1C,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,MACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,gBAAkB,CAAC,EACxCC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACtI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EA2QA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAKjG,GAJIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAEjD,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACnBE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMF,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FI,EAAcH,GAAK,QACzBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMK,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,gBAAkB,CAAC,EACjD,GAAIP,GAAK,aAAe,CAACQ,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAChC,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,UACjB,CACF,EACE,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,KAAK,iBAAmB,GACxB,MACF,OAASS,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,QACxB,CACA,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOgB,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACA,KAAK,iBAAmB,EAC1B,CAAC,EACD,MACF,CACA,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,MAEb,GAAI,CACF,IAAMjB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FM,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,gBAAkB,CAAC,EAC3CW,EAAY,OAAQlB,GAAa,YAAeA,GAAa,WAAa,EAAE,EAAE,YAAY,EAC1FmB,EAAQD,EAAU,SAAS,KAAK,EAChCE,EAAOF,EAAU,SAAS,IAAI,EAC9BG,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASH,GAASE,EAAK,KAAOA,EAAK,GACzC,GAAKrB,GAAa,YAChB,GAAI,CACF,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAemB,EAAQ,MAASC,EAAO,KAAQ,KAAK,QAAgB,cACpE,gBAAiBpB,GAAK,SACtB,cAAe,UACjB,CACF,EACA,iBAAkBsB,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASb,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAiBA,GAAK,QACxB,CACF,EACA,iBAAkBsB,GAAU,4CAC9B,CAAC,EAAE,MAAON,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EA5kBA,MAAc,mBAAoB,CAChC,GAAI,CACF,GAAI,CAAC,KAAK,QAAU,KAAK,QAAQ,aAAc,OAC/C,IAAMY,EAAM,aAAa,QAAQ,WAAW,EAC5C,GAAI,CAACA,EAAK,OACV,IAAMC,EAAQ,KAAK,MAAMD,CAAG,EAC5B,GAAI,CAACC,GAAO,UAAY,CAACA,GAAO,UAAW,OACtClC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMmC,EAAaC,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAC9E,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAC,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,IAAMC,EAAM,IAAItC,GAAamC,CAAK,EAGlC,KAAK,gBAAkB,GACvB,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,gBAAiB,CAAE,MAAOD,EAAM,UAAW,UAAWA,EAAM,UAAW,UAAW,EAAM,CAC1F,CACF,MAAQ,CAAC,CACX,CAEA,IAAY,SAAoB,CAC9B,OAAO,KAAK,QAAQ,YAAc,CAAC,EAAG,EAAG,EAAE,CAC7C,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBlC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMuC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeH,EAAsBI,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAH,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEM,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBN,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAIrC,GAAa2C,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBC,EAAoE,CAChG,GAAI,CACF,IAAMN,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcO,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEL,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcQ,EAAiC,CACnD,IAAMd,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACc,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMhB,EAAI,QAAQe,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAShB,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAee,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACtD,GAEL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqB,CAAE,OAAQ,KAAK,MAAO,CAAC,EAE9E,KAAK,QAAU,KAAK,OAAO,mBAAkB,KAAK,eAAiB,KAAK,OAAO,kBACnF,KAAK,kBAAkB,EACvB,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,EAEX,CAEU,QAAQsD,EAAqC,CACrD,GAAIA,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAM5B,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KAErB,WAAW,IAAM,CAAMA,IAAW,OAAO,KAAK,IAAI,CAAG,EAAG,CAAC,EAE7D,CACF,CAsBQ,aAAa6B,EAAW,CAAE,KAAK,eAAiBA,CAAG,CACnD,aAAaC,EAAW,CAAE,KAAK,eAAiBA,CAAG,CAE3D,IAAY,gBAAiB,CAE3B,OAAO,KAAK,IAAK,KAAK,MAAQ,GAAO,IAAK,GAAG,CAC/C,CAEQ,kBAAmB,CACzBC,GAAqB,KAAM,CAAE,cAAe,KAAM,CAAC,CACrD,CAEA,MAAc,KAAM,CAClB,GAAK3D,GAEL,MAAK,iBAAiB,EAEtBE,GAAS,KAAK,QAAQ,OAAS,GAAO,sBAAuB,CAAE,OAAQ,KAAK,OAAQ,WAAY,KAAK,UAAW,CAAC,EAEjH,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,KAAK,eAAgB,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEnM,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,KAAK,OAAO,cAEd,GAAI,CAAC,KAAK,OAAO,cAAe,CAC9B,KAAK,cAAgB,MACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EAC7E,MACF,UAGI,CAAC,KAAK,gBAAiB,CACzBA,GAAS,KAAK,QAAQ,OAAS,GAAO,iCAAiC,EACvE,GAAI,CACGD,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAE5F,IAAM2D,EADe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBACjEvB,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAAK,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACjI,KAAK,QAAgB,aAAYuB,EAAM,WAAc,KAAK,OAAe,YAC9E,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAtB,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEsB,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBtB,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAIrC,GAAa2D,CAAK,EACjC,GAAI,CACF,IAAMC,EAAY,MAAMC,GAA4B,KAAK,GAAG,EAC5D,GAAID,EAAW,CACb,KAAK,gBAAkB,GACvB,IAAMd,EAAaC,EAAyB,KAAK,IAAK,CAAE,MAAOa,EAAW,UAAAA,EAAW,UAAW,EAAK,CAAC,EAChGZ,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACxH,KAAK,IAAI,EACT,MACF,CACF,MAAQ,CAAC,CACT,IAAMc,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADA7D,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqB6D,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,KAAK,cAAgB,MACrB,KAAK,gBAAkB,GACvB,MACF,OAASzC,EAAO,CACdpB,GAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4BoB,CAAK,EACvE,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,MACF,CACF,CAIF,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,EAChC,MACF,OAAS,EAAG,CAEVD,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAG/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8B0C,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAM3D,EAAY2D,GAAO,KACnBC,EAA8B5D,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAAC4D,GAAW,OAAOA,GAAY,WAC/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAC9B,KAAK,gBAAkB,GACvB,IAAMC,EAAW7D,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmB6D,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CAEF,IAAMC,EAAO,MADDlD,EAAU,KAAK,MAAM,EACD,eAAe,KAAK,eAAgB,OAAW,CAAE,QAAS,aAAc,cAAe,GAAM,eAAiB,MAAc,wBAA0B,UAAW,CAAC,EAC5LmD,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EACJH,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KAEF,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACN,KAAa,UAAYA,EAC1B,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACG,KAAa,UAAY,KAC1B,KAAK,mBAAqBE,GAAgB,oCAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACT,KAAa,UAAY,KAC1B,KAAK,mBAAsB,GAAW,SAAW,oCACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAC7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OACtB,IAAMrD,EAAMC,EAAU,KAAK,MAAM,EAC3BsD,EAAiB,IAAM,CAE3B,GADA,KAAK,6BAA6B,EAC9B,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0BvD,EAAY,0BAA0BqD,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAEQ,YAAYM,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAG5F,kBAAkBnB,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,CAC5B,CAAC,EAAE,MAAO5B,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,sBAAuB,CACnC,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMN,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAAwD,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAA1D,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,gBAAkB,CAAC,EAC1C,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiByD,CACxB,OAAS,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiB,IAAM,EAAE,SAAW,OAAO,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAqJA,QAAS,CACP,OAAK,KAAK,OAIHE;AAAA;AAAA,UAED,KAAK,QAAQ,aAAa,UAAY,GAAQA;AAAA;AAAA,qBAEnC,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,gBAAkB,CAAC,CAAC;AAAA,4BAC1B,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA,2DAC2C,KAAK,cAAc;AAAA,0CACpC,KAAK,KAAK;AAAA;AAAA;AAAA,YAGxC,KAAK,QAAQ,IAAIC,GAAKD,sBAAwB,KAAK,iBAAiBC,EAAE,WAAW,EAAE,YAAY,IAAM,KAAK,aAAaA,CAAC,CAAC,KAAKA,CAAC,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oCAKhH,KAAK,WAAW,aAAa,EAAE;AAAA,sBAC7C,KAAK,YAAe,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK;AAAA,mBACnI,IAAM,KAAK,IAAI,CAAC;AAAA,YACvB,KAAK,WAAa,KAAK,QAAQ,oBAAsB,OAAU,KAAK,WAAa,mBAAiB,KAAK,QAAQ,YAC7G,KAAK,OAAO,YAAY,QAAQ,WAAY,OAAO,KAAK,cAAc,CAAC,EAAE,QAAQ,WAAa,KAAK,gBAAkB,KAAM,EAC3H,QAAQ,KAAK,cAAc,cAAgB;AAAA;AAAA;AAAA,UAG/C,KAAK,aAAeD;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA;AAAA;AAAA,kBAEf,KAAK,WAAW;AAAA;AAAA,cAElB,EAAE;AAAA;AAAA,UAEN,EAAE;AAAA,WACH,IAAM,CACP,IAAME,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAWC,EAA2BF,CAAU,EAChDG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAa,KAAK,eAAwB,CAAC,EAC9E,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBpB,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,SAAWL,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM6B,EAAM,OAAO,KAAK,gBAAkB,KAAK,QAAQ,kBAAoB,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IAC7U,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,IAAI,CAAG,EAC1F,MAAOF,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOL;AAAA,cACHQ,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAWzB,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOsB,CACT,CAAC,CAAC;AAAA;AAAA,cAEAI,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAM,KAAa,WAAa,OAChC,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOJ,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MA/FCL,0DAqGX,CACF,EAvvBarE,EACJ,OAAS,CAAC+E,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgC5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAnCflF,EAmCiB,sBACXiF,EAAA,CAAhBE,EAAM,GApCInF,EAoCM,8BACAiF,EAAA,CAAhBE,EAAM,GArCInF,EAqCM,8BACAiF,EAAA,CAAhBE,EAAM,GAtCInF,EAsCM,qBACAiF,EAAA,CAAhBE,EAAM,GAvCInF,EAuCM,0BACAiF,EAAA,CAAhBE,EAAM,GAxCInF,EAwCM,yBACAiF,EAAA,CAAhBE,EAAM,GAzCInF,EAyCM,4BACAiF,EAAA,CAAhBE,EAAM,GA1CInF,EA0CM,6BACAiF,EAAA,CAAhBE,EAAM,GA3CInF,EA2CM,2BACAiF,EAAA,CAAhBE,EAAM,GA5CInF,EA4CM,+BACAiF,EAAA,CAAhBE,EAAM,GA7CInF,EA6CM,6BACAiF,EAAA,CAAhBE,EAAM,GA9CInF,EA8CM,+BACAiF,EAAA,CAAhBE,EAAM,GA/CInF,EA+CM,+BACAiF,EAAA,CAAhBE,EAAM,GAhDInF,EAgDM,8BACAiF,EAAA,CAAhBE,EAAM,GAjDInF,EAiDM,4BAEAiF,EAAA,CAAhBE,EAAM,GAnDInF,EAmDM,+BACAiF,EAAA,CAAhBE,EAAM,GApDInF,EAoDM,yBACAiF,EAAA,CAAhBE,EAAM,GArDInF,EAqDM,qCACAiF,EAAA,CAAhBE,EAAM,GAtDInF,EAsDM,kCAOAiF,EAAA,CAAhBE,EAAM,GA7DInF,EA6DM,gCACAiF,EAAA,CAAhBE,EAAM,GA9DInF,EA8DM,+BACAiF,EAAA,CAAhBE,EAAM,GA/DInF,EA+DM,6BACAiF,EAAA,CAAhBE,EAAM,GAhEInF,EAgEM,8BAhENA,EAANiF,EAAA,CADNG,GAAc,eAAe,GACjBpF,GCnCb,OAAS,cAAAqF,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBAiB/C,IAAMC,GAAY,OAAO,OAAW,IAGhCC,GAAoB,KAGxB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAAkCC,EAAW,CAA7C,kCAoCuB,WAAgB,gBAChB,aAAkB,GAClB,mBAAwB,GAU3C,KAAQ,eAAgC,KACxC,KAAQ,SAAW,GACnB,KAAQ,UAAY,GACpB,KAAQ,WAAa,GACrB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAAiC,KACzC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KACjB,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KACrD,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAErD,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAuC,CAAC,EACzD,KAAQ,IAAwB,KAChC,KAAQ,uBAA+C,KACvD,KAAQ,SAAiC,KAsSzC,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAE5F,KAAK,cAAgB,SACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EAEnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC1CC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,SAAU,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACzI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EA8KA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAEjG,GADIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAC7CE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMF,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAKC,GAAMA,GAAW,iBAAmBF,CAAS,EACpFI,EAAcH,GAAK,QAEzB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMK,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,QAAQ,UAAY,CAAC,EACnD,GAAIP,GAAK,aAAe,CAACQ,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACxD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,cACf,CACF,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASS,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,QACxB,CACF,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOgB,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACF,CAAC,EACD,MACF,CACA,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,SAEb,GAAI,CACF,IAAMjB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FM,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,QAAQ,UAAY,CAAC,EAE7CW,EADY,OAAQlB,GAAa,YAAeA,GAAa,WAAa,EAAE,EAAE,YAAY,EACxE,SAAS,KAAK,EAChCmB,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASF,GAASC,EAAK,KAAOA,EAAK,GACzC,GAAID,GAAUlB,GAAa,YACzB,GAAI,CACF,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,cACjB,CACF,EACA,iBAAkBoB,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASX,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAiBA,GAAK,QACxB,CACF,EACA,iBAAkBoB,GAAU,4CAC9B,CAAC,EAAE,MAAOJ,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EA7pBA,IAAY,yBAAkC,CAC5C,GAAI,CAGF,OAFU,KAAK,eAAiB,IAEvB,QAAQ,SAAU,GAAG,CAChC,MAAQ,CACN,MAAO,0CACT,CACF,CA+BA,MAAc,mBAAoB,CAChC,GAAI,CACF,GAAI,CAAC,KAAK,QAAU,KAAK,QAAQ,aAAc,OAC/C,IAAMU,EAAM,aAAa,QAAQ,WAAW,EAC5C,GAAI,CAACA,EAAK,OACV,IAAMC,EAAQ,KAAK,MAAMD,CAAG,EAC5B,GAAI,CAACC,GAAO,UAAY,CAACA,GAAO,UAAW,OACtChC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMiC,EAAa,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACvD,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAC,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClED,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBC,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,IAAMC,EAAM,IAAInC,GAAaiC,CAAK,EAElC,KAAK,gBAAkB,GACvB,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,gBAAiB,CAAE,MAAOD,EAAM,UAAW,UAAWA,EAAM,UAAW,UAAW,EAAM,CAC1F,CACF,MAAQ,CAAC,CACX,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBhC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMoC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAH,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEM,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBN,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAIlC,GAAawC,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBE,EAAoE,CAChG,GAAI,CACF,IAAMP,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcQ,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEL,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcQ,EAAiC,CACnD,IAAMf,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACe,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMjB,EAAI,QAAQgB,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAASjB,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAegB,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8BE,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAMjD,EAAYiD,GAAO,KACnBC,EAA8BlD,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAACkD,GAAW,OAAOA,GAAY,WAC/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAC9B,KAAK,gBAAkB,GACvB,IAAMC,EAAWnD,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmBmD,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CAEF,IAAMC,EAAO,MADDxC,EAAU,KAAK,MAAM,EACD,eAAe,KAAK,OAAO,SAAU,OAAW,CAAE,QAAS,iBAAkB,cAAe,GAAM,eAAgB,UAAW,CAAC,EACxJyC,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EACJH,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KAEF,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACP,KAAK,UAAYA,EACjB,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACE,KAAK,UAAY,KACjB,KAAK,mBAAqBE,GAAgB,8BAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACV,KAAK,UAAY,KACjB,KAAK,mBAAsB,GAAW,SAAW,8BACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAC7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OACtB,IAAM3C,EAAMC,EAAU,KAAK,MAAM,EAC3B4C,EAAiB,IAAM,CAE3B,GADA,KAAK,6BAA6B,EAC9B,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0B7C,EAAY,0BAA0B2C,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAGA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACxD,GAEL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,4BAA6B,CAAE,OAAQ,KAAK,MAAO,CAAC,EAGtF,KAAK,SACH,OAAQ,KAAK,OAAe,OAAU,WAAU,KAAK,MAAS,KAAK,OAAe,OAClF,OAAQ,KAAK,OAAe,SAAY,WAAU,KAAK,QAAW,KAAK,OAAe,SACtF,OAAQ,KAAK,OAAe,eAAkB,WAAU,KAAK,cAAiB,KAAK,OAAe,gBAGxG,KAAK,kBAAkB,EAEvB,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,iBAAmB,GACxB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,CAET,KAAK,wBAA0B,IAAM,CACnC,KAAK,SAAW,GAChB,KAAK,UAAY,GACjB,KAAK,WAAa,GAClB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,eAAgB,CAAE,OAAQ,CAAE,OAAQ,KAAK,QAAQ,SAAU,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC7J,KAAK,cAAc,CACrB,GACA,GAAI,CACF,OAAO,iBAAiB,kCAAmC,KAAK,sBAAsB,CACxF,MAAQ,CAAC,CAET,KAAK,UAAY,IAAM,CACrB,KAAK,SAAW,GAChB,KAAK,UAAY,GACjB,KAAK,WAAa,GAClB,KAAK,cAAc,CACrB,GACA,GAAI,CACF,OAAO,iBAAiB,eAAgB,KAAK,QAAQ,CACvD,MAAQ,CAAC,EACX,CAEA,sBAA6B,CAC3B,MAAM,qBAAqB,EAC3B,GAAI,CAAE,OAAO,oBAAoB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAC1G,GAAI,KAAK,uBACP,GAAI,CAAE,OAAO,oBAAoB,kCAAmC,KAAK,sBAAsB,CAAG,MAAQ,CAAC,CAE7G,GAAI,KAAK,SACP,GAAI,CAAE,OAAO,oBAAoB,eAAgB,KAAK,QAAQ,CAAG,MAAQ,CAAC,CAE9E,CAEU,QAAQ4D,EAAqC,CASrD,GARIA,EAAQ,IAAI,QAAQ,GAElB,KAAK,SACH,OAAQ,KAAK,OAAe,OAAU,WAAU,KAAK,MAAS,KAAK,OAAe,OAClF,OAAQ,KAAK,OAAe,SAAY,WAAU,KAAK,QAAW,KAAK,OAAe,SACtF,OAAQ,KAAK,OAAe,eAAkB,WAAU,KAAK,cAAiB,KAAK,OAAe,gBAGtGA,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAMlC,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,UAAU,KAAK,OAAO,CAAG,EAAG,CAAC,EAEnE,CACF,CAwBQ,aAAamC,EAAW,CAAE,KAAK,eAAiBA,CAAG,CAEnD,kBAAmB,CACzBC,GAAqB,KAAiC,CAAE,cAAe,QAAS,CAAC,CACnF,CAEA,MAAc,QAAS,CACrB,GAAKhE,IACD,MAAK,SAET,MAAK,iBAAiB,EAEtBE,GAAS,KAAK,QAAQ,OAAS,GAAO,iCAAkC,CACtE,SAAU,KAAK,OAAO,SACtB,eAAgB,KAAK,eACrB,aAAc,KAAK,OAAO,YAC5B,CAAC,EAED,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,SAAU,KAAM,UAAW,OAAQ,KAAK,OAAO,SAAU,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEvM,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,KAAK,OAAO,cACd,GAAI,CAAC,KAAK,OAAO,cAAe,CAC9B,KAAK,cAAgB,SACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EAC7E,MACF,UAGI,CAAC,KAAK,gBAAiB,CACzBA,GAAS,KAAK,QAAQ,OAAS,GAAO,sCAAsC,EAC5E,GAAI,CACGD,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAE5F,IAAMgE,EADe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBACjEvB,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAAK,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACtI,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAP,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClE8B,EAAM,iBAAmB,KAAK,QAAQ,kBAAoB9B,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAIlC,GAAagE,CAAK,EACjC,GAAI,CACF,IAAMC,EAAY,MAAMC,GAA4B,KAAK,GAAG,EAC5D,GAAID,EAAW,CACb,KAAK,gBAAkB,GACvB,IAAMrB,EAAaC,EAAyB,KAAK,IAAK,CAAE,MAAOoB,EAAW,UAAAA,EAAW,UAAW,EAAK,CAAC,EAChGnB,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACxH,KAAK,OAAO,EACZ,MACF,CACF,MAAQ,CAAC,CACT,IAAMoB,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADAlE,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqBkE,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,KAAK,cAAgB,SACrB,KAAK,gBAAkB,GACvB,MACF,OAAS9C,EAAO,CACdpB,GAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4BoB,CAAK,EACvE,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,MACF,CACF,CAKF,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,EAChC,MACF,OAAS,EAAG,CAEVD,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAG/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEQ,YAAY+C,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAE5F,kBAAkBlB,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,CAC5B,CAAC,EAAE,MAAOzB,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,sBAAuB,CAEnC,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMN,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAAqD,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAAvD,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC5C,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiBsD,CACxB,OAAS,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiB,IAAM,EAAE,SAAW,OAAO,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAqJA,QAAS,CACP,OAAK,KAAK,OAIHE;AAAA;AAAA,UAED,KAAK,QAAQ,aAAa,UAAY,GAAQA;AAAA;AAAA,qBAEnC,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,QAAQ,UAAY,CAAC,CAAC;AAAA,4BAC5B,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA;AAAA,+BAEe,KAAK,KAAK;AAAA,iCACR,KAAK,OAAO;AAAA,wBACrB,KAAK,SAAW,WAAa,QAAQ,KAAK,KAAK,SAAW,KAAK,cAAgB,KAAK,uBAAuB;AAAA;AAAA;AAAA,oCAG/F,KAAK,WAAW,aAAa,EAAE,eAAe,KAAK,YAAY,KAAK,UAAa,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK,WAAW,IAAM,KAAK,OAAO,CAAC;AAAA,YACnP,KAAK,SAAW,WAAc,KAAK,WAAa,oBACjD,KAAK,QAAQ,aAAe,mBACxB,QAAQ,WAAY,GAAG,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,EACtE,QAAQ,WAAa,KAAK,gBAAkB,KAAM,CACrD;AAAA;AAAA;AAAA,UAGF,KAAK,aAAeA;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA;AAAA;AAAA,kBAEf,KAAK,WAAW;AAAA;AAAA,cAElB,EAAE;AAAA;AAAA,UAEN,EAAE;AAAA,WACH,IAAM,CACP,IAAMC,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAUC,EAAmBF,CAAU,EACvCG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAa,KAAK,eAAiB,CAAC,EACvE,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBX,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,SAAWZ,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM2B,EAAM,OAAO,KAAK,QAAQ,UAAY,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IAC9S,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,OAAO,CAAG,EAC7F,MAAOF,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOJ;AAAA,cACHO,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAWhB,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOa,CACT,CAAC,CAAC;AAAA;AAAA,cAEAI,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAK,KAAK,WAAa,OACvB,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOJ,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MA3FCJ,0DAiGX,CACF,EA1yBalE,EACJ,OAAS,CAAC2E,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgC5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAnCf9E,EAmCiB,sBACA6E,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GApCf9E,EAoCiB,qBACA6E,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GArCf9E,EAqCiB,uBACA6E,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAtCf9E,EAsCiB,6BAUX6E,EAAA,CAAhBE,EAAM,GAhDI/E,EAgDM,8BACA6E,EAAA,CAAhBE,EAAM,GAjDI/E,EAiDM,wBACA6E,EAAA,CAAhBE,EAAM,GAlDI/E,EAkDM,yBACA6E,EAAA,CAAhBE,EAAM,GAnDI/E,EAmDM,0BACA6E,EAAA,CAAhBE,EAAM,GApDI/E,EAoDM,4BACA6E,EAAA,CAAhBE,EAAM,GArDI/E,EAqDM,6BACA6E,EAAA,CAAhBE,EAAM,GAtDI/E,EAsDM,2BACA6E,EAAA,CAAhBE,EAAM,GAvDI/E,EAuDM,+BACA6E,EAAA,CAAhBE,EAAM,GAxDI/E,EAwDM,6BACA6E,EAAA,CAAhBE,EAAM,GAzDI/E,EAyDM,+BACA6E,EAAA,CAAhBE,EAAM,GA1DI/E,EA0DM,+BACA6E,EAAA,CAAhBE,EAAM,GA3DI/E,EA2DM,8BACA6E,EAAA,CAAhBE,EAAM,GA5DI/E,EA4DM,4BAEA6E,EAAA,CAAhBE,EAAM,GA9DI/E,EA8DM,+BACA6E,EAAA,CAAhBE,EAAM,GA/DI/E,EA+DM,yBACA6E,EAAA,CAAhBE,EAAM,GAhEI/E,EAgEM,qCACA6E,EAAA,CAAhBE,EAAM,GAjEI/E,EAiEM,kCAMA6E,EAAA,CAAhBE,EAAM,GAvEI/E,EAuEM,gCACA6E,EAAA,CAAhBE,EAAM,GAxEI/E,EAwEM,+BACA6E,EAAA,CAAhBE,EAAM,GAzEI/E,EAyEM,6BACA6E,EAAA,CAAhBE,EAAM,GA1EI/E,EA0EM,8BA1ENA,EAAN6E,EAAA,CADNG,GAAc,uBAAuB,GACzBhF,GCnCb,OAAS,cAAAiF,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBAgB/C,IAAMC,GAAY,OAAO,OAAW,IAGhCC,GAAoB,KAGxB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAA8BC,EAAW,CAAzC,kCAmCI,KAAQ,cAAgB,EACxB,KAAQ,eAAgC,KACxC,KAAQ,WAAa,GAErB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAAgC,KACxC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KACjB,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KACrD,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAC9D,KAAQ,IAAwB,KAEvB,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAwB,CAAC,EAgC1C,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,cAAc,UAAY,CAAC,EAChDC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,QAAS,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACxI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EAkXA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAKjG,GAJIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAEjD,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACnBE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMF,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FI,EAAcH,GAAK,QACzBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMK,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,cAAc,UAAY,CAAC,EACzD,GAAIP,GAAK,aAAe,CAACQ,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAClC,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,cACf,KAAM,KAAK,cAAc,IAC3B,CACF,EACI,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,KAAK,iBAAmB,GACxB,MACF,OAASS,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAClC,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,KAAM,KAAK,cAAc,IAC3B,CACF,EACI,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOgB,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACA,KAAK,iBAAmB,EAC1B,CAAC,EACD,MACF,CACA,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,QAEb,GAAI,CACF,IAAMjB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FM,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,cAAc,UAAY,CAAC,EACnDW,EAAY,OAAQlB,GAAa,YAAeA,GAAa,WAAa,EAAE,EAAE,YAAY,EAC1FmB,EAAQD,EAAU,SAAS,KAAK,EAChCE,EAAOF,EAAU,SAAS,IAAI,EAC9BG,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASH,GAASE,EAAK,KAAOA,EAAK,GACzC,GAAKrB,GAAa,YAChB,GAAI,CACF,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC7B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAemB,EAAQ,MAASC,EAAO,KAAQ,KAAK,QAAgB,cACpE,gBAAiBpB,GAAK,SACtB,cAAe,cACf,KAAM,KAAK,cAAc,IAC3B,CACE,EACA,iBAAkBsB,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASb,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAiBA,GAAK,SACtB,KAAM,KAAK,cAAc,IAC3B,CACA,EACA,iBAAkBsB,GAAU,4CAC9B,CAAC,EAAE,MAAON,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EArjBA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACtB,GAEL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,wBAAyB,CAAE,OAAQ,KAAK,MAAO,CAAC,EAElF,KAAK,QAAU,OAAO,KAAK,OAAO,kBAAqB,WAAU,KAAK,cAAgB,KAAK,OAAO,kBAEtG,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,EACX,CAEU,QAAQgC,EAAqC,CACrD,GAAIA,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAMN,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,SAAS,KAAK,MAAM,CAAG,EAAG,CAAC,EAEjE,CACF,CAsBQ,WAAWO,EAAW,CAAE,KAAK,cAAgBA,CAAG,CAChD,aAAaC,EAAW,CAAE,KAAK,eAAiBA,CAAG,CAE3D,IAAY,cAAe,CAAE,OAAO,KAAK,QAAQ,QAAQ,KAAK,aAAa,GAAK,CAAE,KAAM,aAAc,SAAU,CAAE,CAAG,CAGrH,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBnC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMoC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAK,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAI1C,GAAawC,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBG,EAAoE,CAChG,GAAI,CACF,IAAMC,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcC,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEN,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcS,EAAiC,CACnD,IAAMR,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACQ,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMV,EAAI,QAAQS,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAASV,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAeS,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEQ,kBAAmB,CACzBE,GAAqB,KAAM,CAAE,cAAe,OAAQ,CAAC,CACvD,CAEA,MAAc,OAAQ,CACpB,GAAKxD,GAEL,MAAK,iBAAiB,EAEtBE,GAAS,KAAK,QAAQ,OAAS,GAAO,uBAAwB,CAC5D,aAAc,KAAK,aACnB,eAAgB,KAAK,eACrB,aAAc,KAAK,OAAO,YAC5B,CAAC,EAED,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,QAAS,KAAM,UAAW,OAAQ,KAAK,aAAa,SAAU,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAE5M,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,KAAK,OAAO,cACd,GAAI,CAAC,KAAK,OAAO,cAAe,CAC9B,KAAK,cAAgB,QACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EAC7E,MACF,UAGI,CAAC,KAAK,gBAAiB,CACzBA,GAAS,KAAK,QAAQ,OAAS,GAAO,sCAAsC,EAC5E,GAAI,CACGD,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAE5F,IAAMwC,EADe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAClEC,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAAK,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EAC/HH,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQC,EAAK,WAAaD,EACxC,MAAY,KAAK,QAAgB,aAC/BC,EAAK,WAAc,KAAK,OAAe,YAEzC,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAE,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAI1C,GAAawC,CAAI,EAChC,GAAI,CACF,IAAMgB,EAAY,MAAMC,GAA4B,KAAK,GAAG,EAC5D,GAAID,EAAW,CACb,KAAK,gBAAkB,GACvB,IAAMV,EAAaC,EAAyB,KAAK,IAAK,CAAE,MAAOS,EAAW,UAAAA,EAAW,UAAW,EAAK,CAAC,EAChGR,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACxH,KAAK,MAAM,EACX,MACF,CACF,MAAQ,CAAC,CACT,IAAMU,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADAzD,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqByD,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,MACF,OAASrC,EAAO,CACdpB,GAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4BoB,CAAK,EACvE,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,MACF,CACF,CAIF,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,EAChC,MACF,OAAS,EAAG,CAEVD,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAG/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8BsC,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAMvD,EAAYuD,GAAO,KACnBC,EAA8BxD,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAACwD,GAAW,OAAOA,GAAY,WAC/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAC9B,KAAK,gBAAkB,GACvB,IAAMC,EAAWzD,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmByD,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CAEF,IAAMC,EAAO,MADD9C,EAAU,KAAK,MAAM,EACD,eAAe,KAAK,aAAa,SAAU,OAAW,CAAE,QAAS,gBAAiB,cAAe,GAAM,KAAM,KAAK,aAAa,KAAM,eAAgB,UAAW,CAAC,EAC3L+C,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EACJH,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KAEF,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACP,KAAK,UAAYA,EACjB,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACE,KAAK,UAAY,KACjB,KAAK,mBAAqBE,GAAgB,8BAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACV,KAAK,UAAY,KACjB,KAAK,mBAAsB,GAAW,SAAW,8BACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAC7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OACtB,IAAMjD,EAAMC,EAAU,KAAK,MAAM,EAC3BkD,EAAiB,IAAM,CAC3B,GAAI,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0BnD,EAAY,0BAA0BiD,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAEQ,YAAYM,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAE5F,kBAAkBf,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,CAC5B,CAAC,EAAE,MAAO5B,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,sBAAuB,CACnC,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMN,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAAoD,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAAtD,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,cAAc,UAAY,CAAC,EAClD,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiBqD,CACxB,OAAS,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiB,IAAM,EAAE,SAAW,OAAO,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAyJA,QAAS,CACP,OAAK,KAAK,OAIHE;AAAA;AAAA,UAED,KAAK,QAAQ,aAAa,UAAY,GAAQA;AAAA;AAAA,qBAEnC,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,cAAc,UAAY,CAAC,CAAC;AAAA,4BAClC,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA;AAAA,YAEJ,KAAK,OAAO,MAAM,IAAI,CAACC,EAAIrC,IAAMoC;AAAA,+BACd,KAAK,gBAAgBpC,EAAE,WAAW,EAAE,YAAY,IAAM,KAAK,WAAWA,CAAC,CAAC;AAAA,sBACjFqC,EAAG,IAAI;AAAA,uBACN,OAAOA,GAAI,UAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,WAEhD,CAAC;AAAA;AAAA;AAAA,2CAG+B,OAAO,KAAK,cAAc,UAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,oCAI1D,KAAK,WAAW,aAAa,EAAE,eAAe,KAAK,UAAU,WAAW,IAAM,KAAK,MAAM,CAAC;AAAA,YAClH,KAAK,WAAa,mBAAgB,SAAS,KAAK,aAAa,IAAI,EAAE;AAAA;AAAA;AAAA,UAGrE,KAAK,aAAeD;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA;AAAA;AAAA,kBAEf,KAAK,WAAW;AAAA;AAAA,cAElB,EAAE;AAAA;AAAA,UAEN,EAAE;AAAA,WACH,IAAM,CACP,IAAME,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAWC,EAA2BF,CAAU,EAChDG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAa,KAAK,eAAwB,CAAC,EAC9E,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBtC,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,SAAWiB,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM,EAAI,KAAK,QAAQ,kBAAoB,EAASyB,EAAM,OAAQ,KAAK,QAAQ,QAAQ,CAAC,GAAG,UAAa,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IAC1W,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,MAAM,CAAG,EAC5F,MAAOF,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOL;AAAA,cACHQ,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAW3C,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOwC,CACT,CAAC,CAAC;AAAA;AAAA,cAEAI,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAK,KAAK,WAAa,OACvB,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOJ,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MA/FCL,0DAqGX,CACF,EA/tBajE,EACJ,OAAS,CAAC2E,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+B5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAlCf9E,EAkCiB,sBACX6E,EAAA,CAAhBE,EAAM,GAnCI/E,EAmCM,6BACA6E,EAAA,CAAhBE,EAAM,GApCI/E,EAoCM,8BACA6E,EAAA,CAAhBE,EAAM,GArCI/E,EAqCM,0BAEA6E,EAAA,CAAhBE,EAAM,GAvCI/E,EAuCM,4BACA6E,EAAA,CAAhBE,EAAM,GAxCI/E,EAwCM,6BACA6E,EAAA,CAAhBE,EAAM,GAzCI/E,EAyCM,2BACA6E,EAAA,CAAhBE,EAAM,GA1CI/E,EA0CM,+BACA6E,EAAA,CAAhBE,EAAM,GA3CI/E,EA2CM,6BACA6E,EAAA,CAAhBE,EAAM,GA5CI/E,EA4CM,+BACA6E,EAAA,CAAhBE,EAAM,GA7CI/E,EA6CM,+BACA6E,EAAA,CAAhBE,EAAM,GA9CI/E,EA8CM,8BACA6E,EAAA,CAAhBE,EAAM,GA/CI/E,EA+CM,4BAEA6E,EAAA,CAAhBE,EAAM,GAjDI/E,EAiDM,+BACA6E,EAAA,CAAhBE,EAAM,GAlDI/E,EAkDM,yBACA6E,EAAA,CAAhBE,EAAM,GAnDI/E,EAmDM,qCACA6E,EAAA,CAAhBE,EAAM,GApDI/E,EAoDM,kCAOA6E,EAAA,CAAhBE,EAAM,GA3DI/E,EA2DM,gCACA6E,EAAA,CAAhBE,EAAM,GA5DI/E,EA4DM,+BACA6E,EAAA,CAAhBE,EAAM,GA7DI/E,EA6DM,6BACA6E,EAAA,CAAhBE,EAAM,GA9DI/E,EA8DM,8BA9DNA,EAAN6E,EAAA,CADNG,GAAc,mBAAmB,GACrBhF,GClCb,OAAS,cAAAiF,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBAiB/C,IAAMC,GAAY,OAAO,OAAW,IAGhCC,GAAoB,KAGxB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAAuCC,EAAW,CAAlD,kCAoCI,KAAQ,eAAiB,GACzB,KAAQ,eAAgC,KACxC,KAAQ,OAAS,EACjB,KAAQ,WAAa,GACrB,KAAQ,UAAY,GACpB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAAiC,KACzC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KACjB,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KACrD,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAC9D,KAAQ,IAAwB,KAEvB,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAwB,CAAC,EA+J1C,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,SACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,gBAAkB,CAAC,EACxCC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,SAAU,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACzI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EA8QA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAKjG,GAJIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAEjD,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACnBE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMF,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FI,EAAcH,GAAK,QACzBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMK,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,gBAAkB,CAAC,EACjD,GAAIP,GAAK,aAAe,CAACQ,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,eACjB,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,KAAK,iBAAmB,GACxB,MACF,OAASS,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,cAAe,MACf,gBAAiBA,GAAK,QACxB,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOgB,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACA,KAAK,iBAAmB,EAC1B,CAAC,EACD,MACF,CACA,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,SAEb,GAAI,CACF,IAAMjB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FM,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,gBAAkB,CAAC,EAE3CW,EADY,OAAQlB,GAAa,YAAeA,GAAa,WAAa,EAAE,EAAE,YAAY,EACxE,SAAS,KAAK,EAChCmB,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASF,GAASC,EAAK,KAAOA,EAAK,GACzC,GAAID,GAAUlB,GAAa,YACzB,GAAI,CACF,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,eACjB,CACA,EACA,iBAAkBoB,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASX,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAiBA,GAAK,QACxB,CACA,EACA,iBAAkBoB,GAAU,4CAC9B,CAAC,EAAE,MAAOJ,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EAtkBA,MAAc,mBAAoB,CAChC,GAAI,CACF,GAAI,CAAC,KAAK,QAAU,KAAK,QAAQ,aAAc,OAC/C,IAAMU,EAAM,aAAa,QAAQ,WAAW,EAC5C,GAAI,CAACA,EAAK,OACV,IAAMC,EAAQ,KAAK,MAAMD,CAAG,EAC5B,GAAI,CAACC,GAAO,UAAY,CAACA,GAAO,UAAW,OACtChC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMiC,EAAaC,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAC9E,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAC,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,IAAMC,EAAM,IAAIpC,GAAaiC,CAAK,EAElC,KAAK,gBAAkB,GACvB,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,gBAAiB,CAAE,MAAOD,EAAM,UAAW,UAAWA,EAAM,UAAW,UAAW,EAAM,CAC1F,CACF,MAAQ,CAAC,CACX,CAEA,IAAY,SAAoB,CAC9B,OAAO,KAAK,QAAQ,YAAc,CAAC,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,CAC9D,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBhC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMqC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeH,EAAsBI,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAH,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEM,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBN,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAInC,GAAayC,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBC,EAAoE,CAChG,GAAI,CACF,IAAMN,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcO,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEL,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcQ,EAAiC,CACnD,IAAMd,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACc,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMhB,EAAI,QAAQe,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAShB,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAee,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACpD,GAEL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,iCAAkC,CAAE,OAAQ,KAAK,MAAO,CAAC,EAE3F,KAAK,QAAU,OAAO,KAAK,OAAO,kBAAqB,WAAU,KAAK,eAAiB,KAAK,OAAO,kBACvG,KAAK,kBAAkB,EACvB,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,EAEX,CAEU,QAAQoD,EAAqC,CACrD,GAAIA,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAM1B,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,UAAU,KAAK,OAAO,CAAG,EAAG,CAAC,EAEnE,CACF,CAsBQ,aAAa2B,EAAW,CAAE,KAAK,eAAiBA,CAAG,CACnD,aAAaC,EAAW,CAAE,KAAK,eAAiBA,CAAG,CAE3D,IAAY,gBAAiB,CAC3B,IAAMC,EAAO,OAAO,KAAK,QAAQ,SAAW,GAAI,EAC1CC,EAAQD,EAAO,EAAIA,EAAO,IAChC,OAAO,KAAK,IAAK,KAAK,OAASC,EAAS,IAAK,GAAG,CAClD,CAEQ,kBAAmB,CACzBC,GAAqB,KAAM,CAAE,cAAe,QAAS,CAAC,CACxD,CAEA,MAAc,QAAS,CACrB,GAAK3D,GAEL,MAAK,iBAAiB,EAEtBE,GAAS,KAAK,QAAQ,OAAS,GAAO,mBAAoB,CACxD,OAAQ,KAAK,eACb,eAAgB,KAAK,eACrB,aAAc,KAAK,OAAO,YAC5B,CAAC,EAED,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,SAAU,KAAM,UAAW,OAAQ,KAAK,eAAgB,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEtM,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,KAAK,OAAO,cACd,GAAI,CAAC,KAAK,OAAO,cAAe,CAC9B,KAAK,cAAgB,SACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EAC7E,MACF,UAGI,CAAC,KAAK,gBAAiB,CACzBA,GAAS,KAAK,QAAQ,OAAS,GAAO,sCAAsC,EAC5E,GAAI,CACGD,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAE5F,IAAM2D,EADe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBACjEzB,EAAsB,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,CAAC,EAAK,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACjI,KAAK,QAAgB,aAAYyB,EAAM,WAAc,KAAK,OAAe,YAC9E,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAxB,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEwB,EAAM,iBAAmB,KAAK,QAAQ,kBAAoBxB,EAAwB,CACpF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAInC,GAAa2D,CAAK,EACjC,GAAI,CACF,IAAMC,EAAY,MAAMC,GAA4B,KAAK,GAAG,EAC5D,GAAID,EAAW,CACb,KAAK,gBAAkB,GACvB,IAAMhB,EAAaC,EAAyB,KAAK,IAAK,CAAE,MAAOe,EAAW,UAAAA,EAAW,UAAW,EAAK,CAAC,EAChGd,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACxH,KAAK,OAAO,EACZ,MACF,CACF,MAAQ,CAAC,CACT,IAAMgB,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADA7D,GAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqB6D,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,KAAK,cAAgB,SACrB,KAAK,gBAAkB,GACvB,MACF,OAASzC,EAAO,CACdpB,GAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4BoB,CAAK,EACvE,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,MACF,CACF,CAIF,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,EAChC,MACF,OAAS,EAAG,CAEVD,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAG/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8B0C,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAM3D,EAAY2D,GAAO,KACnBC,EAA8B5D,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAAC4D,GAAW,OAAOA,GAAY,WAC/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAC9B,KAAK,gBAAkB,GACvB,IAAMC,EAAW7D,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmB6D,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CAEF,IAAMC,EAAO,MADDlD,EAAU,KAAK,MAAM,EACD,eAAe,KAAK,eAAgB,OAAW,CAAE,QAAS,kBAAmB,cAAe,GAAM,eAAgB,UAAW,CAAC,EACxJmD,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EACJH,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KAEF,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACP,KAAK,UAAYA,EACjB,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACE,KAAK,UAAY,KACjB,KAAK,mBAAqBE,GAAgB,8BAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACV,KAAK,UAAY,KACjB,KAAK,mBAAsB,GAAW,SAAW,8BACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAC7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OACtB,IAAMrD,EAAMC,EAAU,KAAK,MAAM,EAC3BsD,EAAiB,IAAM,CAE3B,GADA,KAAK,6BAA6B,EAC9B,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0BvD,EAAY,0BAA0BqD,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAEQ,YAAYM,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAE5F,kBAAkBrB,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,CAC5B,CAAC,EAAE,MAAO1B,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,sBAAuB,CACnC,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMN,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAAwD,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAA1D,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,gBAAkB,CAAC,EAC1C,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiByD,CACxB,OAAS,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiB,IAAM,EAAE,SAAW,OAAO,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CA8IA,QAAS,CACP,OAAK,KAAK,OAIHE;AAAA;AAAA,UAED,KAAK,QAAQ,aAAa,UAAY,GAAQA;AAAA;AAAA,qBAEnC,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,gBAAkB,CAAC,CAAC;AAAA,4BAC1B,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA,8DAC8C,KAAK,cAAc;AAAA,8BACnD,OAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,SAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,YAGnG,KAAK,QAAQ,IAAIC,GAAKD,sBAAwB,KAAK,iBAAiBC,EAAE,WAAW,EAAE,YAAY,IAAM,KAAK,aAAaA,CAAC,CAAC,KAAKA,CAAC,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oCAKhH,KAAK,WAAW,aAAa,EAAE;AAAA,sBAC7C,KAAK,YAAe,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK;AAAA,mBACnI,IAAM,KAAK,OAAO,CAAC;AAAA,YAC1B,KAAK,WAAa,KAAK,QAAQ,oBAAsB,UAAa,KAAK,WAAa,oBACnF,KAAK,QAAQ,aAAe,+BAC1B,QAAQ,WAAY,GAAG,KAAK,cAAc,EAAE,EAC5C,QAAQ,WAAa,KAAK,gBAAkB,KAAM,CACrD;AAAA;AAAA;AAAA,UAGF,KAAK,aAAeD;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA;AAAA;AAAA,kBAEf,KAAK,WAAW;AAAA;AAAA,cAElB,EAAE;AAAA;AAAA,UAEN,EAAE;AAAA,WACH,IAAM,CACP,IAAME,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAWC,EAA2BF,CAAU,EAChDG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAa,KAAK,eAAwB,CAAC,EAC9E,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBtB,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,SAAWL,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM+B,EAAM,OAAO,KAAK,gBAAkB,KAAK,QAAQ,kBAAoB,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IAC7U,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,OAAO,CAAG,EAC7F,MAAOF,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOL;AAAA,cACHQ,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAW3B,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOwB,CACT,CAAC,CAAC;AAAA;AAAA,cAEAI,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAK,KAAK,WAAa,OACvB,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOJ,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAjGCL,0DAuGX,CACF,EAnvBarE,EACJ,OAAS,CAAC+E,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgC5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAnCflF,EAmCiB,sBACXiF,EAAA,CAAhBE,EAAM,GApCInF,EAoCM,8BACAiF,EAAA,CAAhBE,EAAM,GArCInF,EAqCM,8BACAiF,EAAA,CAAhBE,EAAM,GAtCInF,EAsCM,sBACAiF,EAAA,CAAhBE,EAAM,GAvCInF,EAuCM,0BACAiF,EAAA,CAAhBE,EAAM,GAxCInF,EAwCM,yBACAiF,EAAA,CAAhBE,EAAM,GAzCInF,EAyCM,4BACAiF,EAAA,CAAhBE,EAAM,GA1CInF,EA0CM,6BACAiF,EAAA,CAAhBE,EAAM,GA3CInF,EA2CM,2BACAiF,EAAA,CAAhBE,EAAM,GA5CInF,EA4CM,+BACAiF,EAAA,CAAhBE,EAAM,GA7CInF,EA6CM,6BACAiF,EAAA,CAAhBE,EAAM,GA9CInF,EA8CM,+BACAiF,EAAA,CAAhBE,EAAM,GA/CInF,EA+CM,+BACAiF,EAAA,CAAhBE,EAAM,GAhDInF,EAgDM,8BACAiF,EAAA,CAAhBE,EAAM,GAjDInF,EAiDM,4BAEAiF,EAAA,CAAhBE,EAAM,GAnDInF,EAmDM,+BACAiF,EAAA,CAAhBE,EAAM,GApDInF,EAoDM,yBACAiF,EAAA,CAAhBE,EAAM,GArDInF,EAqDM,qCACAiF,EAAA,CAAhBE,EAAM,GAtDInF,EAsDM,kCAOAiF,EAAA,CAAhBE,EAAM,GA7DInF,EA6DM,gCACAiF,EAAA,CAAhBE,EAAM,GA9DInF,EA8DM,+BACAiF,EAAA,CAAhBE,EAAM,GA/DInF,EA+DM,6BACAiF,EAAA,CAAhBE,EAAM,GAhEInF,EAgEM,8BAhENA,EAANiF,EAAA,CADNG,GAAc,4BAA4B,GAC9BpF,GCnCb,OAAS,cAAAqF,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBCD/C,OAAS,QAAAC,OAA4B,MAGrC,SAASC,GAAaC,EAAoD,CAExE,GAAIA,IAAkB,SAAWA,IAAkB,OAAQ,OAAOA,EAElE,GAAI,OAAO,SAAa,IAAa,MAAO,QAE5C,IAAMC,EAAa,SAAS,gBAAgB,aAAa,kBAAkB,EAC3E,GAAIA,IAAe,SAAWA,IAAe,OAAQ,OAAOA,EAE5D,IAAMC,EAAQ,SAAS,gBAAgB,aAAa,YAAY,EAChE,OAAIA,IAAU,SAAWA,IAAU,OAAeA,EAE3C,OACT,CAQO,SAASC,GAA2BC,EAOjB,CACzB,GAAI,CAACA,EAAK,QAAS,OAAO,KAC1B,IAAMC,EAAYD,EAAK,WAAa,CAAC,EAC/BE,EAAYP,GAAaK,EAAK,KAAK,EACzC,OAAON;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAyF0CQ,CAAS;AAAA;AAAA,qBAEtCF,EAAK,OAAO;AAAA,mGACkEA,EAAK,OAAS,mBAAmB;AAAA;AAAA,OAE7HC,EAAU,IAAKE,GAAMT;AAAA;AAAA;AAAA,gBAGZ,IAAMM,EAAK,SAASG,EAAE,IAAI,CAAC;AAAA;AAAA,SAElCA,EAAE,QAAUT,eAAiBS,EAAE,OAAO,wDAA0DT,kGAAoG;AAAA,sCACvKS,EAAE,IAAI;AAAA;AAAA,MAEtC,CAAC;AAAA;AAAA;AAAA;AAAA,EAKP,CCzIA,IAAMC,GAAY,OAAO,OAAW,IAqCpC,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EAAQ,GAC+B,CACvC,GAAI,CAACL,IAAa,CAACI,GAAY,CAACD,EAAgB,OAAO,KAEvD,IAAMG,EAAM,IADEJ,GAAU,yBAAyB,QAAQ,MAAO,EAAE,CAC/C,gCAAgC,mBAAmBE,CAAQ,CAAC,GAC/E,GAAI,CACEC,GACF,QAAQ,IAAI,yCAA0C,CAAE,SAAAD,EAAU,IAAKE,EAAI,QAAQH,EAAgB,KAAK,CAAE,CAAC,EAE7G,IAAMI,EAAM,MAAM,MAAMD,EAAK,CAC3B,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAUH,CAAc,EACzC,CACF,CAAC,EACD,GAAI,CAACI,EAAI,GACP,OAAIF,GAAO,QAAQ,IAAI,6CAA8CE,EAAI,OAAQ,MAAMA,EAAI,KAAK,CAAC,EAC1F,KAET,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,OAAKC,GAAM,eAAe,GACnBA,EAD8B,IAEvC,OAASC,EAAG,CACV,OAAIJ,GAAO,QAAQ,IAAI,4CAA6CI,CAAC,EAC9D,IACT,CACF,CAgBO,SAASC,GAAyBC,EAAqC,CAC5E,GAAI,CAACA,EAAQ,MAAO,GACpB,IAAMC,EAAI,OAAOD,CAAM,EAAE,YAAY,EACrC,OAAOC,IAAM,aAAeA,IAAM,WACpC,CF1EA,IAAMC,GAAY,OAAO,OAAW,IAChCC,GAAoB,KAExB,SAASC,EAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAA6BC,EAAW,CAAxC,kCAYI,KAAQ,eAAgC,KACxC,KAAQ,WAAa,GACrB,KAAQ,UAAY,GACpB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAA8B,KACtC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KAC5C,KAAQ,mBAA8B,GACtC,KAAQ,uBAAwC,KAChD,KAAQ,eAA0B,GAClC,KAAQ,oBAA+B,GACvC,KAAQ,mBAA8B,GACtC,KAAQ,aAA8B,KAEtC,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAuC,CAAC,EAChD,KAAQ,oBAAoD,KAC5D,KAAQ,qBAAuB,GACxC,KAAQ,gBAAiC,KACzC,KAAQ,IAAkB,KAC1B,KAAQ,yBAAoC,GAC5C,KAAQ,IAAwB,KAChC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAC9D,KAAQ,uBAA8C,KA+NtD,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,MACrB,KAAK,gBAAkB,UACvB,KAAK,gBAAkB,GACvB,KAAK,eAAiB,GACtB,KAAK,aAAe,KACpB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC3CC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACtI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EAwLA,KAAQ,sBAAwB,MAAOC,GAAsB,CAE3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAKC,GAAMA,GAAW,iBAAmBF,CAAS,EAQ1F,GAPIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAGjD,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GAGnBE,EAAc,KAAK,YAAY,EAAG,CACpCX,EAAS,KAAK,QAAQ,OAAS,GAAO,qBAAsB,CAC1D,eAAgB,KAAK,eACrB,WAAY,CAAC,CAACS,EACd,YAAaA,EAAM,CACjB,SAAWA,GAAa,SACxB,aAAeA,GAAa,aAC5B,WAAaA,GAAa,WAC1B,UAAYA,GAAa,UACzB,QAAUA,GAAa,QACvB,UAAYA,GAAa,UACzB,YAAcA,GAAa,YAC3B,eAAiBA,GAAa,eAC9B,qBAAuBA,GAAa,oBACtC,EAAI,IACN,CAAC,EACD,IAAMG,EAAcH,GAAK,QACzBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACJ,IAAMK,EAAM,KAAK,OAAO,EAClBC,EAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC5CC,EAAYP,GAAK,aACjBQ,EAAkBC,EAA2B,KAAK,YAAY,EAC9DC,EAAU,GAAQV,GAAOA,EAAI,cAAgB,CAACQ,EASpD,GARAjB,EAAS,KAAK,QAAQ,OAAS,GAAO,iCAAkC,CACtE,YAAAY,EACA,UAAAG,EACA,UAAAC,EACA,QAAAG,EACA,gBAAAF,EACA,YAAaR,GAAK,WACpB,CAAC,EACGU,EACF,GAAI,CACF,IAAMC,EAAa,KAAK,QAAgB,oBAAqB,KAAQ,6CACrEpB,EAAS,KAAK,QAAQ,OAAS,GAAO,gCAAiC,CAAE,iBAAkBoB,CAAQ,CAAC,EACpG,IAAMC,EAAW,CACf,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBZ,GAAK,SACtB,cAAe,iBACjB,CACF,EACAT,EAAS,KAAK,QAAQ,OAAS,GAAO,uCAAwC,CAAE,UAAAe,EAAW,eAAgBN,GAAK,eAAgB,YAAaA,GAAK,WAAY,CAAC,EAC/J,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWC,EACX,eAAiBN,GAAa,eAC9B,SAAAY,EACA,iBAAkBD,EAClB,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASE,EAAc,CACrBtB,EAAS,KAAK,QAAQ,OAAS,GAAO,oDAAqD,CACzF,QAASsB,GAAS,QAAS,KAAMA,GAAS,KAAM,KAAMA,GAAS,SAAWA,GAAS,IACrF,CAAC,CACH,MAEAtB,EAAS,KAAK,QAAQ,OAAS,GAAO,qBAAsB,CAC1D,OAAQS,EAAOA,EAAI,YAAc,UAAY,oBAAuB,eACpE,WAAY,CAAC,CAACA,EACd,YAAaA,GAAK,WACpB,CAAC,EAGHT,EAAS,KAAK,QAAQ,OAAS,GAAO,yCAA0C,CAC9E,UAAAe,EACA,eAAiBN,GAAa,cAChC,CAAC,EACD,IAAMc,EAAc,KAAK,QAAgB,oBAAqB,KAAQ,6CACtEvB,EAAS,KAAK,QAAQ,OAAS,GAAO,kCAAmC,CAAE,iBAAkBuB,CAAS,CAAC,EACvG,MAAOT,EAAI,OAAe,iBAAiB,CACzC,UAAWC,EACX,eAAiBN,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,MACf,gBAAiBA,GAAK,QACxB,CACF,EACA,iBAAkBc,CACpB,CAAC,EAAE,MAAOC,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASC,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACF,CAAC,EACD,MACF,CACA,IAAMK,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,MAEb,GAAI,CACF,IAAMvB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAKC,GAAMA,GAAW,iBAAmBF,CAAS,EACpFM,EAAM,KAAK,OAAO,EAClBC,EAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EACpDf,EAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqB,CACzD,eAAgB,KAAK,eACrB,WAAY,CAAC,CAACS,EACd,YAAaA,EAAM,CACjB,SAAWA,GAAa,SACxB,aAAeA,GAAa,aAC5B,WAAaA,GAAa,WAC1B,eAAiBA,GAAa,eAC9B,qBAAuBA,GAAa,qBACpC,eAAiBA,GAAa,cAChC,EAAI,IACN,CAAC,EACD,IAAMwB,EAAY,OAAQxB,GAAa,WAAa,EAAE,EAAE,YAAY,EAC9DyB,EAAQD,EAAU,SAAS,KAAK,EAChCE,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASF,EAASC,EAAK,KAAOA,EAAK,IAAO,KAAK,QAAgB,iBAAqBA,EAAK,IAAO,KAAK,QAAgB,iBAErHE,EAAOJ,EAAU,SAAS,IAAI,EACpC,GAAIxB,GAAK,YACP,GAAI,CACF,IAAMY,EAAW,CACf,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAea,EAAQ,MAASG,EAAO,KAAQ,KAAK,QAAgB,cACpE,gBAAkB5B,GAAa,SAC/B,cAAe,iBACjB,CACF,EACA,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWC,EACX,eAAiBN,GAAa,eAC9B,SAAAY,EACA,iBAAkBe,GAAU,GAC5B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASd,EAAc,CACrBtB,EAAS,KAAK,QAAQ,OAAS,GAAO,oDAAqD,CACzF,QAASsB,GAAS,QAAS,KAAMA,GAAS,KAAM,KAAMA,GAAS,SAAWA,GAAS,IACrF,CAAC,EAED,MACF,CAEF,MAAOR,EAAI,OAAe,iBAAiB,CACzC,UAAWC,EACX,eAAiBN,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAkBA,GAAa,QACjC,CACF,EACA,iBAAkB2B,GAAU,4CAC9B,CAAC,EAAE,MAAOZ,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASC,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EArmBQ,QAAoB,CAC1B,GAAI,CAAC,KAAK,IAAK,CACb,IAAIW,EAAW,KAAK,OAEpB,IADmB,KAAK,eAAiB,iBAAmB,KAAK,eAAiB,aAAe,KAAK,IACvF,CACb,IAAMC,EAAW,KAAK,IAAY,iBAAiB,EAC/CA,IAASD,EAAM,CAAE,GAAGA,EAAK,YAAaC,CAAQ,EACpD,CAEI,KAAK,qBAAqB,cAC5BD,EAAM,CAAE,GAAGA,EAAK,cAAe,KAAK,oBAAoB,aAAc,EAC5D,KAAK,QAAgB,eAAiB,MAAQ,OAAQ,KAAK,OAAe,eAAkB,WACtGA,EAAM,CAAE,GAAGA,EAAK,cAAgB,KAAK,OAAe,aAAc,GAGhE,CAACA,EAAI,gBAAkB,KAAK,qBAAqB,iBAAoB,KAAK,QAAgB,mBAC5FA,EAAM,CAAE,GAAGA,EAAK,gBAAiB,KAAK,qBAAqB,iBAAoB,KAAK,OAAe,eAAgB,GAErH,KAAK,IAAME,EAAUF,CAAG,CAC1B,CACA,OAAO,KAAK,GACd,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBvC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAM0C,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAK,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAIhD,GAAa8C,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBG,EAAoE,CAChG,GAAI,CACF,IAAMC,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcC,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEN,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcS,EAAiC,CACnD,IAAMR,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACQ,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMV,EAAI,QAAQS,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAASV,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAeS,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAAC5D,GACL,CAAAE,EAAS,KAAK,QAAQ,OAAS,GAAO,uBAAwB,CAAE,OAAQ,KAAK,MAAO,CAAC,EAEjF,KAAK,QAAQ,OACf4D,GAAe,KAAM,KAAK,OAAO,KAAK,EAExC,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CACvG,GAAI,CACF,OAAO,iBAAiB,iCAAmC,GAAW,CACpE5D,EAAS,KAAK,QAAQ,OAAS,GAAO,0BAA2B,CAAE,OAAQ,GAAG,MAAO,CAAC,EACtF,KAAK,gBAAkB,GACvB,KAAK,iBAAmB,GACxB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,CACT,KAAK,uBAAyB,IAAM,CAClC,KAAK,UAAY,GACjB,KAAK,WAAa,GAClB,KAAK,cAAc,CACrB,EACA,GAAI,CAAE,OAAO,iBAAiB,kCAAmC,KAAK,sBAAuC,CAAG,MAAQ,CAAC,CACzH,KAAK,0BAA0B,EACjC,CAEA,sBAA6B,CAE3B,GADA,MAAM,qBAAqB,EACvB,KAAK,uBACP,GAAI,CAAE,OAAO,oBAAoB,kCAAmC,KAAK,sBAAuC,CAAG,MAAQ,CAAC,CAEhI,CAGA,MAAc,2BAA2C,CACvD,IAAM6D,EAAY,KAAK,QAAgB,gBAEvC,GADI,CAACA,GAAY,OAAOA,GAAa,UAAYA,EAAS,KAAK,IAAM,IACjE,KAAK,qBAAuB,KAAM,OACtC,IAAMC,EAAM,KAAK,QAAQ,eACnBC,EAAS,KAAK,QAAQ,QAAU,wBACtC,GAAKD,EACL,MAAK,qBAAuB,GAC5B,KAAK,cAAc,EACnB,GAAI,CACF,IAAM3D,EAAO,MAAM6D,GAAmBD,EAAQD,EAAKD,EAAS,KAAK,EAAG,CAAC,CAAC,KAAK,QAAQ,KAAK,EAExF,GADA,KAAK,oBAAsB1D,GAAQ,KAC/BA,GAAM,cACR,GAAI8D,GAAyB9D,EAAK,cAAc,MAAM,EACpD,KAAK,UAAY,GACjB,KAAK,cAAc,MACd,CACL,IAAM+D,EAAK/D,EAAK,cAChB,KAAK,OAAS,CACZ,GAAG,KAAK,OACR,cAAe+D,EACf,UAAW,OAAOA,EAAG,WAAc,SAAWA,EAAG,UAAa,KAAK,QAAQ,WAAa,EACxF,cAAgBA,EAAG,kBAAqB,KAAK,QAAgB,eAAkB,MACjF,EACA,KAAK,IAAM,KACX,KAAK,cAAc,CACrB,CAEJ,OAASzC,EAAG,CACVzB,EAAS,KAAK,QAAQ,OAAS,GAAO,4BAA6ByB,CAAC,CACtE,QAAE,CACA,KAAK,qBAAuB,GAC5B,KAAK,cAAc,CACrB,EACF,CAEU,QAAQ0C,EAAqC,CAIrD,GAHIA,EAAQ,IAAI,QAAQ,GAAK,KAAK,QAAQ,OACxCP,GAAe,KAAM,KAAK,OAAO,KAAK,EAEpCO,EAAQ,IAAI,QAAQ,EAAG,CACzB,IAAMC,EAAS,KAAK,QAAgB,gBAChC,KAAK,qBAAuB,KAAK,oBAAoB,kBAAoBA,IAC3E,KAAK,oBAAsB,KAC3B,KAAK,IAAM,MAETA,GAAS,KAAK,qBAAuB,MAAQ,CAAC,KAAK,sBACrD,KAAK,0BAA0B,CAEnC,CACA,GAAID,EAAQ,IAAI,QAAQ,GAAK,KAAK,eAAiB,KAAK,QAAQ,cAAe,CAC7E,IAAMnC,EAAS,KAAK,cAEpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAGxH,KAAK,kBAAoB,YAAc,CAAC,KAAK,iBAC/C,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,OAAO,KAAK,IAAI,CAAG,EAAG,CAAC,EAE7D,CAEImC,EAAQ,IAAI,QAAQ,IAEtB,KAAK,IAAM,KAGf,CAyBQ,aAAaE,EAAgB,CAAE,KAAK,eAAiBA,CAAQ,CAErE,MAAc,cAAiC,CAC7C,GAAI,KAAK,OAAO,aACd,OAAK,KAAK,OAAO,cAKV,IAJL,KAAK,cAAgB,MACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EACtE,IAKX,GAAI,KAAK,gBAAiB,MAAO,GACjC,GAAI,CACGtE,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAGxB,IAAM0C,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EAEnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAK,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAIhD,GAAa8C,CAAI,EAChC,IAAMyB,EAAmB,KAAK,IAAI,kBAAkB,EAEpD,GADAtE,EAAS,KAAK,QAAQ,OAAS,GAAO,oBAAqBsE,CAAgB,EACvE,CAACA,GAAkB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EAErE,YAAK,cAAgB,MACrB,KAAK,gBAAkB,GAChB,EACT,OAAS3C,EAAO,CACd,YAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACd,EACT,CACF,CAEQ,YAAY4C,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAE5F,kBAAkBd,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EAC7C,KAAK,eAAiB,SAAQ,KAAK,yBAA2B,IAElD,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAG5B,GAFA3D,EAAS,KAAK,QAAQ,OAAS,GAAO,wBAAyB2D,CAAM,EAEjE,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,qBAAqB,KAAK,CACjC,CAAC,EAAE,MAAO3B,GAAe,CACvB3B,EAAS,KAAK,QAAQ,OAAS,GAAO,0BAA2B2B,CAAK,EACtE,IAAM6C,GAAUf,GAAY,IAAI,YAAY,IAAM,OAC5CvD,EAAWyB,IAAUA,EAAM,SAAW,OAAOA,CAAK,IAAO,GAE/D,GADgB6C,GAAW,CAAC,KAAK,2BAA8BtE,EAAQ,SAAS,mCAAmC,GAAKA,EAAQ,SAAS,gDAAgD,GAC5K,CAEX,KAAK,yBAA2B,IAC/B,SAAY,CACX,GAAI,CACGH,KAAiEA,IAAlC,KAAM,QAAO,6BAAkB,GAAyB,cAC9F,IAAM0E,EAAW,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EAC/CC,EAAU,KAAK,QAAgB,mBACrC,GAAIA,IAAWA,EAAO,IAAMA,EAAO,KAAOA,EAAO,KAAM,CACrD,IAAMC,EAAoC,CAAC,EACvCD,EAAO,IAAIC,EAAS,KAAK,IAAI,EAC7BD,EAAO,KAAKC,EAAS,KAAK,KAAK,EAC/BD,EAAO,KAAKC,EAAS,KAAK,KAAK,EAC/BA,EAAS,SAAQF,EAAI,WAAaE,EACxC,MAAY,KAAK,QAAgB,aAC/BF,EAAI,WAAc,KAAK,OAAe,YAEtC,IAAMnC,EAAWQ,EAAsB2B,CAAG,EAC1C,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAA1B,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClET,EAAI,iBAAmB,KAAK,QAAQ,kBAAoBS,EAAwB,CAClF,CACF,MAAQ,CAAC,CACT,KAAK,IAAM,IAAIhD,GAAauC,CAAG,EACjB,KAAK,IAAI,QAAQ,MAAM,EAC/B,KAAMqB,GAAgB,CAE1B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,MAAO,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACxH,IAAMR,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EACxD,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBF,EAAY,cAAe,CAACI,GAAoBC,KAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,GAAY,IAAAC,GAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,CAAG,EACnO,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,qBAAqB,KAAK,CACjC,CAAC,EAAE,MAAOuB,GAAc,CACtB5E,EAAS,KAAK,QAAQ,OAAS,GAAO,sCAAuC4E,CAAI,EACjF,KAAK,aAAeA,aAAgB,MAAQA,EAAK,QAAU,2BAC3D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASC,EAAS,CAChB7E,EAAS,KAAK,QAAQ,OAAS,GAAO,2BAA4B6E,CAAO,EACzE,KAAK,aAAeA,aAAmB,MAAQA,EAAQ,QAAU,2BACjE,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,GAAG,EACH,MACF,CACA,KAAK,aAAelD,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd3B,EAAS,KAAK,QAAQ,OAAS,GAAO,iCAAkC2B,CAAK,EAC7E,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,qBAAqBK,EAAe,CAChD,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KACrB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMlB,EAAM,KAAK,OAAO,EAClB,CAAE,SAAAgE,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAAjE,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC7C,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiBgE,EACtB,KAAK,cAAgB9C,CACvB,OAASP,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiBA,IAAMA,EAAE,SAAW,OAAOA,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAiMQ,mBAAoB,CAC1B,GAAI,CAAC,KAAK,iBAAmB,CAAC,KAAK,IAAK,OAAO,KAC/C,IAAMuD,EAAa,KAAK,IAAI,kBAAkB,GAAK,CAAC,EAC9CC,EAAUC,EAAmBF,CAAU,EACvCG,EAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAE5FC,EAAY,EACZrE,EAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC9CsE,EAAcF,GAAiBpE,EAAY,GAAKA,EAAYqE,EAC5DE,EAAO,KAAK,IAAI,EAAGF,EAAYrE,CAAS,EACxCwE,EAAUF,EAAc,iCAAiCD,CAAS,yBAAyBE,EAAK,QAAQ,CAAC,CAAC,SAAW,KACrHE,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,KAAK,gBACd,QAAAR,EACA,aAAc,GACd,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAc,KAAK,gBAAkB,CAAC,EAAK,CAAC,EAC/E,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBS,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAClD,SAAWjC,GAAqB,CAE9B,KAAK,kBAAkBA,CAAQ,CACjC,EACE,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAChF,aAAc0B,EAAgB,IAAM,KAAK,YAAY,EAAI,OACzD,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAgBA,EAChB,kBAAmBI,EACnB,eAAgB,KAAK,eACrB,UAAW,IAAM,CACf,KAAK,gBAAkB,GACvB,KAAK,mBAAqB,GAC1B,KAAK,eAAiB,GACtB,KAAK,IAAI,CACX,EACA,MAAOC,CACT,CAAC,CACH,CAEQ,aAAc,CAEpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GAEvB,IAAMG,EAAO,MAAM,QAAQ,KAAK,QAAQ,QAAQ,SAAS,EACpD,KAAK,OAAO,OAAQ,UAAW,OAAOC,GAAKA,GAAMA,EAAE,UAAY,EAAM,EACtE,CAAC,EACCC,EAAYF,EAAK,OAASA,EAAO,CAAC,CAAE,KAAM,WAAY,KAAM,WAAY,QAAS,EAAK,CAAC,EACzFE,EAAU,OAAS,EACrB,KAAK,mBAAqB,IAE1B,KAAK,uBAAyBA,EAAU,CAAC,GAAG,MAAQ,WAEpD,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,EAEjD,CAEA,MAAc,oBAAqB,CACjC,GAAI,CACF,IAAM9E,EAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC9CD,EAAM,KAAK,OAAO,EACnB,KAAK,iBAAgB,KAAK,eAAiB,OAChD,IAAMgF,EAAO,MAAMhF,EAAI,eAAeC,EAAW,OAAkB,CACjE,QAAS,oBACT,cAAe,GACf,eAAgB,KAAK,wBAA0B,UACjD,CAAC,EACKgF,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EACJF,GAAM,UAAU,cAAc,cAC9BA,GAAM,UAAU,QAAQ,cACxBA,GAAM,eAAe,UAAU,OAAO,aACtCA,GAAM,eAAe,UAAU,OAAO,cACtCA,GAAM,UAAU,OAAO,aACvBA,GAAM,UAAU,OAAO,cACvB,KACF,KAAK,mBAAqBE,GAAgB,KAC1C,IAAMC,EAAkBH,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KAE/H,GADA,KAAK,sBAAwBG,EACzBF,EAAK,CACP,KAAK,UAAYA,EAEjB,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EAEtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CAET,KAAK,mBAAmB,MAAS,CACnC,MAEE,KAAK,UAAY,KACjB,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CAEV,KAAK,UAAY,KACjB,KAAK,mBAAsB,GAAW,SAAW,KACjD,KAAK,gBAAkB,GACvBrE,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACF,CAEQ,mBAAmBuE,EAAkB,CAE3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAE7H,IAAMD,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OAEtB,IAAMnF,EAAM,KAAK,OAAO,EAClBqF,EAAiB,IAAM,CAC3B,GAAI,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EAEMC,EAAY3E,GAAW,CAAE0E,EAAe,CAAG,EACjD,GAAI,CAAE,OAAO,iBAAiB,kCAAmCC,EAAiB,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnH,KAAK,oBAAsB,GAC3B,KAAK,uBAAyBtF,EAAI,0BAA0BmF,EAAiB,IAAMC,CAAO,EAE1F,KAAK,gBAAkB,CACzB,CAEQ,iBAAiBG,EAAsB,GAAO,CACpDC,GAAqB,KAAiC,CAAE,cAAe,MAAO,oBAAAD,CAAoB,CAAC,CACrG,CAEA,MAAc,KAAM,CAClB,GAAKvG,GAGL,MAAK,iBAAiB,KAAK,eAAe,EAG1C,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,KAAK,QAAQ,UAAW,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAEtM,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,CADU,MAAM,KAAK,aAAa,EAC1B,OAEZ,IAAMgB,EAAM,KAAK,OAAO,EAExB,GAAI,CACF,IAAMyF,EAAM,KAAK,QAAgB,gBAC3BC,EAAW,MAAc,KAAK,QACpCxG,EAAS,KAAK,QAAQ,OAAS,GAAO,8BAA+B,CACnE,gBAAiBuG,EACjB,WAAYC,EACZ,UAAYD,GAAI,OAASA,GAAI,WAAaC,GAAS,OAASA,GAAS,WAAa,IACpF,CAAC,CACH,MAAQ,CAAC,CAET,KAAK,gBAAkB,WACvB,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,KAAK,EACrC,MACF,OAAS,EAAG,CACVxG,EAAS,KAAK,QAAQ,OAAS,GAAO,gBAAiB,CACrD,QAAU,GAAW,QACrB,KAAO,GAAW,KAClB,QAAU,GAAW,QACrB,MAAQ,GAAW,KACrB,CAAC,EACD0B,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEA,QAAS,CACP,GAAI,CAAC,KAAK,OAAQ,OAAO8E,2DAEzB,GAAI,KAAK,sBAAyB,KAAK,QAAgB,gBACrD,OAAOA,mEAGT,IAAMC,EAAiB,KAAK,gBAAkB,MACxC3F,EAAY,OAAO,KAAK,QAAQ,WAAc,SAAW,KAAK,OAAO,UAAa,KAAK,qBAAqB,eAAe,WAAa,KAAO,OAAO,KAAK,oBAAoB,cAAc,SAAS,EAAI,OAC1M4F,EAAa,OAAO5F,GAAc,SAAW,GAAG,OAAOA,CAAS,EAAE,QAAQ,CAAC,CAAC,GAAK,GAEjF6F,GADW,KAAK,QAAQ,cAAgB,OAAO7F,GAAc,SAAW,kBAAoB,sBAC3E,QAAQ,WAAY4F,GAAc,OAAO,EAAE,QAAQ,WAAYD,CAAc,EAE9FG,EADkB,KAAK,QAAQ,aAAa,UAAY,GAExDC,EAAkB,KAAK,iBAAmB,KAAK,iBAErD,OAAOL;AAAA;AAAA,UAEDI,EAAkBJ;AAAA;AAAA,qBAEP,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,QAAQ,WAAa,KAAK,qBAAqB,eAAe,WAAa,CAAC,CAAC;AAAA,4BACnFC,CAAc;AAAA,yBACjBI,CAAe;AAAA;AAAA,UAE5B,IAAI;AAAA;AAAA;AAAA,sCAGsB,KAAK,WAAW,aAAa,EAAE;AAAA,wBAC7C,KAAK,YAAe,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK;AAAA,qBACnI,IAAM,KAAK,IAAI,CAAC;AAAA,cACvB,KAAK,WAAa,KAAK,QAAQ,oBAAsB,OAAU,KAAK,WAAa,mBAAgBF,CAAM;AAAA;AAAA;AAAA;AAAA,UAI3G,KAAK,aAAeH;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA,wKAA0K,KAAK,WAAW,YAAc,EAAE;AAAA;AAAA,UAE/N,EAAE;AAAA,UACJ,KAAK,kBAAkB,CAAC;AAAA,WACvB,IAAM,CACP,IAAMjB,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOiB;AAAA,cACHM,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAWrB,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOF,CACT,CAAC,CAAC;AAAA,cACAwB,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAK,KAAK,WAAa,OACvB,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOxB,CACT,CAAC,CAAC;AAAA,cACAyB,GAA2B,CAC3B,QAAS,KAAK,mBACd,WAAY,IAAM,CAChB,IAAMtB,EAAO,MAAM,QAAQ,KAAK,QAAQ,QAAQ,SAAS,EAAK,KAAK,OAAQ,OAAQ,UAAW,OAAOC,GAAKA,GAAMA,EAAE,UAAY,EAAM,EAAK,CAAC,EAE1I,OADYD,EAAK,OAASA,EAAO,CAAC,CAAE,KAAM,WAAY,KAAM,WAAY,QAAS,EAAK,CAAC,GAC5E,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,OAASA,EAAE,OAAS,WAAa,WAAaA,EAAE,MAAO,QAAUA,EAAU,SAAW,IAAK,EAAE,CAC5I,GAAG,EACH,SAAWsB,GAAiB,CAC1B,KAAK,uBAAyBA,EAC9B,KAAK,mBAAqB,GAC1B,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,EACA,QAAS,IAAM,CAAE,KAAK,mBAAqB,EAAO,EAClD,MAAO,yBACP,MAAO1B,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,KAMV,CACF,EAl8BapF,EACJ,OAAS,CAAC+G,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAXflH,EAWiB,sBACXiH,EAAA,CAAhBE,EAAM,GAZInH,EAYM,8BACAiH,EAAA,CAAhBE,EAAM,GAbInH,EAaM,0BACAiH,EAAA,CAAhBE,EAAM,GAdInH,EAcM,yBACAiH,EAAA,CAAhBE,EAAM,GAfInH,EAeM,4BACAiH,EAAA,CAAhBE,EAAM,GAhBInH,EAgBM,6BACAiH,EAAA,CAAhBE,EAAM,GAjBInH,EAiBM,2BACAiH,EAAA,CAAhBE,EAAM,GAlBInH,EAkBM,+BACAiH,EAAA,CAAhBE,EAAM,GAnBInH,EAmBM,6BACAiH,EAAA,CAAhBE,EAAM,GApBInH,EAoBM,+BACAiH,EAAA,CAAhBE,EAAM,GArBInH,EAqBM,+BACAiH,EAAA,CAAhBE,EAAM,GAtBInH,EAsBM,+BACAiH,EAAA,CAAhBE,EAAM,GAvBInH,EAuBM,yBACAiH,EAAA,CAAhBE,EAAM,GAxBInH,EAwBM,qCACAiH,EAAA,CAAhBE,EAAM,GAzBInH,EAyBM,kCACAiH,EAAA,CAAhBE,EAAM,GA1BInH,EA0BM,kCACAiH,EAAA,CAAhBE,EAAM,GA3BInH,EA2BM,sCACAiH,EAAA,CAAhBE,EAAM,GA5BInH,EA4BM,8BACAiH,EAAA,CAAhBE,EAAM,GA7BInH,EA6BM,mCACAiH,EAAA,CAAhBE,EAAM,GA9BInH,EA8BM,kCACAiH,EAAA,CAAhBE,EAAM,GA/BInH,EA+BM,4BAEAiH,EAAA,CAAhBE,EAAM,GAjCInH,EAiCM,gCACAiH,EAAA,CAAhBE,EAAM,GAlCInH,EAkCM,+BACAiH,EAAA,CAAhBE,EAAM,GAnCInH,EAmCM,6BACAiH,EAAA,CAAhBE,EAAM,GApCInH,EAoCM,8BACAiH,EAAA,CAAhBE,EAAM,GArCInH,EAqCM,mCACAiH,EAAA,CAAhBE,EAAM,GAtCInH,EAsCM,oCAtCNA,EAANiH,EAAA,CADNG,GAAc,kBAAkB,GACpBpH,GGjCb,OAAS,cAAAqH,GAAY,QAAAC,GAAM,OAAAC,OAAW,MACtC,OAAS,iBAAAC,GAAe,YAAAC,GAAU,SAAAC,MAAa,oBAgB/C,IAAMC,GAAY,OAAO,OAAW,IAChCC,GAAoB,KAExB,SAASC,GAASC,EAAgBC,EAAiBC,EAAkB,CAC/DF,IACEE,IAAS,OACX,QAAQ,IAAI,kBAAkBD,CAAO,GAAIC,CAAI,EAE7C,QAAQ,IAAI,kBAAkBD,CAAO,EAAE,EAG7C,CAGO,IAAME,EAAN,cAA+BC,EAAW,CAA1C,kCAwBI,KAAQ,UAAoB,EAC5B,KAAQ,cAAyB,GACjC,KAAQ,eAAgC,KACxC,KAAQ,WAAa,GACrB,KAAQ,UAAY,GACpB,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAC9C,KAAQ,YAA6B,KACrC,KAAQ,gBAAkB,GAC1B,KAAQ,cAA8B,KACtC,KAAQ,gBAAkB,GAC1B,KAAQ,gBAA0C,UAClD,KAAQ,gBAAkB,GAC1B,KAAQ,UAA2B,KACnC,KAAQ,sBAAuC,KAC/C,KAAQ,mBAAoC,KAC5C,KAAQ,eAA0B,GAClC,KAAQ,aAA8B,KAC/C,KAAQ,IAAkB,KAC1B,KAAQ,2BAAyC,KACjD,KAAQ,gBAAiC,KACzC,KAAQ,oBAA+B,GACvC,KAAQ,uBAAsD,KAErD,KAAQ,iBAAmB,GAC3B,KAAQ,gBAAkB,GAC1B,KAAQ,cAA+B,KACvC,KAAQ,eAAwB,CAAC,EAC1C,KAAQ,IAAwB,KA4ChC,KAAQ,gBAAkB,MAAO,GAAW,CAC1C,GAAI,CACF,GAAI,KAAK,IACP,GAAI,CAAE,MAAM,KAAK,IAAI,WAAW,CAAG,MAAQ,CAAC,CAE9C,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAC5F,KAAK,cAAgB,MACrB,KAAK,gBAAkB,GACvB,KAAK,cAAc,EACnB,GAAI,CACF,IAAMC,EAAS,OAAO,KAAK,WAAa,CAAC,EACnCC,EAAO,KAAK,gBAAkB,MACpC,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAAD,EAAQ,SAAUC,CAAK,CAAE,CAAC,CAAC,CACtI,MAAQ,CAAC,CACX,MAAQ,CAAC,CACX,EA8MA,KAAQ,sBAAwB,MAAOC,GAAsB,CAC3D,IAAMC,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAKjG,GAJIC,GAAK,eAAc,KAAK,eAAiBA,EAAI,cAEjD,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACnBE,EAAc,KAAK,YAAY,EAAG,CACpC,IAAMF,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FI,EAAcH,GAAK,QACzBI,EAAeD,EAAa,CAAE,SAAW,KAAK,KAAa,iBAAiB,GAAM,KAAK,QAAgB,YAAa,UAAWH,GAAK,UAAW,aAAeA,GAAa,aAAc,aAAcA,GAAK,aAAc,SAAUA,GAAK,QAAS,CAAC,EAAE,KAAK,SAAY,CACpQ,GAAI,CACF,IAAMK,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,WAAa,CAAC,EAE5C,GAAIP,GAAK,aAAe,CAACQ,EAA2B,KAAK,YAAY,EACnE,GAAI,CACF,MAAOH,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,cAAe,MACf,gBAAiBA,GAAK,SACtB,cAAe,mBACjB,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,6CAC/E,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,KAAK,iBAAmB,GACxB,MACF,OAASS,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SACzB,cAAe,MACf,gBAAiBA,GAAK,QACxB,EACA,kBAAsB,KAAK,QAAgB,oBAAuB,CAAC,IAAI,KAAQ,4CACjF,CAAC,EAAE,MAAOgB,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CACA,KAAK,iBAAmB,EAC1B,CAAC,EACD,MACF,CACA,IAAMM,EAAS,KAAK,cACpB,GADmC,KAAK,cAAgB,KACpDA,IAAW,MAEb,GAAI,CACF,IAAMjB,GAAO,KAAK,gBAAkB,CAAC,GAAG,KAAMC,GAAYA,GAAW,iBAAmBF,CAAS,EAC3FM,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,WAAa,CAAC,EACtCW,EAAY,OAAQlB,GAAa,YAAeA,GAAa,WAAa,EAAE,EAAE,YAAY,EAC1FmB,EAAQD,EAAU,SAAS,KAAK,EAChCE,EAAOF,EAAU,SAAS,IAAI,EAC9BG,EAAQ,KAAK,QAAgB,oBAAsB,CAAC,EACpDC,EAASH,GAASE,EAAK,KAAOA,EAAK,GAEzC,GAAKrB,GAAa,YAChB,GAAI,CACF,IAAMuB,EAAW,CACf,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAeJ,EAAQ,MAASC,EAAO,KAAQ,KAAK,QAAgB,cACpE,gBAAkBpB,GAAa,SAC/B,cAAe,mBACjB,CACA,EACA,MAAOK,EAAI,OAAe,qBAAqB,CAC7C,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAAuB,EACA,iBAAmBD,GAAU,GAC7B,cAAgB,KAAK,QAAgB,aACvC,CAAC,EACD,MACF,OAASb,EAAG,CAEVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EACD,MACF,CAEF,MAAON,EAAI,OAAe,iBAAiB,CACzC,UAAWE,EACX,eAAiBP,GAAa,eAC9B,SAAU,CACR,GAAI,KAAK,QAAgB,SAC3B,MAAO,CACL,IAAM,KAAK,QAAgB,UAAY,CAAC,IAAI,OAAS,CAAC,EACtD,cAAe,KACf,gBAAiBA,GAAK,QACxB,CACA,EACA,iBAAkBsB,GAAU,4CAC9B,CAAC,EAAE,MAAON,GAAa,CAAE,MAAMA,CAAK,CAAC,CACvC,OAASP,EAAG,CACVC,EAAkBD,EAAG,CACnB,QAAUE,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,CACH,CAEJ,EAtZA,mBAA0B,CAExB,GADA,MAAM,kBAAkB,EACpB,EAACtB,GACL,CAAAE,GAAS,KAAK,QAAQ,OAAS,GAAO,yBAA0B,CAAE,OAAQ,KAAK,MAAO,CAAC,EACvF,KAAK,UAAY,OAAO,KAAK,QAAQ,kBAAoB,CAAC,EAC1D,KAAK,cAAgB,GAGrB,GAAI,CAAE,OAAO,iBAAiB,uBAAwB,KAAK,eAAgC,CAAG,MAAQ,CAAC,CAEvG,GAAI,CACF,OAAO,iBAAiB,iCAAkC,IAAM,CAC9D,KAAK,gBAAkB,GACvB,KAAK,cAAc,CACrB,EAAmB,CACrB,MAAQ,CAAC,EACX,CAEU,QAAQiC,EAAqC,CACrD,GAAIA,EAAQ,IAAI,QAAQ,IAElB,CAAC,KAAK,eAAiB,OAAO,KAAK,QAAQ,kBAAqB,WAC9D,KAAK,YAAc,GAAK,KAAK,WAAa,MAAQ,OAAO,MAAM,KAAK,SAAS,KAC/E,KAAK,UAAY,OAAO,KAAK,OAAO,gBAAgB,GAMpD,KAAK,eAAiB,KAAK,QAAQ,eAAe,CACpD,IAAMP,EAAS,KAAK,cACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,UAAW,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAExH,KAAK,kBAAoB,aAC3B,KAAK,cAAgB,KACrB,WAAW,IAAM,CAAMA,IAAW,OAAO,KAAK,IAAI,CAAG,EAAG,CAAC,EAE7D,CAEJ,CAsBQ,cAAc,EAAQ,CAC5B,IAAMQ,EAAO,OAAO,KAAK,QAAQ,SAAW,EAAG,EACzCC,EAAQ,KAAK,IAAI,EAAG,OAAO,EAAE,OAAO,OAAS,CAAC,CAAC,EAC/CC,EAAU,KAAK,MAAMD,EAAQD,CAAI,EAAIA,EAC3C,KAAK,UAAY,OAAOE,EAAQ,QAAQ,CAAC,CAAC,EAC1C,KAAK,cAAgB,EACvB,CAEQ,aAAaC,EAAgB,CAAE,KAAK,eAAiBA,CAAQ,CAE7D,eAAyB,CAC/B,IAAMC,EAAM,OAAO,KAAK,QAAQ,QAAU,EAAG,EACvCC,EAAM,KAAK,QAAQ,SAAW,OAAY,OAAO,KAAK,OAAO,MAAM,EAAI,IAC7E,OAAO,KAAK,WAAaD,GAAO,KAAK,WAAaC,CACpD,CAGA,MAAc,gBAA+B,CAC3C,GAAI,KAAK,IAAK,OAAO,KAAK,IACrBxC,KAEHA,IADe,KAAM,QAAO,6BAAkB,GACxB,cAExB,IAAMyC,EAAe,CAAC,EAAG,KAAK,QAAgB,kBAAqB,KAAK,QAAgB,WAAW,kBAC7FC,EAAe,CAAE,GAAI,KAAK,QAAQ,WAAa,CAAC,CAAG,EACnDC,EAAS,KAAK,QAAgB,mBACpC,GAAIA,IAAUA,EAAM,IAAMA,EAAM,KAAOA,EAAM,KAAM,CACjD,IAAMC,EAAmC,CAAC,EACtCD,EAAM,IAAIC,EAAQ,KAAK,IAAI,EAC3BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BD,EAAM,KAAKC,EAAQ,KAAK,KAAK,EAC7BA,EAAQ,SAAQF,EAAQ,WAAaE,EAC3C,MAAY,KAAK,QAAgB,aAC/BF,EAAQ,WAAc,KAAK,OAAe,YAE5C,IAAMG,EAAYJ,EAAeK,EAAsBJ,CAAO,EAAIA,EAClE,GAAI,CACF,GAAI,OAAO,OAAW,IAAa,CACjC,GAAM,CAAE,wBAAAK,CAAwB,EAAI,KAAM,QAAO,sBAAiB,EAClEF,EAAK,iBAAmB,KAAK,QAAQ,kBAAoBE,EAAwB,CACnF,CACF,MAAQ,CAAC,CACT,YAAK,IAAM,IAAI/C,GAAa6C,CAAI,EACzB,KAAK,GACd,CAQA,MAAM,wBAAwBG,EAAoE,CAChG,GAAI,CACF,IAAMC,EAAM,MAAM,KAAK,eAAe,EACtC,MAAI,CAACA,GAAO,OAAOA,EAAI,yBAA4B,WAAmB,KAC/D,MAAMA,EAAI,wBAAwB,CACvC,YAAcC,GAAiB,CAC7B,KAAK,gBAAkB,GACvB,KAAK,aAAe,gBACpB,IAAMC,EAAaC,EAAyB,KAAK,IAAKF,CAAO,EACvDG,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAY,eAAgB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACjI,GAAI,CAAEN,GAAa,cAAc,CAAG,MAAQ,CAAC,CAC7C,KAAK,cAAc,CACrB,CACF,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,CAMA,MAAM,yBAA4C,CAChD,GAAI,CAEF,OADY,MAAM,KAAK,eAAe,IACjB,sBAAsB,GAAK,EAClD,MAAQ,CACN,MAAO,EACT,CACF,CAOA,MAAM,cAAcS,EAAiC,CACnD,IAAMR,EAAM,MAAM,KAAK,eAAe,EACtC,GAAI,CAACA,GAAO,CAACQ,EAAU,MAAM,IAAI,MAAM,sBAAsB,EAC7D,IAAMC,GAAMD,GAAY,IAAI,YAAY,EAClCE,EAAS,MAAMV,EAAI,QAAQS,CAAE,EAEnC,GAAI,CADgB,CAAC,EAAEC,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAASV,EAAI,UACvG,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,KAAK,aAAeS,EACpB,IAAMP,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KACX,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYI,CAAG,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpH,KAAK,cAAc,CACrB,CAEA,MAAc,cAAiC,CAC7C,GAAI,KAAK,OAAO,aACd,OAAK,KAAK,OAAO,cAKV,IAJL,KAAK,cAAgB,MACrB,KAAK,cAAc,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAAC,EACtE,IAKX,GAAI,KAAK,gBAAiB,MAAO,GACjC,GAAI,CAGF,GAAI,EAFQ,MAAM,KAAK,eAAe,GACT,kBAAkB,GACxB,OAAQ,MAAM,IAAI,MAAM,sBAAsB,EACrE,YAAK,cAAgB,MACrB,KAAK,gBAAkB,GAChB,EACT,OAASrC,EAAO,CACd,YAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACd,EACT,CACF,CAEQ,YAAYuC,EAAgB,CAAE,OAAQA,IAAMA,EAAE,IAAMA,EAAE,UAAYA,EAAE,MAAS,EAAI,CACjF,eAAeA,EAAgB,CAAE,OAAQA,IAAMA,EAAE,OAASA,EAAE,MAAQA,EAAE,OAASA,EAAE,KAAQ,QAAU,CACnG,cAAcA,EAAuB,CAAE,OAAQA,IAAMA,EAAE,MAAQA,EAAE,MAAQA,EAAE,QAAW,IAAM,CAG5F,kBAAkBH,EAAkB,CAC1C,GAAK,KAAK,IACV,GAAI,CACF,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,uBAAuB,EACtD,KAAK,cAAgBA,GAAY,IAAI,YAAY,EACjC,KAAK,IAAI,QAAQA,CAAQ,EACjC,KAAME,GAAgB,CAE5B,GAAI,CADgB,CAAC,EAAEA,IAAWA,EAAO,YAAc,IAASA,EAAe,WAAcA,EAAe,OAAS,KAAK,KAAK,UAC7G,MAAM,IAAI,MAAM,gCAAgC,EAClE,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,WAAYF,CAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1H,IAAMN,EAAaC,EAAyB,KAAK,IAAKO,CAAM,EACtDN,EAAe,KAAK,KAAa,iBAAiB,EAClDC,EAAkB,KAAK,KAAa,oBAAoB,EAC9D,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,gBAAiBH,EAAY,cAAe,CAACI,EAAoBC,IAAa,KAAK,IAAK,SAAS,CAAE,WAAAD,EAAY,IAAAC,EAAK,gBAAiB,GAAM,KAAM,EAAM,CAAC,EAAG,GAAIH,EAAc,CAAE,YAAAA,CAAY,EAAI,CAAC,EAAI,GAAIC,EAAiB,CAAE,eAAAA,CAAe,EAAI,CAAC,CAAG,EAClR,KAAK,IAAM,KAEX,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,qBAAqB,CAC5B,CAAC,EAAE,MAAOjC,GAAe,CACvB,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CAAC,CACH,OAASA,EAAO,CACd,KAAK,aAAeA,aAAiB,MAAQA,EAAM,QAAU,2BAC7D,KAAK,cAAgB,QACrB,KAAK,gBAAkB,GACvB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,QAAS,KAAK,aAAc,KAAM,sBAAuB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC5J,CACF,CAEA,MAAc,sBAAuB,CACnC,GAAI,CACF,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAErB,KAAK,gBAAkB,WACvB,KAAK,iBAAmB,GACxB,IAAMN,EAAMC,EAAU,KAAK,MAAM,EAC3B,CAAE,SAAA6C,CAAS,EAAI,MAAMC,EAAwB,CACjD,IAAA/C,EACA,aAAc,KAAK,aACnB,gBAAkB,KAAK,QAAgB,gBACvC,UAAW,OAAO,KAAK,WAAa,CAAC,EACrC,aAAe,KAAK,QAAgB,cACpC,gBAAkB,KAAK,QAAgB,gBACvC,gBAAkB,KAAK,QAAgB,eACzC,CAAC,EACD,KAAK,eAAiB8C,CACxB,OAAS,EAAQ,CACf,KAAK,eAAiB,CAAC,EACvB,KAAK,cAAiB,IAAM,EAAE,SAAW,OAAO,CAAC,IAAO,yBAC1D,QAAE,CACA,KAAK,gBAAkB,EACzB,CACF,CAmJQ,8BAA+B,CACrC,GAAI,MAAK,2BACT,MAAK,2BAA8BE,GAAwB,KAAK,iBAAiBA,CAAK,EACtF,GAAI,CAAE,OAAO,iBAAiB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,EAC7F,CAEQ,8BAA+B,CACrC,GAAI,KAAK,2BAA4B,CACnC,GAAI,CAAE,OAAO,oBAAoB,UAAW,KAAK,0BAAiC,CAAG,MAAQ,CAAC,CAC9F,KAAK,2BAA6B,IACpC,CACF,CAEQ,iBAAiBA,EAAqB,CAC5C,IAAM3D,EAAY2D,GAAO,KACnBC,EAA8B5D,GAAM,UAAYA,GAAM,SAAWA,GAAM,GAC7E,GAAI,GAAC4D,GAAW,OAAOA,GAAY,WAE/BA,IAAY,2BAA4B,CAE1C,GADA,KAAK,6BAA6B,EAC9B,KAAK,oBAAqB,OAE9B,KAAK,gBAAkB,GACvB,IAAMC,EAAW7D,GAAM,MAAM,IAAQA,GAAM,IAAQA,GAAM,aAAa,IAAO,KAC7E,KAAK,mBAAmB6D,GAAW,MAAS,CAC9C,CACF,CAEQ,aAAc,CACpB,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,mBAAoB,KAAM,QAAS,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAC1I,KAAK,gBAAkB,GACvB,WAAW,IAAM,KAAK,mBAAmB,EAAG,CAAC,CAC/C,CAEA,MAAc,oBAAqB,CACjC,GAAI,CACF,IAAMlD,EAAMC,EAAU,KAAK,MAAM,EAC3BC,EAAY,OAAO,KAAK,SAAS,EACjCiD,EAAO,MAAOnD,EAAY,eAAeE,EAAW,OAAW,CAAE,QAAS,sBAAuB,cAAe,GAAM,eAAiB,MAAc,wBAA0B,UAAW,CAAC,EAC3LkD,EACJD,GAAM,UAAU,QAAQ,KACxBA,GAAM,QAAQ,KACdA,GAAM,UAAU,cAAc,KAC9BA,GAAM,eAAe,UAAU,OAAO,WACtCA,GAAM,UAAU,OAAO,WACvB,KACIE,EAAkBF,GAAM,UAAU,yBAA2BA,GAAM,UAAU,iBAAmBA,GAAM,iBAAmB,KACzHG,EAAeH,GAAM,UAAU,cAAc,cAAgBA,GAAM,UAAU,QAAQ,cAAgB,KAE3G,GADA,KAAK,sBAAwBE,EACzBD,EAAK,CACN,KAAa,UAAYA,EAC1B,KAAK,mBAAqB,KAC1B,GAAI,CACF,OAAO,KAAKA,EAAK,eAAgB,qBAAqB,EACtD,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,IAAAA,CAAI,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CACpG,MAAQ,CAAC,CACT,KAAK,mBAAmB,CAC1B,MACG,KAAa,UAAY,KAC1B,KAAK,mBAAqBE,GAAgB,oCAC1C,KAAK,gBAAkB,EAE3B,OAAS,EAAG,CACT,KAAa,UAAY,KAC1B,KAAK,mBAAsB,GAAW,SAAW,oCACjD,KAAK,gBAAkB,EACzB,CACF,CAEQ,mBAAmBJ,EAAkB,CAC3C,GAAI,KAAK,gBAAiB,CAAE,GAAI,CAAE,cAAc,KAAK,eAAe,CAAG,MAAQ,CAAC,CAAG,KAAK,gBAAkB,IAAM,CAChH,GAAI,KAAK,uBAAwB,CAAE,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CAAG,KAAK,uBAAyB,IAAM,CAE7H,IAAMG,EAAkB,KAAK,sBAC7B,GAAI,CAACA,EAAiB,OAEtB,IAAMrD,EAAMC,EAAU,KAAK,MAAM,EAC3BsD,EAAiB,IAAM,CAE3B,GADA,KAAK,6BAA6B,EAC9B,KAAK,uBAA0B,GAAI,CAAE,KAAK,uBAAuB,KAAK,CAAG,MAAQ,CAAC,CACtF,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,EAC7B,EACA,GAAI,CAAE,OAAO,iBAAiB,mCAAoC,IAAMA,EAAe,GAAW,CAAE,KAAM,EAAK,CAAQ,CAAG,MAAQ,CAAC,CACnI,KAAK,oBAAsB,GAC3B,KAAK,uBAA0BvD,EAAY,0BAA0BqD,EAAiB,IAAMH,CAAO,EACnG,KAAK,gBAAkB,CACzB,CAEQ,kBAAmB,CACzBM,GAAqB,KAAiC,CAAE,cAAe,KAAM,CAAC,CAChF,CAEA,MAAc,KAAM,CAClB,GAAKxE,GAIL,IAFA,KAAK,iBAAiB,EAElB,CAAC,KAAK,cAAc,EAAG,CACzB,KAAK,aAAe,8BACpB,KAAK,cAAgB,UACrB,MACF,CAEA,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,yBAA0B,CAAE,OAAQ,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,KAAK,UAAW,SAAU,KAAK,gBAAkB,KAAM,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAE9L,KAAK,WAAa,GAClB,GAAI,CAEF,GAAI,CADU,MAAM,KAAK,aAAa,EAC1B,OAEZ,KAAK,gBAAkB,GACvB,MAAM,KAAK,qBAAqB,EAChC,MACF,OAAS,EAAG,CACVqB,EAAkB,EAAG,CACnB,QAAUC,GAAU,CAClB,KAAK,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQA,EAAO,QAAS,EAAK,CAAC,CAAC,EAC/EC,EAAsBD,CAAK,IAC7B,KAAK,aAAeE,EAAgBF,CAAK,EACzC,KAAK,cAAgBG,EAAiBH,CAAK,EAC3C,KAAK,YAAcI,EAAeJ,CAAK,EAE3C,CACF,CAAC,EAED,GAAI,CACE,CAAC,KAAK,OAAO,cAAgB,KAAK,MACpC,MAAM,KAAK,IAAI,aAAa,EAC5B,KAAK,gBAAkB,GACvB,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,cAAe,OAAkB,gBAAiB,MAAU,EAEhG,MAAQ,CAAC,CACX,QAAE,CACA,KAAK,WAAa,EACpB,EACF,CAEA,QAAS,CACP,GAAI,CAAC,KAAK,OAAQ,OAAOmD,2DACzB,IAAMC,EAAc,KAAK,QAAQ,aAAe,sBAE1CC,GADc,KAAK,QAAQ,aAAe,mBAE7C,QAAQ,WAAY,KAAK,UAAY,GAAG,OAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,GAAK,OAAO,EACrF,QAAQ,WAAY,KAAK,gBAAkB,KAAK,EAC7CC,EAAgB,KAAK,gBAAkB,MAEvCC,EADkB,KAAK,QAAQ,aAAa,UAAY,GAG9D,OAAOJ;AAAA;AAAA,UAEDI,EAAkBJ;AAAA;AAAA,qBAEP,CAAC,CAAC,KAAK,QAAQ,KAAK;AAAA,qBACpB,KAAK,QAAQ,KAAK;AAAA,sBACjB,OAAO,KAAK,WAAa,CAAC,CAAC;AAAA,4BACrB,KAAK,gBAAkB,KAAK;AAAA;AAAA,UAE5C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAMmC,OAAO,KAAK,QAAQ,SAAW,EAAG,CAAC,YAAY,OAAO,KAAK,WAAa,EAAE,CAAC,iBAAiBC,CAAW,YAAatD,GAAW,KAAK,cAAcA,CAAC,CAAC;AAAA;AAAA,cAEzL,IAAI;AAAA;AAAA,sCAEoB,KAAK,WAAW,aAAa,EAAE;AAAA,wBAC7C,KAAK,YAAe,KAAK,QAAQ,uBAAyB,IAAU,KAAK,WAAa,KAAK,QAAQ,sBAAwB,EAAK;AAAA,qBACnI,IAAM,KAAK,IAAI,CAAC;AAAA,cACvB,KAAK,WAAa,KAAK,QAAQ,oBAAsB,OAAU,KAAK,WAAa,mBAAgBuD,CAAS;AAAA;AAAA;AAAA,kCAGtF,OAAO,KAAK,QAAQ,QAAU,EAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,QAAQ,OAAS,WAAW,OAAO,KAAK,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAK,EAAE;AAAA;AAAA,UAErJ,KAAK,aAAeF;AAAA,sCACQ,KAAK,aAAa;AAAA,cAC1C,KAAK,YAAY;AAAA,cACjB,KAAK,YAAcA,wKAA0K,KAAK,WAAW,YAAc,EAAE;AAAA;AAAA,UAE/N,EAAE;AAAA,WACH,IAAM,CACP,IAAMK,EAAc,KAAa,KAAK,oBAAoB,GAAK,CAAC,EAC1DC,EAAWC,EAA2BF,CAAU,EAChDG,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOC,EAA0B,CAC/B,QAAS,CAAC,EAAE,KAAK,iBAAmB,KAAK,KACzC,QAAAH,EACA,aAAc,GAChB,KAAM,KAAK,gBACX,SAAU,KAAK,kBAAoB,WAAc,KAAK,eAAyB,CAAC,EAChF,gBAAiB,KAAK,kBAAoB,WAAa,KAAK,gBAAkB,GAC9E,cAAe,KAAK,kBAAoB,WAAa,KAAK,cAAgB,KAC1E,gBAAkBI,GAAc,KAAK,sBAAsBA,CAAC,EAC5D,OAAQ,IAAM,CAAE,KAAK,gBAAkB,SAAW,EAChD,gBAAiB,IAAM,KAAK,gBAAgB,IAAI,EAChD,SAAWzB,GAAqB,KAAK,kBAAkBA,CAAQ,EAC/D,QAAS,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,GAAI,CAAE,OAAO,cAAc,IAAI,YAAY,6BAA8B,CAAE,OAAQ,CAAE,OAAQ,gBAAiB,CAAE,CAAC,CAAC,CAAG,MAAQ,CAAC,CAAE,EAC5M,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,EAAO,EAC9E,aAAgB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAS,IAAM,KAAK,YAAY,EAAI,OAC/H,gBAAiB,KAAK,QAAQ,QAAQ,iBAAmB,uBACzD,eAAiB,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAC5F,mBAAoB,IAAM,CACT,IAAM0B,EAAM,OAAO,KAAK,WAAa,CAAC,EAAG,OAAIA,EAAM,GAAKA,EAAM,GAAS,KAAK,QAAQ,QAAQ,UAAY,IAAU,KAAK,QAAQ,iBAAmB,GAAmD,yDAA9B,EAAMA,GAAK,QAAQ,CAAC,CAAwE,SAAmB,IACvS,GAAG,EACH,eAAgB,KAAK,eACrB,UAAW,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,eAAiB,GAAO,KAAK,IAAI,CAAG,EAC1F,MAAOH,CACT,CAAC,CACH,GAAG,CAAC;AAAA;AAAA,WAED,IAAM,CACP,IAAMA,EAAY,KAAK,QAAQ,MAAS,OAAO,KAAK,OAAO,OAAU,SAAW,KAAK,OAAO,MAAS,KAAK,OAAO,MAAM,MAAQ,QAAY,OAC3I,OAAOR;AAAA,cACHY,EAAyB,CACzB,QAAS,KAAK,iBACd,UAAW,KAAK,gBAChB,MAAO,KAAK,cACZ,SAAU,KAAK,eACf,SAAWF,GAAc,KAAK,sBAAsBA,CAAC,EACrD,QAAS,IAAM,CAAE,KAAK,iBAAmB,EAAO,EAChD,MAAOF,CACT,CAAC,CAAC;AAAA;AAAA,cAEAK,EAAkB,CAClB,QAAS,KAAK,gBACd,IAAM,KAAa,WAAa,OAChC,aAAc,KAAK,oBAAsB,OACzC,MAAO,KAAK,QAAQ,QAAQ,MAC5B,OAAQ,KAAK,QAAQ,QAAQ,OAC7B,QAAS,IAAM,CAAE,KAAK,gBAAkB,EAAO,EAC/C,OAAQ,IAAM,CAAE,KAAK,gBAAkB,GAAO,KAAK,gBAAkB,EAAM,EAC3E,MAAO,uBACP,MAAOL,CACT,CAAC,CAAC;AAAA,WAEN,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,KAMV,CACF,EAnsBa3E,EACJ,OAAS,CAACiF,EAAYC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoB5B,EAE2BC,EAAA,CAA3BC,GAAS,CAAE,KAAM,MAAO,CAAC,GAvBfpF,EAuBiB,sBACXmF,EAAA,CAAhBE,EAAM,GAxBIrF,EAwBM,yBACAmF,EAAA,CAAhBE,EAAM,GAzBIrF,EAyBM,6BACAmF,EAAA,CAAhBE,EAAM,GA1BIrF,EA0BM,8BACAmF,EAAA,CAAhBE,EAAM,GA3BIrF,EA2BM,0BACAmF,EAAA,CAAhBE,EAAM,GA5BIrF,EA4BM,yBACAmF,EAAA,CAAhBE,EAAM,GA7BIrF,EA6BM,4BACAmF,EAAA,CAAhBE,EAAM,GA9BIrF,EA8BM,6BACAmF,EAAA,CAAhBE,EAAM,GA/BIrF,EA+BM,2BACAmF,EAAA,CAAhBE,EAAM,GAhCIrF,EAgCM,+BACAmF,EAAA,CAAhBE,EAAM,GAjCIrF,EAiCM,6BACAmF,EAAA,CAAhBE,EAAM,GAlCIrF,EAkCM,+BACAmF,EAAA,CAAhBE,EAAM,GAnCIrF,EAmCM,+BACAmF,EAAA,CAAhBE,EAAM,GApCIrF,EAoCM,+BACAmF,EAAA,CAAhBE,EAAM,GArCIrF,EAqCM,yBACAmF,EAAA,CAAhBE,EAAM,GAtCIrF,EAsCM,qCACAmF,EAAA,CAAhBE,EAAM,GAvCIrF,EAuCM,kCACAmF,EAAA,CAAhBE,EAAM,GAxCIrF,EAwCM,8BACAmF,EAAA,CAAhBE,EAAM,GAzCIrF,EAyCM,4BAOAmF,EAAA,CAAhBE,EAAM,GAhDIrF,EAgDM,gCACAmF,EAAA,CAAhBE,EAAM,GAjDIrF,EAiDM,+BACAmF,EAAA,CAAhBE,EAAM,GAlDIrF,EAkDM,6BACAmF,EAAA,CAAhBE,EAAM,GAnDIrF,EAmDM,8BAnDNA,EAANmF,EAAA,CADNG,GAAc,oBAAoB,GACtBtF","names":["css","baseStyles","getThemeModeFromConfig","theme","applyThemeVars","host","themeConfig","mode","docTheme","set","k","v","Icpay","isBrowser","debugLog","debug","message","data","createSdk","config","sdkConfig","notifyIntentUntilComplete","paymentIntentId","intervalMs","orderId","client","clientAny","forward","type","e","quoteUsd","usdAmount","tokenShortcode","ledgerCanisterId","sendUsd","metadata","mergedMeta","fallbackDesc","description","payload","startOnrampUsd","onrampPayload","error","LitElement","html","css","customElement","property","state","IcpayError","ERROR_CODES","defaultErrorHandler","error","handleWidgetError","errorHandler","ERROR_MESSAGES","getErrorMessage","details","apiMsg","directMsg","serverMsg","fields","s","m","shouldShowErrorToUser","getErrorAction","getErrorSeverity","error","debugLog","debug","message","data","DEFAULT_STEPS","ICPayProgressBar","LitElement","step","methodName","methodType","map","s","transactionId","status","intentMeta","onrampCompleteMeta","paymentIntent","errorObj","rawMessage","errorMessage","getErrorMessage","errorCode","requestedAmount","paidAmount","requested","paid","walletType","_e","hasBalance","balance","ledgerId","symbol","amount","currency","ledgerSymbol","errObj","i","walletIdx","awaitIdx","transferIdx","verifyIdx","hasPaymentStarted","idx","walletWasConnected","applyThemeVars","themeMode","docTheme","changed","stepIndex","oldStatus","html","key","msg","m","currentMsg","incoming","next","confettiPieces","_","colors","piece","displayAmount","fiatLabel","error","index","started","css","__decorateClass","property","state","customElement","html","getThemeMode","themeOverride","icpayTheme","theme","renderOnrampModal","opts","width","height","hasUrl","themeMode","LitElement","html","css","customElement","property","state","html","EVM_WALLET_IDS","SOL_WALLET_IDS","isEvmWalletId","walletId","getWalletId","w","getWalletLabel","getWalletIcon","buildWalletEntries","raw","ensureEvmChain","targetChainId","opts","provider","desiredDec","currentHex","hex","chainName","rpcUrls","nativeCurrency","getWalletBalanceEntries","params","sdk","lastWalletId","connectedWallet","amountUsd","fiatCurrency","chainShortcodes","tokenShortcodes","response","lowerId","addrOrPrincipal","b","formatTokenAmountThirdwebStyle","value","n","factor","html","toUsd","b","amt","price","usd","byUsdDesc","a","renderPayWithStyles","html","renderPayWithContent","opts","formatTokenAmount","val","formatTokenAmountThirdwebStyle","sufficient","sym","iconClass","insufficient","getThemeMode","themeOverride","icpayTheme","theme","sanitizeDataUrl","url","getWalletFriendlyName","id","fallback","lower","renderWalletSelectorModal","opts","wallets","onSelect","onClose","isConnecting","formatTokenAmount","val","formatTokenAmountThirdwebStyle","toUsd","b","amt","price","usd","byUsdDesc","a","normalizedWallets","w","themeMode","html","e","renderPayWithStyles","renderPayWithContent","symbol","items","lastGroup","displayName","isEvm","isEvmWalletId","type","chainLabel","html","getThemeMode","themeOverride","icpayTheme","theme","renderWalletBalanceModal","opts","themeMode","html","renderPayWithStyles","renderPayWithContent","shouldSkipX402ForBaseOnIos","walletId","ua","applyOisyNewTabConfig","cfg","next","oisy","oisyConfig","transport","normalizeConnectedWallet","pnp","connectResult","fromResult","fromAccount","toStringSafe","v","principal","detectOisySessionViaAdapter","getEnabled","oisyCfg","w","AdapterCtor","adapterInstance","dispatchPaymentReset","stopOnrampPolling","ctx","c","controller","timer","disconnectWalletForReset","config","pnp","resetPaymentFlow","options","keepWallet","req","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayPremiumContent","LitElement","amount","curr","shortcode","sel0","b","isEvmWalletId","sel","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","chainName","isSol","dest","chosen","isIc","raw","saved","_cfg1","resolveDerivationOrigin","pnp","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","applyOisyNewTabConfig","hostOptions","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","changed","resetPaymentFlow","_cfg2","principal","detectOisySessionViaAdapter","availableWallets","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","symbol","w","balances","getWalletBalanceEntries","html","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","s","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayTipJar","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","chainName","isSol","isIc","dest","chosen","raw","saved","_cfg1","applyOisyNewTabConfig","resolveDerivationOrigin","pnp","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","hostOptions","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","changed","v","s","resetPaymentFlow","_cfg2","principal","detectOisySessionViaAdapter","availableWallets","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","w","balances","getWalletBalanceEntries","html","a","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayArticlePaywall","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","isSol","dest","chosen","raw","saved","_cfg1","resolveDerivationOrigin","pnp","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","applyOisyNewTabConfig","hostOptions","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","changed","s","resetPaymentFlow","_cfg2","principal","detectOisySessionViaAdapter","availableWallets","w","balances","getWalletBalanceEntries","html","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayCoffeeShop","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","chainName","isSol","isIc","dest","chosen","changed","i","s","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","applyOisyNewTabConfig","resolveDerivationOrigin","hostOptions","pnp","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","resetPaymentFlow","principal","detectOisySessionViaAdapter","availableWallets","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","w","balances","getWalletBalanceEntries","html","it","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayDonationThermometer","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","isSol","dest","chosen","raw","saved","_cfg1","applyOisyNewTabConfig","resolveDerivationOrigin","pnp","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","hostOptions","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","changed","v","s","goal","denom","resetPaymentFlow","_cfg2","principal","detectOisySessionViaAdapter","availableWallets","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","w","balances","getWalletBalanceEntries","html","a","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","html","getThemeMode","themeOverride","icpayTheme","theme","renderOnrampProviderPicker","opts","providers","themeMode","p","isBrowser","fetchPaymentIntent","apiUrl","publishableKey","intentId","debug","url","res","data","e","isPaymentIntentCompleted","status","s","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayPayButton","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","amountUsd","symbolNow","skipX402BaseIos","shouldSkipX402ForBaseOnIos","tryX402","evmDest","metadata","x402Err","evmDest2","err","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","action","chainName","isSol","dest","chosen","isIc","cfg","evmProv","createSdk","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","applyOisyNewTabConfig","resolveDerivationOrigin","hostOptions","pnp","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","applyThemeVars","intentId","key","apiUrl","fetchPaymentIntent","isPaymentIntentCompleted","pi","changed","newId","symbol","availableWallets","w","isOisy","raw","_dest2","allowed2","err2","initErr","balances","getWalletBalanceEntries","walletsRaw","wallets","buildWalletEntries","onrampEnabled","minOnramp","showTooltip","diff","tooltip","themeMode","renderWalletSelectorModal","s","list","p","providers","resp","url","errorMessage","paymentIntentId","orderId","handleComplete","listener","keepWalletConnected","resetPaymentFlow","cw","pnpAcct","html","selectedSymbol","amountPart","label","showProgressBar","suspendProgress","renderWalletBalanceModal","renderOnrampModal","renderOnrampProviderPicker","slug","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","WalletSelect","debugLog","debug","message","data","ICPayAmountInput","LitElement","amount","curr","shortcode","sel","b","isEvmWalletId","targetChain","ensureEvmChain","sdk","createSdk","amountUsd","shouldSkipX402ForBaseOnIos","e","handleWidgetError","error","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","err","action","chainName","isSol","isIc","dest","chosen","metadata","changed","step","value","rounded","symbol","min","max","wantsOisyTab","_rawCfg","_dest","allowed","_cfg","applyOisyNewTabConfig","resolveDerivationOrigin","hostOptions","pnp","account","normalized","normalizeConnectedWallet","evmProvider","solanaProvider","canisterId","idl","walletId","id","result","w","balances","getWalletBalanceEntries","event","eventId","orderId","resp","url","paymentIntentId","errorMessage","handleComplete","resetPaymentFlow","html","placeholder","payLabel","selectedLabel","showProgressBar","walletsRaw","wallets","buildWalletEntries","themeMode","renderWalletSelectorModal","s","amt","renderWalletBalanceModal","renderOnrampModal","baseStyles","css","__decorateClass","property","state","customElement"]}
|