@nowramp/form 0.1.78 → 0.1.79
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1389 -1221
- package/dist/index.js.map +1 -1
- package/dist/nowramp-form.iife.js +13 -13
- package/dist/nowramp-form.iife.js.map +1 -1
- package/package.json +6 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/hooks/useRamp.ts","../src/data/countries.ts","../src/context/RampContext.tsx","../src/data/cryptoData.ts","../src/components/ui/icons.tsx","../src/components/PaymentMethodSelector.tsx","../src/components/CheckoutStep.tsx","../src/components/ProcessingStep.tsx","../src/components/CompleteStep.tsx","../src/components/ErrorStep.tsx","../src/components/ConfirmStep.tsx","../src/components/ui/Modal.tsx","../src/components/ui/AnimatedNumber.tsx","../src/components/ui/Skeleton.tsx","../src/components/ui/CloseButton.tsx","../src/components/ui/SearchInput.tsx","../src/components/modals/FiatCurrencyModal.tsx","../src/components/modals/CryptoCurrencyModal.tsx","../src/components/modals/PaymentMethodModal.tsx","../src/components/ui/ToggleSwitch.tsx","../src/components/modals/SettingsScreen.tsx","../src/components/modals/CountryPickerModal.tsx","../src/components/RampForm.tsx","../src/components/CheckoutForm.tsx","../src/components/ui/SkinSwatch.tsx","../src/components/modals/ChooseRampModal.tsx"],"sourcesContent":["/**\n * React hooks for NowRamp Onramp API\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n RampApi,\n type RampApiConfig,\n type OnrampSupported,\n type QuotesResponse,\n type GetQuotesParams,\n type GetSupportedParams,\n type CheckoutIntent,\n type CreateCheckoutIntentParams,\n type Transaction,\n type FlowType,\n} from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseRampConfigResult {\n config: OnrampSupported | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseQuotesResult {\n quotes: QuotesResponse | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCheckoutIntentResult {\n order: CheckoutIntent | null;\n loading: boolean;\n error: Error | null;\n createOrder: (params: CreateCheckoutIntentParams) => Promise<CheckoutIntent>;\n reset: () => void;\n}\n\nexport interface UseTransactionResult {\n status: Transaction | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\n/**\n * Hook to fetch onramp supported configuration\n * Returns gateways, currencies, and payment methods\n */\nexport function useRampConfig(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n orderType?: FlowType,\n country?: string\n): UseRampConfigResult {\n const [data, setData] = useState<OnrampSupported | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n // Memoize API instance\n if (!apiRef.current || apiRef.current !== config) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n }\n\n const fetchConfig = useCallback(async () => {\n if (!config.projectId) {\n setError(new Error('projectId is required'));\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const supportedParams: GetSupportedParams = {};\n if (orderType) supportedParams.orderType = orderType;\n if (country) supportedParams.country = country;\n const result = await apiRef.current!.getSupported(supportedParams);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch config'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, orderType, country]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n return { config: data, loading, error, refetch: fetchConfig };\n}\n\n/**\n * Hook to fetch quotes from all gateways\n * Auto-refreshes when params change\n */\nexport function useQuotes(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n params: GetQuotesParams | null\n): UseQuotesResult {\n const [data, setData] = useState<QuotesResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const fetchIdRef = useRef(0);\n\n useEffect(() => {\n // Bump fetch ID on every param change to invalidate in-flight requests\n const id = ++fetchIdRef.current;\n\n if (!params || !config.projectId) {\n setData(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n apiRef.current!.getQuotes(params).then(\n (result) => {\n if (fetchIdRef.current === id) {\n setData(result);\n setLoading(false);\n }\n },\n (err) => {\n if (fetchIdRef.current === id) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n setData(null);\n setLoading(false);\n }\n }\n );\n }, [config.projectId, params?.fiatCurrency, params?.fiatAmount, params?.cryptoAmount, params?.cryptoCurrency, params?.network, params?.paymentMethodId, params?.country, params?.orderType]);\n\n const refetch = useCallback(async () => {\n if (!params || !config.projectId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await apiRef.current!.getQuotes(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, params]);\n\n return { quotes: data, loading, error, refetch };\n}\n\n/**\n * Hook to create a checkout intent\n */\nexport function useCheckoutIntent(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>\n): UseCheckoutIntentResult {\n const [order, setOrder] = useState<CheckoutIntent | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const createOrder = useCallback(async (params: CreateCheckoutIntentParams): Promise<CheckoutIntent> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.createCheckoutIntent(params);\n setOrder(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create checkout intent');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setOrder(null);\n setError(null);\n }, []);\n\n return { order, loading, error, createOrder, reset };\n}\n\n/**\n * Hook to poll transaction status\n */\nexport function useTransaction(\n config: Pick<RampApiConfig, 'apiUrl'>,\n transactionId: string | null,\n options?: { pollInterval?: number; initialDelay?: number }\n): UseTransactionResult {\n const [status, setStatus] = useState<Transaction | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n if (!apiRef.current) {\n apiRef.current = new RampApi({ apiKey: '', projectId: '', ...config });\n }\n\n const fetchStatus = useCallback(async () => {\n if (!transactionId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.getTransaction(transactionId);\n setStatus(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch status'));\n } finally {\n setLoading(false);\n }\n }, [transactionId]);\n\n // Initial fetch (with optional delay to let checkout iframe load first)\n useEffect(() => {\n if (!transactionId) return;\n\n const delay = options?.initialDelay ?? 0;\n if (delay > 0) {\n const timer = setTimeout(fetchStatus, delay);\n return () => clearTimeout(timer);\n }\n\n fetchStatus();\n }, [fetchStatus, transactionId, options?.initialDelay]);\n\n // Polling — only start after the initial (possibly delayed) fetch has\n // returned a status. Without the `!status` guard the setInterval would\n // bypass initialDelay entirely, firing its first callback at pollInterval\n // (e.g. 5 s) even though we asked for a 15 s delay.\n useEffect(() => {\n if (!transactionId || !options?.pollInterval) return;\n\n // Wait for the initial fetch to populate status before polling\n if (!status) return;\n\n // Stop polling if order is in terminal state\n const terminalStatuses = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n if (terminalStatuses.includes(status.status)) {\n return;\n }\n\n const interval = setInterval(fetchStatus, options.pollInterval);\n return () => clearInterval(interval);\n }, [transactionId, options?.pollInterval, status?.status, fetchStatus]);\n\n return { status, loading, error, refetch: fetchStatus };\n}\n","/**\n * Country list with default fiat currency mapping\n * Used for geo-based fiat auto-selection\n */\n\nexport interface Country {\n /** ISO 3166-1 alpha-2 country code (lowercase) */\n code: string;\n /** Display name */\n name: string;\n /** Default fiat currency code for this country */\n defaultFiat: string;\n}\n\nexport const COUNTRIES: Country[] = [\n { code: 'ad', name: 'Andorra', defaultFiat: 'EUR' },\n { code: 'ae', name: 'United Arab Emirates', defaultFiat: 'AED' },\n { code: 'af', name: 'Afghanistan', defaultFiat: 'USD' },\n { code: 'ag', name: 'Antigua and Barbuda', defaultFiat: 'USD' },\n { code: 'al', name: 'Albania', defaultFiat: 'ALL' },\n { code: 'am', name: 'Armenia', defaultFiat: 'USD' },\n { code: 'ao', name: 'Angola', defaultFiat: 'USD' },\n { code: 'ar', name: 'Argentina', defaultFiat: 'ARS' },\n { code: 'at', name: 'Austria', defaultFiat: 'EUR' },\n { code: 'au', name: 'Australia', defaultFiat: 'AUD' },\n { code: 'az', name: 'Azerbaijan', defaultFiat: 'USD' },\n { code: 'ba', name: 'Bosnia and Herzegovina', defaultFiat: 'EUR' },\n { code: 'bb', name: 'Barbados', defaultFiat: 'USD' },\n { code: 'bd', name: 'Bangladesh', defaultFiat: 'USD' },\n { code: 'be', name: 'Belgium', defaultFiat: 'EUR' },\n { code: 'bf', name: 'Burkina Faso', defaultFiat: 'USD' },\n { code: 'bg', name: 'Bulgaria', defaultFiat: 'EUR' },\n { code: 'bh', name: 'Bahrain', defaultFiat: 'USD' },\n { code: 'bi', name: 'Burundi', defaultFiat: 'USD' },\n { code: 'bj', name: 'Benin', defaultFiat: 'USD' },\n { code: 'bn', name: 'Brunei', defaultFiat: 'USD' },\n { code: 'bo', name: 'Bolivia', defaultFiat: 'USD' },\n { code: 'br', name: 'Brazil', defaultFiat: 'BRL' },\n { code: 'bs', name: 'Bahamas', defaultFiat: 'USD' },\n { code: 'bt', name: 'Bhutan', defaultFiat: 'USD' },\n { code: 'bw', name: 'Botswana', defaultFiat: 'USD' },\n { code: 'by', name: 'Belarus', defaultFiat: 'USD' },\n { code: 'bz', name: 'Belize', defaultFiat: 'USD' },\n { code: 'ca', name: 'Canada', defaultFiat: 'CAD' },\n { code: 'cd', name: 'DR Congo', defaultFiat: 'USD' },\n { code: 'cf', name: 'Central African Republic', defaultFiat: 'USD' },\n { code: 'ch', name: 'Switzerland', defaultFiat: 'CHF' },\n { code: 'ci', name: \"Cote d'Ivoire\", defaultFiat: 'USD' },\n { code: 'cl', name: 'Chile', defaultFiat: 'CLP' },\n { code: 'cm', name: 'Cameroon', defaultFiat: 'USD' },\n { code: 'cn', name: 'China', defaultFiat: 'USD' },\n { code: 'co', name: 'Colombia', defaultFiat: 'USD' },\n { code: 'cr', name: 'Costa Rica', defaultFiat: 'USD' },\n { code: 'cu', name: 'Cuba', defaultFiat: 'USD' },\n { code: 'cv', name: 'Cape Verde', defaultFiat: 'USD' },\n { code: 'cy', name: 'Cyprus', defaultFiat: 'EUR' },\n { code: 'cz', name: 'Czech Republic', defaultFiat: 'CZK' },\n { code: 'de', name: 'Germany', defaultFiat: 'EUR' },\n { code: 'dj', name: 'Djibouti', defaultFiat: 'USD' },\n { code: 'dk', name: 'Denmark', defaultFiat: 'DKK' },\n { code: 'dm', name: 'Dominica', defaultFiat: 'USD' },\n { code: 'do', name: 'Dominican Republic', defaultFiat: 'USD' },\n { code: 'dz', name: 'Algeria', defaultFiat: 'USD' },\n { code: 'ec', name: 'Ecuador', defaultFiat: 'USD' },\n { code: 'ee', name: 'Estonia', defaultFiat: 'EUR' },\n { code: 'eg', name: 'Egypt', defaultFiat: 'USD' },\n { code: 'er', name: 'Eritrea', defaultFiat: 'USD' },\n { code: 'es', name: 'Spain', defaultFiat: 'EUR' },\n { code: 'et', name: 'Ethiopia', defaultFiat: 'USD' },\n { code: 'fi', name: 'Finland', defaultFiat: 'EUR' },\n { code: 'fj', name: 'Fiji', defaultFiat: 'USD' },\n { code: 'fr', name: 'France', defaultFiat: 'EUR' },\n { code: 'ga', name: 'Gabon', defaultFiat: 'USD' },\n { code: 'gb', name: 'United Kingdom', defaultFiat: 'GBP' },\n { code: 'gd', name: 'Grenada', defaultFiat: 'USD' },\n { code: 'ge', name: 'Georgia', defaultFiat: 'USD' },\n { code: 'gh', name: 'Ghana', defaultFiat: 'USD' },\n { code: 'gm', name: 'Gambia', defaultFiat: 'USD' },\n { code: 'gn', name: 'Guinea', defaultFiat: 'USD' },\n { code: 'gq', name: 'Equatorial Guinea', defaultFiat: 'USD' },\n { code: 'gr', name: 'Greece', defaultFiat: 'EUR' },\n { code: 'gt', name: 'Guatemala', defaultFiat: 'USD' },\n { code: 'gw', name: 'Guinea-Bissau', defaultFiat: 'USD' },\n { code: 'gy', name: 'Guyana', defaultFiat: 'USD' },\n { code: 'hk', name: 'Hong Kong', defaultFiat: 'HKD' },\n { code: 'hn', name: 'Honduras', defaultFiat: 'USD' },\n { code: 'hr', name: 'Croatia', defaultFiat: 'EUR' },\n { code: 'ht', name: 'Haiti', defaultFiat: 'USD' },\n { code: 'hu', name: 'Hungary', defaultFiat: 'EUR' },\n { code: 'id', name: 'Indonesia', defaultFiat: 'IDR' },\n { code: 'ie', name: 'Ireland', defaultFiat: 'EUR' },\n { code: 'il', name: 'Israel', defaultFiat: 'USD' },\n { code: 'in', name: 'India', defaultFiat: 'INR' },\n { code: 'iq', name: 'Iraq', defaultFiat: 'USD' },\n { code: 'ir', name: 'Iran', defaultFiat: 'USD' },\n { code: 'is', name: 'Iceland', defaultFiat: 'EUR' },\n { code: 'it', name: 'Italy', defaultFiat: 'EUR' },\n { code: 'jm', name: 'Jamaica', defaultFiat: 'USD' },\n { code: 'jo', name: 'Jordan', defaultFiat: 'USD' },\n { code: 'jp', name: 'Japan', defaultFiat: 'JPY' },\n { code: 'ke', name: 'Kenya', defaultFiat: 'USD' },\n { code: 'kg', name: 'Kyrgyzstan', defaultFiat: 'USD' },\n { code: 'kh', name: 'Cambodia', defaultFiat: 'USD' },\n { code: 'ki', name: 'Kiribati', defaultFiat: 'USD' },\n { code: 'km', name: 'Comoros', defaultFiat: 'USD' },\n { code: 'kn', name: 'Saint Kitts and Nevis', defaultFiat: 'USD' },\n { code: 'kr', name: 'South Korea', defaultFiat: 'KRW' },\n { code: 'kw', name: 'Kuwait', defaultFiat: 'USD' },\n { code: 'kz', name: 'Kazakhstan', defaultFiat: 'USD' },\n { code: 'la', name: 'Laos', defaultFiat: 'USD' },\n { code: 'lb', name: 'Lebanon', defaultFiat: 'USD' },\n { code: 'lc', name: 'Saint Lucia', defaultFiat: 'USD' },\n { code: 'li', name: 'Liechtenstein', defaultFiat: 'CHF' },\n { code: 'lk', name: 'Sri Lanka', defaultFiat: 'USD' },\n { code: 'lr', name: 'Liberia', defaultFiat: 'USD' },\n { code: 'ls', name: 'Lesotho', defaultFiat: 'ZAR' },\n { code: 'lt', name: 'Lithuania', defaultFiat: 'EUR' },\n { code: 'lu', name: 'Luxembourg', defaultFiat: 'EUR' },\n { code: 'lv', name: 'Latvia', defaultFiat: 'EUR' },\n { code: 'ly', name: 'Libya', defaultFiat: 'USD' },\n { code: 'ma', name: 'Morocco', defaultFiat: 'USD' },\n { code: 'mc', name: 'Monaco', defaultFiat: 'EUR' },\n { code: 'md', name: 'Moldova', defaultFiat: 'EUR' },\n { code: 'me', name: 'Montenegro', defaultFiat: 'EUR' },\n { code: 'mg', name: 'Madagascar', defaultFiat: 'USD' },\n { code: 'mk', name: 'North Macedonia', defaultFiat: 'EUR' },\n { code: 'ml', name: 'Mali', defaultFiat: 'USD' },\n { code: 'mm', name: 'Myanmar', defaultFiat: 'USD' },\n { code: 'mn', name: 'Mongolia', defaultFiat: 'USD' },\n { code: 'mr', name: 'Mauritania', defaultFiat: 'USD' },\n { code: 'mt', name: 'Malta', defaultFiat: 'EUR' },\n { code: 'mu', name: 'Mauritius', defaultFiat: 'USD' },\n { code: 'mv', name: 'Maldives', defaultFiat: 'USD' },\n { code: 'mw', name: 'Malawi', defaultFiat: 'USD' },\n { code: 'mx', name: 'Mexico', defaultFiat: 'MXN' },\n { code: 'my', name: 'Malaysia', defaultFiat: 'USD' },\n { code: 'mz', name: 'Mozambique', defaultFiat: 'USD' },\n { code: 'na', name: 'Namibia', defaultFiat: 'ZAR' },\n { code: 'ne', name: 'Niger', defaultFiat: 'USD' },\n { code: 'ng', name: 'Nigeria', defaultFiat: 'NGN' },\n { code: 'ni', name: 'Nicaragua', defaultFiat: 'USD' },\n { code: 'nl', name: 'Netherlands', defaultFiat: 'EUR' },\n { code: 'no', name: 'Norway', defaultFiat: 'NOK' },\n { code: 'np', name: 'Nepal', defaultFiat: 'USD' },\n { code: 'nr', name: 'Nauru', defaultFiat: 'AUD' },\n { code: 'nz', name: 'New Zealand', defaultFiat: 'NZD' },\n { code: 'om', name: 'Oman', defaultFiat: 'USD' },\n { code: 'pa', name: 'Panama', defaultFiat: 'USD' },\n { code: 'pe', name: 'Peru', defaultFiat: 'USD' },\n { code: 'pg', name: 'Papua New Guinea', defaultFiat: 'USD' },\n { code: 'ph', name: 'Philippines', defaultFiat: 'PHP' },\n { code: 'pk', name: 'Pakistan', defaultFiat: 'USD' },\n { code: 'pl', name: 'Poland', defaultFiat: 'PLN' },\n { code: 'pt', name: 'Portugal', defaultFiat: 'EUR' },\n { code: 'pw', name: 'Palau', defaultFiat: 'USD' },\n { code: 'py', name: 'Paraguay', defaultFiat: 'USD' },\n { code: 'qa', name: 'Qatar', defaultFiat: 'QAR' },\n { code: 'ro', name: 'Romania', defaultFiat: 'EUR' },\n { code: 'rs', name: 'Serbia', defaultFiat: 'EUR' },\n { code: 'ru', name: 'Russia', defaultFiat: 'USD' },\n { code: 'rw', name: 'Rwanda', defaultFiat: 'USD' },\n { code: 'sa', name: 'Saudi Arabia', defaultFiat: 'SAR' },\n { code: 'sb', name: 'Solomon Islands', defaultFiat: 'USD' },\n { code: 'sc', name: 'Seychelles', defaultFiat: 'USD' },\n { code: 'sd', name: 'Sudan', defaultFiat: 'USD' },\n { code: 'se', name: 'Sweden', defaultFiat: 'SEK' },\n { code: 'sg', name: 'Singapore', defaultFiat: 'SGD' },\n { code: 'si', name: 'Slovenia', defaultFiat: 'EUR' },\n { code: 'sk', name: 'Slovakia', defaultFiat: 'EUR' },\n { code: 'sl', name: 'Sierra Leone', defaultFiat: 'USD' },\n { code: 'sm', name: 'San Marino', defaultFiat: 'EUR' },\n { code: 'sn', name: 'Senegal', defaultFiat: 'USD' },\n { code: 'so', name: 'Somalia', defaultFiat: 'USD' },\n { code: 'sr', name: 'Suriname', defaultFiat: 'USD' },\n { code: 'ss', name: 'South Sudan', defaultFiat: 'USD' },\n { code: 'sv', name: 'El Salvador', defaultFiat: 'USD' },\n { code: 'sy', name: 'Syria', defaultFiat: 'USD' },\n { code: 'sz', name: 'Eswatini', defaultFiat: 'ZAR' },\n { code: 'td', name: 'Chad', defaultFiat: 'USD' },\n { code: 'tg', name: 'Togo', defaultFiat: 'USD' },\n { code: 'th', name: 'Thailand', defaultFiat: 'THB' },\n { code: 'tj', name: 'Tajikistan', defaultFiat: 'USD' },\n { code: 'tl', name: 'Timor-Leste', defaultFiat: 'USD' },\n { code: 'tm', name: 'Turkmenistan', defaultFiat: 'USD' },\n { code: 'tn', name: 'Tunisia', defaultFiat: 'USD' },\n { code: 'to', name: 'Tonga', defaultFiat: 'USD' },\n { code: 'tr', name: 'Turkey', defaultFiat: 'TRY' },\n { code: 'tt', name: 'Trinidad and Tobago', defaultFiat: 'USD' },\n { code: 'tv', name: 'Tuvalu', defaultFiat: 'AUD' },\n { code: 'tw', name: 'Taiwan', defaultFiat: 'TWD' },\n { code: 'tz', name: 'Tanzania', defaultFiat: 'USD' },\n { code: 'ua', name: 'Ukraine', defaultFiat: 'USD' },\n { code: 'ug', name: 'Uganda', defaultFiat: 'USD' },\n { code: 'us', name: 'United States', defaultFiat: 'USD' },\n { code: 'uy', name: 'Uruguay', defaultFiat: 'USD' },\n { code: 'uz', name: 'Uzbekistan', defaultFiat: 'USD' },\n { code: 'va', name: 'Vatican City', defaultFiat: 'EUR' },\n { code: 'vc', name: 'Saint Vincent and the Grenadines', defaultFiat: 'USD' },\n { code: 've', name: 'Venezuela', defaultFiat: 'USD' },\n { code: 'vn', name: 'Vietnam', defaultFiat: 'VND' },\n { code: 'vu', name: 'Vanuatu', defaultFiat: 'USD' },\n { code: 'ws', name: 'Samoa', defaultFiat: 'USD' },\n { code: 'ye', name: 'Yemen', defaultFiat: 'USD' },\n { code: 'za', name: 'South Africa', defaultFiat: 'ZAR' },\n { code: 'zm', name: 'Zambia', defaultFiat: 'USD' },\n { code: 'zw', name: 'Zimbabwe', defaultFiat: 'USD' },\n];\n\n/** Precomputed lookup by country code */\nexport const COUNTRY_MAP: Record<string, Country> = Object.fromEntries(\n COUNTRIES.map((c) => [c.code, c])\n);\n\n/**\n * Resolve the default fiat currency for a country.\n * Validates against available fiats, falls back to USD then first available.\n */\nexport function getDefaultFiatForCountry(\n countryCode: string | undefined | null,\n supportedFiats?: string[]\n): string {\n if (!countryCode) return 'USD';\n\n const country = COUNTRY_MAP[countryCode.toLowerCase()];\n const preferredFiat = country?.defaultFiat || 'USD';\n\n // If no supported fiats list, return the preferred fiat directly\n if (!supportedFiats || supportedFiats.length === 0) return preferredFiat;\n\n // Check if the country's default fiat is supported\n if (supportedFiats.includes(preferredFiat)) return preferredFiat;\n\n // Fall back to USD if supported\n if (supportedFiats.includes('USD')) return 'USD';\n\n // Last resort: first available fiat\n return supportedFiats[0] || 'USD';\n}\n","/**\n * Ramp Context Provider\n * Provides configuration and state management for the ramp form\n */\n\nimport React, { createContext, useContext, useReducer, useCallback, useMemo, useRef } from 'react';\nimport type {\n RampApiConfig,\n OnrampSupported,\n QuotesResponse,\n Quote,\n CheckoutIntent,\n Transaction,\n FieldLocksConfig,\n FlowType,\n} from '@nowramp/sdk';\nimport {\n useRampConfig,\n useQuotes,\n useCheckoutIntent,\n useTransaction,\n} from '../hooks/useRamp';\nimport { getDefaultFiatForCountry } from '../data/countries';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RampStep =\n | 'confirm' // Confirm pre-filled order (session mode)\n | 'amount' // Select currency and amount\n | 'quotes' // View and compare quotes\n | 'wallet' // Enter wallet address\n | 'checkout' // Provider checkout (iframe/redirect)\n | 'processing' // Waiting for completion\n | 'complete' // Success\n | 'error'; // Error state\n\nexport interface RampFormState {\n step: RampStep;\n flowType: FlowType;\n fiatCurrency: string;\n fiatAmount: string;\n cryptoCurrency: string;\n cryptoAmount: string;\n network: string;\n paymentMethodId: string;\n walletAddress: string;\n walletError: string | null;\n selectedProvider: string | null;\n selectedQuote: Quote | null;\n customerId: string;\n email: string;\n country: string;\n /** How country was set: 'auto' (GeoIP), 'manual' (user pick), or '' (not set) */\n countrySource: 'auto' | 'manual' | '';\n errorMessage: string | null;\n}\n\ntype RampAction =\n | { type: 'SET_STEP'; step: RampStep }\n | { type: 'SET_FLOW_TYPE'; flowType: FlowType }\n | { type: 'SET_FIAT_CURRENCY'; currency: string }\n | { type: 'SET_FIAT_AMOUNT'; amount: string }\n | { type: 'SET_CRYPTO_CURRENCY'; currency: string }\n | { type: 'SET_CRYPTO_AMOUNT'; amount: string }\n | { type: 'SET_NETWORK'; network: string }\n | { type: 'SET_CRYPTO_CHAIN'; chain: string }\n | { type: 'SET_PAYMENT_METHOD'; methodId: string }\n | { type: 'SET_WALLET_ADDRESS'; address: string }\n | { type: 'SET_WALLET_ERROR'; message: string }\n | { type: 'SELECT_QUOTE'; quote: Quote }\n | { type: 'SET_CUSTOMER_ID'; customerId: string }\n | { type: 'SET_EMAIL'; email: string }\n | { type: 'SET_COUNTRY'; country: string }\n | { type: 'SET_COUNTRY_AUTO'; country: string }\n | { type: 'SET_ERROR'; message: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'RESET' };\n\nexport interface RampContextValue {\n // Configuration\n apiConfig: Pick<RampApiConfig, 'apiUrl' | 'projectId'>;\n /** Base URL for static assets (crypto icons, flags). Empty string = root-relative. */\n assetBaseUrl: string;\n config: OnrampSupported | null;\n configLoading: boolean;\n configError: Error | null;\n\n // Form state\n state: RampFormState;\n dispatch: React.Dispatch<RampAction>;\n\n // Quotes\n quotes: QuotesResponse | null;\n quotesLoading: boolean;\n quotesError: Error | null;\n fetchQuotes: () => void;\n\n // Order\n order: CheckoutIntent | null;\n orderLoading: boolean;\n orderError: Error | null;\n createOrder: () => Promise<void>;\n\n // Order status\n orderStatus: Transaction | null;\n orderStatusLoading: boolean;\n\n // Session-aware props\n fieldLocks: FieldLocksConfig | null;\n defaultGateway: string | null;\n\n // Validation\n amountError: string | null;\n\n // Navigation helpers\n goToStep: (step: RampStep) => void;\n goBack: () => void;\n canProceed: boolean;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Strip trailing zeros and limit decimal places (cleans backend values like \"33.00000000\") */\nfunction normalizeAmount(value: string, maxDecimals: number): string {\n if (!value) return value;\n const dotIndex = value.indexOf('.');\n if (dotIndex === -1) return value;\n let result = value;\n if (result.length - dotIndex - 1 > maxDecimals) {\n result = result.slice(0, dotIndex + maxDecimals + 1);\n }\n result = result.replace(/0+$/, '').replace(/\\.$/, '');\n return result;\n}\n\n// =============================================================================\n// Initial State & Reducer\n// =============================================================================\n\nconst initialState: RampFormState = {\n step: 'amount',\n flowType: 'buy',\n fiatCurrency: 'USD',\n fiatAmount: '',\n cryptoCurrency: '',\n cryptoAmount: '',\n network: '',\n paymentMethodId: '',\n walletAddress: '',\n walletError: null,\n selectedProvider: null,\n selectedQuote: null,\n customerId: '',\n email: '',\n country: '',\n countrySource: '',\n errorMessage: null,\n};\n\nfunction rampReducer(state: RampFormState, action: RampAction): RampFormState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, step: action.step, errorMessage: null };\n case 'SET_FLOW_TYPE':\n return {\n ...state,\n flowType: action.flowType,\n fiatAmount: '',\n cryptoAmount: '',\n paymentMethodId: '',\n selectedQuote: null,\n selectedProvider: null,\n errorMessage: null,\n };\n case 'SET_FIAT_CURRENCY':\n return { ...state, fiatCurrency: action.currency };\n case 'SET_FIAT_AMOUNT':\n return { ...state, fiatAmount: action.amount };\n case 'SET_CRYPTO_CURRENCY':\n return { ...state, cryptoCurrency: action.currency, network: '' };\n case 'SET_CRYPTO_AMOUNT':\n return { ...state, cryptoAmount: action.amount };\n case 'SET_NETWORK':\n return { ...state, network: action.network };\n case 'SET_CRYPTO_CHAIN':\n return { ...state, network: action.chain };\n case 'SET_PAYMENT_METHOD':\n return { ...state, paymentMethodId: action.methodId };\n case 'SET_WALLET_ADDRESS':\n return { ...state, walletAddress: action.address, walletError: null };\n case 'SET_WALLET_ERROR':\n return { ...state, walletError: action.message };\n case 'SELECT_QUOTE':\n return {\n ...state,\n selectedQuote: action.quote,\n selectedProvider: action.quote.gatewayId,\n };\n case 'SET_CUSTOMER_ID':\n return { ...state, customerId: action.customerId };\n case 'SET_EMAIL':\n return { ...state, email: action.email };\n case 'SET_COUNTRY':\n return { ...state, country: action.country, countrySource: 'manual' };\n case 'SET_COUNTRY_AUTO':\n return { ...state, country: action.country, countrySource: 'auto' };\n case 'SET_ERROR':\n return { ...state, step: 'error', errorMessage: action.message };\n case 'CLEAR_ERROR':\n return { ...state, errorMessage: null };\n case 'RESET':\n return initialState;\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst RampContext = createContext<RampContextValue | null>(null);\n\nexport interface RampProviderProps {\n /** Project ID (required) */\n projectId: string;\n /** API base URL (optional) */\n apiUrl?: string;\n /** Base URL for static assets (crypto icons, flags). Use CDN URL for standalone/IIFE deployments. */\n assetBaseUrl?: string;\n /** Flow type: 'buy' (onramp) or 'sell' (offramp) */\n flowType?: FlowType;\n /** External customer ID */\n customerId?: string;\n /** Brand identifier for metadata tracking (e.g., sub-brand name) */\n brandId?: string;\n /** Initial fiat currency */\n defaultFiatCurrency?: string;\n /** Initial crypto currency */\n defaultCryptoCurrency?: string;\n /** Initial network */\n defaultNetwork?: string;\n /** Initial fiat amount */\n defaultFiatAmount?: string;\n /** Initial crypto amount (used for sell/offramp) */\n defaultCryptoAmount?: string;\n /** Initial wallet address */\n defaultWalletAddress?: string;\n /** Default gateway ID to pre-select. Falls back to project config if not set. */\n defaultGateway?: string;\n /** Default country code (ISO alpha-2). If set, skips GeoIP auto-detection. */\n defaultCountry?: string;\n /** Field locks from session */\n fieldLocks?: FieldLocksConfig;\n /** Poll interval for order status (ms) */\n statusPollInterval?: number;\n /** Callback when order completes */\n onComplete?: (status: Transaction) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n children: React.ReactNode;\n}\n\nexport function RampProvider({\n projectId,\n apiUrl = 'https://api.nowramp.com',\n assetBaseUrl = '',\n flowType = 'buy',\n customerId = '',\n brandId,\n defaultFiatCurrency = 'USD',\n defaultCryptoCurrency = 'BTC',\n defaultNetwork: defaultNetworkProp = '',\n defaultFiatAmount = '',\n defaultCryptoAmount = '',\n defaultWalletAddress = '',\n defaultGateway,\n defaultCountry,\n fieldLocks,\n statusPollInterval = 5000,\n onComplete,\n onError,\n children,\n}: RampProviderProps) {\n const apiConfig = useMemo(() => ({ apiUrl, projectId }), [apiUrl, projectId]);\n\n // If no network specified but crypto is, use lowercase ticker as default (matches Banxa network IDs)\n const defaultNetwork = defaultNetworkProp || (defaultCryptoCurrency ? defaultCryptoCurrency.toLowerCase() : '');\n\n // Determine initial step: if all fields are pre-set with a gateway, go to confirm\n // For sell: wallet is optional, so don't require it\n const initialIsSell = flowType === 'sell';\n const hasAmount = initialIsSell ? !!defaultCryptoAmount : !!defaultFiatAmount;\n const hasAllFields = initialIsSell\n ? !!(hasAmount && defaultCryptoCurrency && defaultNetwork)\n : !!(hasAmount && defaultCryptoCurrency && defaultNetwork && defaultWalletAddress);\n const initialStep: RampStep = (hasAllFields && defaultGateway) ? 'confirm' : 'amount';\n\n // Initialize state with defaults\n // Use '250' as default fiat amount for buy if none provided\n const effectiveFiatAmount = defaultFiatAmount || (flowType === 'buy' ? '250' : '');\n const [state, dispatch] = useReducer(rampReducer, {\n ...initialState,\n step: initialStep,\n flowType,\n fiatCurrency: defaultFiatCurrency,\n cryptoCurrency: defaultCryptoCurrency,\n network: defaultNetwork,\n fiatAmount: normalizeAmount(effectiveFiatAmount, 2),\n cryptoAmount: normalizeAmount(defaultCryptoAmount, 6),\n walletAddress: defaultWalletAddress,\n customerId,\n // If defaultCountry is provided, set it immediately with 'manual' source to skip auto-detection\n ...(defaultCountry ? { country: defaultCountry.toLowerCase(), countrySource: 'manual' as const } : {}),\n });\n\n const isSell = state.flowType === 'sell';\n\n // Fetch supported config (pass orderType for sell to get sell-specific currencies/limits)\n // Pass country so backend filters results by region\n const {\n config,\n loading: configLoading,\n error: configError,\n } = useRampConfig(apiConfig, state.flowType, state.country || undefined);\n\n // GeoIP auto-detection: when config loads with detectedCountry and no country is set yet\n const geoAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoAppliedRef.current) return;\n if (!config?.detectedCountry) return;\n // Skip if country already set (defaultCountry prop or manual selection)\n if (state.country) return;\n\n geoAppliedRef.current = true;\n const detected = config.detectedCountry.toLowerCase();\n dispatch({ type: 'SET_COUNTRY_AUTO', country: detected });\n\n // Auto-set fiat currency based on detected country\n const supportedFiats = config.fiats?.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(detected, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [config, state.country, state.fiatCurrency]);\n\n // When defaultCountry is set and config loads, auto-set fiat for that country\n const defaultCountryAppliedRef = useRef(false);\n React.useEffect(() => {\n if (defaultCountryAppliedRef.current) return;\n if (!defaultCountry || !config?.fiats?.length) return;\n\n defaultCountryAppliedRef.current = true;\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(defaultCountry, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [defaultCountry, config, state.fiatCurrency]);\n\n // Reset geo-fallback guard when user manually changes country, so the\n // fallback can re-evaluate for the new geo-detected currency\n // Manual country change: auto-update fiat currency when user picks a new country\n const prevCountryRef = useRef(state.country);\n React.useEffect(() => {\n if (state.country === prevCountryRef.current) return;\n prevCountryRef.current = state.country;\n if (state.countrySource === 'manual') {\n geoFallbackAppliedRef.current = false;\n }\n\n // Only auto-switch fiat for manual selections (not initial auto-detection, which is handled above)\n if (state.countrySource !== 'manual') return;\n if (!config?.fiats?.length) return;\n\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(state.country, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [state.country, state.countrySource, config, state.fiatCurrency]);\n\n // When fiat currency changes, ensure the amount meets the new currency's minimum\n // This handles cases like geo-detection switching from USD (250 is fine) to TRY (250 is below min)\n const prevFiatRef = useRef(state.fiatCurrency);\n React.useEffect(() => {\n if (state.fiatCurrency === prevFiatRef.current) return;\n prevFiatRef.current = state.fiatCurrency;\n\n if (isSell || !config?.fiats?.length || !state.fiatAmount) return;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat?.minAmount) return;\n\n const currentAmount = parseFloat(state.fiatAmount);\n const minAmount = parseFloat(fiat.minAmount);\n if (!isNaN(currentAmount) && !isNaN(minAmount) && currentAmount < minAmount) {\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: String(Math.ceil(minAmount)) });\n }\n }, [state.fiatCurrency, state.fiatAmount, config, isSell]);\n\n // Auto-select first network when config loads and crypto is set but network is empty\n React.useEffect(() => {\n if (!config || !state.cryptoCurrency || state.network) return;\n const crypto = config.cryptos?.find((c: any) => c.code === state.cryptoCurrency);\n const defaultNet = crypto?.networks?.find((n: any) => n.isDefault) || crypto?.networks?.[0];\n if (defaultNet?.id) {\n dispatch({ type: 'SET_NETWORK', network: defaultNet.id });\n }\n }, [config, state.cryptoCurrency, state.network]);\n\n // Auto-select first valid payment method when config loads or fiat changes\n React.useEffect(() => {\n if (!config?.paymentMethods?.length) return;\n const fiat = state.fiatCurrency;\n const methods = config.paymentMethods;\n\n // If current selection is still valid for this fiat, keep it\n if (state.paymentMethodId) {\n const stillValid = methods.some(\n (m) => m.id === state.paymentMethodId && m.supportedFiats.includes(fiat)\n );\n if (stillValid) return;\n }\n\n // Prefer card/debit methods, then fall back to first available\n const cardMatch = methods.find(\n (m) => m.supportedFiats.includes(fiat) && (m.id.includes('card') || m.id.includes('debit'))\n );\n const match = cardMatch || methods.find((m) => m.supportedFiats.includes(fiat));\n dispatch({ type: 'SET_PAYMENT_METHOD', methodId: match?.id || methods[0]?.id || '' });\n }, [config, state.fiatCurrency, state.paymentMethodId]);\n\n // Amount validation against min/max limits\n // Computed before quoteParams so invalid amounts never trigger a fetch\n // For sell, user enters crypto amount — skip fiat-based validation (backend validates)\n const amountError = useMemo(() => {\n if (isSell) {\n // For sell, basic presence check only — backend validates crypto amount limits\n if (!state.cryptoAmount) return null;\n const amount = parseFloat(state.cryptoAmount);\n if (isNaN(amount) || amount <= 0) return 'Enter a valid amount';\n return null;\n }\n\n if (!config || !state.fiatAmount) return null;\n\n const amount = parseFloat(state.fiatAmount);\n if (isNaN(amount)) return null;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return null;\n\n const min = parseFloat(fiat.minAmount);\n const max = parseFloat(fiat.maxAmount);\n\n if (!isNaN(min) && amount < min) {\n return `Minimum amount is ${fiat.minAmount} ${state.fiatCurrency}`;\n }\n if (!isNaN(max) && amount > max) {\n return `Maximum amount is ${fiat.maxAmount} ${state.fiatCurrency}`;\n }\n return null;\n }, [config, state.fiatAmount, state.fiatCurrency, state.cryptoAmount, isSell]);\n\n // Fetch quotes when form is filled, config loaded, and amount is valid\n // Wait for geo-detection to resolve before fetching (prevents wasted initial fetch\n // that gets cancelled when fiat currency changes from USD to the detected currency)\n const quoteParams = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n if (!config || !hasAmount || !state.cryptoCurrency || !state.network) {\n return null;\n }\n if (amountError) {\n return null;\n }\n // If backend detected a country but geo-detection effect hasn't applied yet, wait\n if (config.detectedCountry && state.countrySource === '' && !defaultCountry) {\n return null;\n }\n return {\n fiatCurrency: state.fiatCurrency,\n ...(isSell ? { cryptoAmount: state.cryptoAmount } : { fiatAmount: state.fiatAmount }),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n paymentMethodId: state.paymentMethodId || undefined,\n country: state.country || undefined,\n orderType: state.flowType,\n };\n }, [config, state.fiatCurrency, state.fiatAmount, state.cryptoAmount, state.cryptoCurrency, state.network, state.paymentMethodId, state.country, state.countrySource, amountError, isSell, state.flowType, defaultCountry]);\n\n const {\n quotes,\n loading: quotesLoading,\n error: quotesError,\n refetch: fetchQuotes,\n } = useQuotes(apiConfig, quoteParams);\n\n // Fallback: if geo-detected fiat returns no quotes for the default crypto, fall back to USD\n // This handles cases where a local currency (e.g. NGN) has no provider pairs with BTC\n // Only triggers when quotes loaded successfully with zero results — never on API errors\n const geoFallbackAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoFallbackAppliedRef.current) return;\n // Only apply for auto-detected currencies, not manual selections\n if (state.countrySource !== 'auto') return;\n // Wait until quotes have actually loaded (not loading, not null params)\n if (quotesLoading || !quoteParams) return;\n // Skip fallback on API errors — only fall back when the response succeeded\n // but contained no quotes (i.e. quotes object exists with no bestQuote)\n if (quotesError || !quotes) return;\n // If we got quotes, no fallback needed\n if (quotes.bestQuote) return;\n // If the fiat is already USD, nothing to fall back to\n if (state.fiatCurrency === 'USD') return;\n\n geoFallbackAppliedRef.current = true;\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: 'USD' });\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: '250' });\n }, [quotes, quotesLoading, quotesError, quoteParams, state.countrySource, state.fiatCurrency]);\n\n // Order creation\n const {\n order,\n loading: orderLoading,\n error: orderError,\n createOrder: createOrderApi,\n } = useCheckoutIntent(apiConfig);\n\n // Order status polling — delay the initial fetch to give the checkout\n // iframe time to load before we start polling. Without this, the first\n // poll can return a 'processing' status from the provider and the\n // CheckoutStep immediately transitions to ProcessingStep before the\n // user even sees the iframe (race condition with iframe-based providers\n // like Banxa that move to 'processing' quickly).\n const CHECKOUT_POLL_INITIAL_DELAY = 15_000; // 15 seconds\n\n const {\n status: orderStatus,\n loading: orderStatusLoading,\n } = useTransaction(\n { apiUrl },\n order?.orderId ?? null,\n { pollInterval: statusPollInterval, initialDelay: CHECKOUT_POLL_INITIAL_DELAY }\n );\n\n // Handle order completion\n React.useEffect(() => {\n if (orderStatus?.status === 'completed' && onComplete) {\n onComplete(orderStatus);\n }\n }, [orderStatus?.status, onComplete]);\n\n // Handle errors — only propagate config and order errors as fatal.\n // Quote errors are non-fatal (validation rejections, transient failures)\n // and are already surfaced via quotesError in the UI.\n React.useEffect(() => {\n const error = configError || orderError;\n if (error && onError) {\n onError(error);\n }\n }, [configError, orderError, onError]);\n\n // Resolve effective default gateway: explicit prop > project config\n const effectiveDefaultGateway = defaultGateway || config?.defaultGateway || null;\n\n // Use refs to avoid stale closures — async data loads mean callbacks may\n // capture earlier null values even with useCallback deps.\n const gatewayRef = useRef(effectiveDefaultGateway);\n gatewayRef.current = effectiveDefaultGateway;\n\n const quotesRef = useRef(quotes);\n quotesRef.current = quotes;\n\n const brandIdRef = useRef(brandId);\n brandIdRef.current = brandId;\n\n // Create order handler\n const createOrder = useCallback(async () => {\n const gateway = state.selectedQuote?.gatewayId || quotesRef.current?.bestQuote?.gatewayId || gatewayRef.current;\n if (!gateway || !state.walletAddress) {\n const missing = [!gateway && 'gateway', !state.walletAddress && 'walletAddress'].filter(Boolean).join(', ');\n dispatch({ type: 'SET_ERROR', message: `Missing required fields: ${missing}` });\n return;\n }\n\n try {\n await createOrderApi({\n gateway,\n customerId: state.customerId || undefined,\n fiatCurrency: state.fiatCurrency,\n ...(isSell\n ? { cryptoAmount: state.cryptoAmount }\n : { fiatAmount: state.fiatAmount }\n ),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n walletAddress: state.walletAddress,\n paymentMethodId: state.paymentMethodId || undefined,\n email: state.email || undefined,\n orderType: state.flowType,\n ...(brandIdRef.current ? { metadata: { brand: brandIdRef.current } } : {}),\n });\n\n // Move to checkout step\n dispatch({ type: 'SET_STEP', step: 'checkout' });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n // Wallet address validation errors stay inline instead of going to error screen\n if (/wallet|address/i.test(message)) {\n dispatch({ type: 'SET_WALLET_ERROR', message: message.replace(/^Failed to create checkout intent:\\s*/i, '') });\n } else {\n dispatch({ type: 'SET_ERROR', message });\n }\n }\n }, [state, createOrderApi, isSell]);\n\n // Navigation helpers\n const goToStep = useCallback((step: RampStep) => {\n dispatch({ type: 'SET_STEP', step });\n }, []);\n\n const goBack = useCallback(() => {\n const stepOrder: RampStep[] = ['confirm', 'amount', 'quotes', 'wallet', 'checkout', 'processing', 'complete'];\n const currentIndex = stepOrder.indexOf(state.step);\n if (currentIndex > 0) {\n dispatch({ type: 'SET_STEP', step: stepOrder[currentIndex - 1] });\n }\n }, [state.step, isSell]);\n\n // Check if user can proceed to next step\n const canProceed = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n switch (state.step) {\n case 'confirm':\n return !!(hasAmount && state.cryptoCurrency && state.network && state.walletAddress && !amountError);\n case 'amount':\n return !!(hasAmount && state.cryptoCurrency && state.network && !amountError);\n case 'quotes':\n return !!state.selectedQuote;\n case 'wallet':\n return !!state.walletAddress;\n default:\n return false;\n }\n }, [state, amountError, isSell]);\n\n const value: RampContextValue = {\n apiConfig,\n assetBaseUrl,\n config,\n configLoading,\n configError,\n state,\n dispatch,\n quotes,\n quotesLoading,\n quotesError,\n fetchQuotes,\n order,\n orderLoading,\n orderError,\n createOrder,\n orderStatus,\n orderStatusLoading,\n fieldLocks: fieldLocks || null,\n defaultGateway: effectiveDefaultGateway,\n amountError,\n goToStep,\n goBack,\n canProceed,\n };\n\n return (\n <RampContext.Provider value={value}>\n {children}\n </RampContext.Provider>\n );\n}\n\n/**\n * Hook to access ramp context\n */\nexport function useRamp(): RampContextValue {\n const context = useContext(RampContext);\n if (!context) {\n throw new Error('useRamp must be used within a RampProvider');\n }\n return context;\n}\n","/**\n * Complete Banxa-supported cryptocurrencies and blockchains data.\n * TypeScript conversion of the crypto data module.\n * Icons are stored locally in /crypto-icons/{ticker}.svg\n */\n\n// ── TypeScript interfaces ──\n\nexport interface BlockchainInfo {\n name: string;\n shortName?: string;\n icon: string;\n}\n\nexport interface CryptoCurrency {\n code: string;\n name: string;\n chains: string[];\n popular: boolean;\n}\n\nexport interface FiatCurrency {\n code: string;\n name: string;\n}\n\nexport interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport interface CryptoChainCombo {\n code: string;\n name: string;\n chain: string;\n /** Display name from provider (e.g. \"Ethereum Mainnet\") */\n chainName?: string;\n popular: boolean;\n}\n\n// ── Blockchain / Network definitions ──\n// Maps blockchain codes to display names and their icon ticker\n\nexport const BLOCKCHAINS: Record<string, BlockchainInfo> = {\n // Canonical IDs (returned by the API — lowercase full names)\n // These cover cases where the canonical ID differs from the legacy uppercase key\n ethereum: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n bitcoin: { name: 'Bitcoin', icon: 'btc' },\n solana: { name: 'Solana', icon: 'sol' },\n polygon: { name: 'Polygon', icon: 'pol' },\n arbitrum: { name: 'Arbitrum', icon: 'arb' },\n avalanche: { name: 'Avalanche C-Chain', shortName: 'Avalanche', icon: 'avax' },\n litecoin: { name: 'Litecoin', icon: 'ltc' },\n tezos: { name: 'Tezos', icon: 'xtz' },\n sei: { name: 'SEI', icon: 'sei' },\n imx: { name: 'Immutable X', shortName: 'Immutable', icon: 'imx' },\n galachain: { name: 'Gala', icon: 'gala' },\n zksync2: { name: 'zkSync Era', shortName: 'zkSync', icon: 'zksync' },\n zks: { name: 'zkSpace', icon: 'zks' },\n 'flow-evm': { name: 'Flow (EVM)', shortName: 'Flow', icon: 'flow' },\n vara: { name: 'Vara', icon: 'vara' },\n venom: { name: 'Venom', icon: 'venom' },\n hsk: { name: 'HashKey Chain', shortName: 'HashKey', icon: 'hsk' },\n mck: { name: 'MCK', icon: 'mck' },\n peer: { name: 'Peer', icon: 'peer' },\n // Testnets (fallback display names)\n goerli: { name: 'Goerli Testnet', shortName: 'Goerli', icon: 'eth' },\n hbartestnet: { name: 'Hedera Testnet', shortName: 'Hedera', icon: 'hbar' },\n arbitrumrinkeby: { name: 'Arbitrum Testnet', shortName: 'Arbitrum', icon: 'arb' },\n dydxtestnet: { name: 'dYdX Testnet', shortName: 'dYdX', icon: 'stark' },\n 'zksync-rinkeby': { name: 'zkSync Testnet', shortName: 'zkSync', icon: 'zksync' },\n\n // Legacy uppercase keys (used by local crypto data and older integrations)\n ETH: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n BSC: { name: 'Binance Smart Chain (BEP20)', shortName: 'Binance', icon: 'bnb' },\n BTC: { name: 'Bitcoin', icon: 'btc' },\n SOL: { name: 'Solana', icon: 'sol' },\n MATIC: { name: 'Polygon', icon: 'pol' },\n ARB: { name: 'Arbitrum', icon: 'arb' },\n BASE: { name: 'Base', icon: 'base' },\n OPTIMISM: { name: 'Optimism', icon: 'op' },\n AVAX_C: { name: 'Avalanche C-Chain', shortName: 'Avalanche C', icon: 'avax' },\n AVAX_X: { name: 'Avalanche X-Chain', shortName: 'Avalanche X', icon: 'avax' },\n ADA: { name: 'Cardano', icon: 'ada' },\n DOT: { name: 'Polkadot', icon: 'dot' },\n TRON: { name: 'Tron (TRC20)', shortName: 'Tron', icon: 'trx' },\n XRP: { name: 'Ripple', icon: 'xrp' },\n XLM: { name: 'Stellar', icon: 'xlm' },\n ALGO: { name: 'Algorand', icon: 'algo' },\n ATOM: { name: 'Cosmos', icon: 'atom' },\n NEAR: { name: 'NEAR Protocol', shortName: 'NEAR', icon: 'near' },\n SUI: { name: 'Sui', icon: 'sui' },\n APT: { name: 'Aptos', icon: 'apt' },\n TON: { name: 'Ton', icon: 'ton' },\n FIL: { name: 'Filecoin', icon: 'fil' },\n FLOW: { name: 'Flow', icon: 'flow' },\n HBAR: { name: 'Hedera Hashgraph', shortName: 'Hedera', icon: 'hbar' },\n INJ: { name: 'Injective', icon: 'inj' },\n SEI_EVM: { name: 'SEI (EVM)', shortName: 'SEI', icon: 'sei' },\n ZKSYNC: { name: 'zkSync', icon: 'zksync' },\n LINEA: { name: 'Linea', icon: 'linea' },\n STARK: { name: 'StarkNet', icon: 'strk' },\n LN: { name: 'Lightning', icon: 'btc' },\n CELO: { name: 'Celo', icon: 'celo' },\n CRO: { name: 'Cronos', icon: 'cro' },\n FTM: { name: 'Fantom', icon: 'ftm' },\n GLMR: { name: 'Moonbeam', icon: 'glmr' },\n MOVR: { name: 'Moonriver', icon: 'movr' },\n KSM: { name: 'Kusama', icon: 'ksm' },\n EOS: { name: 'EOS', icon: 'eos' },\n ETC: { name: 'Ethereum Classic', shortName: 'ETH Classic', icon: 'etc' },\n LTC: { name: 'Litecoin', icon: 'ltc' },\n BCH: { name: 'Bitcoin Cash', shortName: 'BTC Cash', icon: 'bch' },\n DOGE: { name: 'Dogecoin', icon: 'doge' },\n BNB: { name: 'Binance Chain (BEP2)', shortName: 'Binance', icon: 'bnb' },\n ONE: { name: 'Harmony', icon: 'one' },\n KLAY: { name: 'Kaia', icon: 'kaia' },\n RON: { name: 'Ronin', icon: 'ron' },\n LRC: { name: 'Loopring', icon: 'lrc' },\n ICP: { name: 'Internet Computer', shortName: 'ICP', icon: 'icp' },\n EGLD: { name: 'MultiversX', icon: 'egld' },\n FLUX: { name: 'Flux', icon: 'flux' },\n KDA: { name: 'Kadena', icon: 'kda' },\n WAVES: { name: 'Waves', icon: 'waves' },\n XTZ: { name: 'Tezos', icon: 'xtz' },\n ACA: { name: 'Acala', icon: 'aca' },\n ALEO: { name: 'Aleo', icon: 'aleo' },\n ALPH: { name: 'Alephium', icon: 'alph' },\n APE: { name: 'ApeChain', icon: 'ape' },\n ASTR: { name: 'Astar', icon: 'astr' },\n AZERO: { name: 'Aleph Zero', icon: 'azero' },\n AZERO_EVM: { name: 'Aleph Zero EVM', shortName: 'Aleph Zero', icon: 'azero' },\n BAJU: { name: 'Bajun Network', shortName: 'Bajun', icon: 'baju' },\n BNCPOLKA: { name: 'Bifrost Polkadot', shortName: 'Bifrost', icon: 'bnc' },\n BNC: { name: 'Bifrost Kusama', shortName: 'Bifrost', icon: 'bnc' },\n BOBA: { name: 'Boba Network', shortName: 'Boba', icon: 'boba' },\n BSX: { name: 'Basilisk', icon: 'bsx' },\n CHZ: { name: 'Chiliz', icon: 'chz' },\n VIC: { name: 'Viction', icon: 'vic' },\n CCD: { name: 'Concordium', icon: 'ccd' },\n COREUM: { name: 'Coreum', icon: 'coreum' },\n DINGO: { name: 'Dingocoin', icon: 'dingo' },\n HDX: { name: 'Hydration', icon: 'hdx' },\n PLMC: { name: 'Polimec', icon: 'plmc' },\n MNT: { name: 'Mantle', icon: 'mnt' },\n ERG: { name: 'Ergo', icon: 'erg' },\n ECLIPSE: { name: 'Eclipse', icon: 'eclipse' },\n FUEL: { name: 'Fuel Ignition', shortName: 'Fuel', icon: 'fuel' },\n INK: { name: 'Ink', icon: 'ink' },\n SOPHON: { name: 'Sophon', icon: 'sophon' },\n UNICHAIN: { name: 'Unichain', icon: 'unichain' },\n WLD: { name: 'Worldchain', icon: 'wld' },\n ETHERLINK: { name: 'Etherlink', icon: 'etherlink' },\n MOB: { name: 'MobileCoin', icon: 'mob' },\n GALA: { name: 'Gala', icon: 'gala' },\n GUNZ: { name: 'Gunz', icon: 'gun' },\n HNT: { name: 'Helium', icon: 'hnt' },\n BITKUB: { name: 'BitKub', icon: 'kub' },\n IMMUTABLE_ZKEVM: { name: 'Immutable-zkEVM', shortName: 'Immutable', icon: 'imx' },\n INIT: { name: 'Initia', icon: 'init' },\n INTR: { name: 'Interlay', icon: 'intr' },\n KINESIS: { name: 'Kinesis', icon: 'kag' },\n KAR: { name: 'Karura', icon: 'kar' },\n KCC: { name: 'KuCoin Community Chain', shortName: 'KuCoin', icon: 'kcs' },\n KILT: { name: 'KILT Spiritnet', shortName: 'KILT', icon: 'kilt' },\n KINT: { name: 'Kintsugi', icon: 'kint' },\n KMD: { name: 'Komodo', icon: 'kmd' },\n LSK: { name: 'Lisk', icon: 'lsk' },\n METIS: { name: 'Metis Andromeda', shortName: 'Metis', icon: 'metis' },\n MYTH: { name: 'Myth', icon: 'myth' },\n OAS: { name: 'Oasys', icon: 'oas' },\n PEAQ_EVM: { name: 'Peaq (EVM)', shortName: 'Peaq', icon: 'peaq' },\n PEN: { name: 'Pendulum', icon: 'pen' },\n PI: { name: 'Pi', icon: 'pi' },\n POLYX: { name: 'Polymesh', icon: 'polyx' },\n Q: { name: 'QuantumCoin', icon: 'q' },\n QRL: { name: 'Quantum Resistant Ledger', shortName: 'QRL', icon: 'qrl' },\n QUBIC: { name: 'Qubic', icon: 'qubic' },\n RBX: { name: 'ReserveBlock', icon: 'rbx' },\n ROLLUX: { name: 'Rollux', icon: 'rollux' },\n THORCHAIN: { name: 'Thorchain', icon: 'rune' },\n S: { name: 'Sonic', icon: 's' },\n SONIC: { name: 'Sonic', icon: 's' },\n TERNOA: { name: 'Ternoa', icon: 'caps' },\n SX: { name: 'SX Network', icon: 'sol' },\n WAX: { name: 'WAX', icon: 'waxp' },\n XCH: { name: 'Chia Chain', icon: 'xch' },\n XPRT: { name: 'Persistence', icon: 'xprt' },\n ZETACHAIN: { name: 'ZetaChain', icon: 'zeta' },\n ZTG: { name: 'Zeitgeist', icon: 'ztg' },\n PLS: { name: 'Pulsechain', icon: 'pulsechain' },\n MEZO: { name: 'Mezo', icon: 'mezo' },\n BSV: { name: 'Bitcoin SV', shortName: 'BTC SV', icon: 'btc' },\n MONAD: { name: 'Monad', icon: 'mon' },\n SUPRA: { name: 'Supra', icon: 'supra' },\n SOMI: { name: 'Somnia', icon: 'somi' },\n VERIFIEDX: { name: 'VerifiedX', icon: 'vfx' },\n MOVE: { name: 'Movement', icon: 'move' },\n FLR: { name: 'Flare', icon: 'flr' },\n ASSETHUB: { name: 'Asset Hub Polkadot', shortName: 'Asset Hub', icon: 'dot' },\n BOB: { name: 'BOB', icon: 'btc' },\n GLUE: { name: 'Glue', icon: 'eth' },\n DYDX: { name: 'StarkEx', icon: 'stark' },\n OKC: { name: 'OKX Chain', icon: 'eth' },\n UNI_CHAIN: { name: 'UNI', icon: 'uni' },\n ZEC: { name: 'ZCash', icon: 'zec' },\n};\n\n// ── Full Banxa-supported cryptocurrencies ──\n// Each entry: { code, name, chains[], popular }\n// chains[] lists the blockchain codes this crypto is available on\n\nexport const CRYPTO_CURRENCIES: CryptoCurrency[] = [\n // --- Popular / Top coins ---\n { code: 'BTC', name: 'Bitcoin', chains: ['BTC', 'LN'], popular: true },\n { code: 'ETH', name: 'Ethereum', chains: ['ETH', 'ARB', 'BASE', 'BSC', 'OPTIMISM', 'LINEA', 'ZKSYNC', 'LRC', 'STARK', 'APE', 'ECLIPSE', 'FUEL', 'INK', 'SOPHON', 'UNICHAIN', 'WLD'], popular: true },\n { code: 'USDC', name: 'USD Coin', chains: ['ETH', 'SOL', 'ARB', 'BASE', 'BSC', 'MATIC', 'OPTIMISM', 'AVAX_C', 'ALGO', 'APT', 'CELO', 'FLOW', 'HBAR', 'LINEA', 'LRC', 'ZKSYNC', 'STARK', 'SUI', 'XLM', 'ECLIPSE', 'HDX', 'INK', 'LSK', 'METIS', 'MONAD', 'SEI_EVM', 'SONIC', 'SOPHON', 'SX', 'UNICHAIN', 'APE', 'BNCPOLKA', 'GLMR', 'PEAQ_EVM', 'PLMC', 'RON', 'UNI_CHAIN', 'WLD', 'BITKUB', 'BOB', 'DYDX', 'ETHERLINK', 'GLUE', 'ASSETHUB'], popular: true },\n { code: 'USDT', name: 'Tether', chains: ['ETH', 'BSC', 'TRON', 'ARB', 'MATIC', 'AVAX_C', 'SOL', 'OPTIMISM', 'ZKSYNC', 'STARK', 'APT', 'CELO', 'KLAY', 'LRC', 'LSK', 'ECLIPSE', 'ETHERLINK', 'OKC', 'PEAQ_EVM', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC', 'VIC', 'ASSETHUB'], popular: true },\n { code: 'SOL', name: 'Solana', chains: ['SOL'], popular: true },\n { code: 'XRP', name: 'Ripple', chains: ['XRP'], popular: true },\n { code: 'ADA', name: 'Cardano', chains: ['ADA'], popular: true },\n { code: 'DOGE', name: 'Dogecoin', chains: ['DOGE'], popular: true },\n { code: 'DOT', name: 'Polkadot', chains: ['DOT', 'BSC', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC'], popular: true },\n { code: 'AVAX', name: 'Avalanche', chains: ['AVAX_C', 'AVAX_X', 'BSC'], popular: true },\n { code: 'LINK', name: 'ChainLink', chains: ['ETH', 'BSC'], popular: true },\n { code: 'LTC', name: 'Litecoin', chains: ['LTC'], popular: true },\n\n // --- Major altcoins ---\n { code: 'AAVE', name: 'Aave', chains: ['ETH', 'BSC'], popular: false },\n { code: 'ACA', name: 'Acala', chains: ['ACA'], popular: false },\n { code: 'ALEO', name: 'Aleo', chains: ['ALEO'], popular: false },\n { code: 'ALGO', name: 'Algorand', chains: ['ALGO'], popular: false },\n { code: 'ALPH', name: 'Alephium', chains: ['ALPH'], popular: false },\n { code: 'APE', name: 'ApeCoin', chains: ['APE', 'ETH'], popular: false },\n { code: 'APT', name: 'Aptos', chains: ['APT'], popular: false },\n { code: 'ARB', name: 'Arbitrum', chains: ['ARB'], popular: false },\n { code: 'ASTR', name: 'Astar', chains: ['ASTR'], popular: false },\n { code: 'ATOM', name: 'Cosmos', chains: ['ATOM'], popular: false },\n { code: 'AUDD', name: 'Novatti Australian Digital Dollar', chains: ['ETH'], popular: false },\n { code: 'AVT', name: 'Aventus', chains: ['ETH'], popular: false },\n { code: 'AXS', name: 'Axie Infinity', chains: ['ETH', 'RON'], popular: false },\n { code: 'AZERO', name: 'Aleph Zero', chains: ['AZERO', 'AZERO_EVM'], popular: false },\n { code: 'BAJU', name: 'Bajun Network', chains: ['BAJU'], popular: false },\n { code: 'BARSIK', name: \"Hasbulla's Cat\", chains: ['SOL'], popular: false },\n { code: 'BAT', name: 'Basic Attention Token', chains: ['ETH', 'BSC'], popular: false },\n { code: 'BCH', name: 'Bitcoin Cash', chains: ['BCH'], popular: false },\n { code: 'BNB', name: 'Binance Coin', chains: ['BNB', 'BSC'], popular: false },\n { code: 'BNC', name: 'Bifrost Native Coin', chains: ['BNC', 'BNCPOLKA'], popular: false },\n { code: 'BOBA', name: 'Boba Network', chains: ['BOBA', 'ETH'], popular: false },\n { code: 'BORA', name: 'Bora', chains: ['KLAY'], popular: false },\n { code: 'BRETT', name: 'Brett', chains: ['BASE'], popular: false },\n { code: 'BSX', name: 'Basilisk', chains: ['BSX'], popular: false },\n { code: 'BZR', name: 'Bazaars', chains: ['ETH'], popular: false },\n { code: 'CAGA', name: 'Crypto Asset Governance Alliance', chains: ['ETH'], popular: false },\n { code: 'CAKE', name: 'PancakeSwap', chains: ['BSC'], popular: false },\n { code: 'CAPS', name: 'Caps', chains: ['TERNOA'], popular: false },\n { code: 'CELO', name: 'Celo', chains: ['CELO'], popular: false },\n { code: 'CHZ', name: 'Chiliz', chains: ['CHZ', 'BNB', 'ETH'], popular: false },\n { code: 'C98', name: 'Coin98', chains: ['VIC'], popular: false },\n { code: 'CCD', name: 'Concordium', chains: ['CCD'], popular: false },\n { code: 'COMP', name: 'Compound', chains: ['ETH', 'BSC'], popular: false },\n { code: 'COREUM', name: 'Coreum', chains: ['COREUM', 'XRP'], popular: false },\n { code: 'CRO', name: 'Cronos', chains: ['CRO'], popular: false },\n { code: 'CUSD', name: 'Celo Dollar', chains: ['CELO'], popular: false },\n { code: 'CVC', name: 'Civic', chains: ['ETH'], popular: false },\n { code: 'DAI', name: 'Dai', chains: ['ETH', 'BASE', 'MATIC'], popular: false },\n { code: 'DINGO', name: 'Dingocoin', chains: ['DINGO'], popular: false },\n { code: 'EGLD', name: 'MultiversX', chains: ['EGLD'], popular: false },\n { code: 'EMBER', name: 'Ember Sword', chains: ['MNT'], popular: false },\n { code: 'EOS', name: 'EOS', chains: ['EOS'], popular: false },\n { code: 'ERG', name: 'Ergo', chains: ['ERG'], popular: false },\n { code: 'ETC', name: 'Ethereum Classic', chains: ['ETC', 'BSC'], popular: false },\n { code: 'EUR', name: 'EURC', chains: ['BASE'], popular: false },\n { code: 'EUROC', name: 'Euro Coin', chains: ['ETH'], popular: false },\n { code: 'EURQ', name: 'Quantoz EURQ', chains: ['ETH'], popular: false },\n { code: 'EURR', name: 'StablR EUR', chains: ['ETH'], popular: false },\n { code: 'EUSD', name: 'Electronic USD', chains: ['MOB'], popular: false },\n { code: 'EXIT', name: 'EXIT - Designer Token', chains: ['BSC'], popular: false },\n { code: 'FDUSD', name: 'First Digital USD', chains: ['SUI'], popular: false },\n { code: 'FIL', name: 'Filecoin', chains: ['FIL', 'BSC'], popular: false },\n { code: 'FLOW', name: 'Flow', chains: ['FLOW'], popular: false },\n { code: 'FLR', name: 'Flare', chains: ['FLR'], popular: false },\n { code: 'FLUX', name: 'Flux', chains: ['FLUX'], popular: false },\n { code: 'FTM', name: 'Fantom', chains: ['FTM', 'ETH', 'BSC'], popular: false },\n { code: 'GALA', name: 'Gala', chains: ['GALA'], popular: false },\n { code: 'GLMR', name: 'Moonbeam', chains: ['GLMR'], popular: false },\n { code: 'GMX', name: 'GMX', chains: ['ARB'], popular: false },\n { code: 'GNUS', name: 'Genius AI', chains: ['ETH'], popular: false },\n { code: 'GRT', name: 'The Graph', chains: ['ETH', 'ARB'], popular: false },\n { code: 'GUN', name: 'Gunz', chains: ['GUNZ'], popular: false },\n { code: 'HBAR', name: 'Hedera', chains: ['HBAR'], popular: false },\n { code: 'HDX', name: 'HydraDX', chains: ['HDX'], popular: false },\n { code: 'HNT', name: 'Helium', chains: ['HNT'], popular: false },\n { code: 'HTP', name: 'HowToPay', chains: ['BSC'], popular: false },\n { code: 'HVLO', name: 'Hivello', chains: ['SOL'], popular: false },\n { code: 'ICP', name: 'Internet Computer', chains: ['ICP'], popular: false },\n { code: 'IMX', name: 'Immutable X', chains: ['ETH'], popular: false },\n { code: 'INIT', name: 'Initia', chains: ['INIT'], popular: false },\n { code: 'INJ', name: 'Injective', chains: ['INJ'], popular: false },\n { code: 'INTR', name: 'Interlay', chains: ['INTR'], popular: false },\n { code: 'JAM', name: 'Jam Tune.FM', chains: ['HBAR'], popular: false },\n { code: 'KAG', name: 'Silver', chains: ['KINESIS'], popular: false },\n { code: 'KAIA', name: 'Kaia', chains: ['KLAY'], popular: false },\n { code: 'KAR', name: 'Karura', chains: ['KAR'], popular: false },\n { code: 'KAU', name: 'Gold', chains: ['KINESIS'], popular: false },\n { code: 'KCS', name: 'KuCoin Token', chains: ['ETH', 'KCC'], popular: false },\n { code: 'KDA', name: 'Kadena', chains: ['KDA'], popular: false },\n { code: 'KILT', name: 'KILT', chains: ['KILT'], popular: false },\n { code: 'KINT', name: 'Kintsugi', chains: ['KINT'], popular: false },\n { code: 'KLV', name: 'Klever', chains: ['TRON'], popular: false },\n { code: 'KMD', name: 'Komodo', chains: ['KMD'], popular: false },\n { code: 'KSM', name: 'Kusama', chains: ['KSM'], popular: false },\n { code: 'KUB', name: 'Bitkub Coin', chains: ['BITKUB'], popular: false },\n { code: 'LOOKS', name: 'LooksRare', chains: ['ETH'], popular: false },\n { code: 'LRC', name: 'Loopring', chains: ['ETH', 'LRC'], popular: false },\n { code: 'LSK', name: 'Lisk', chains: ['LSK'], popular: false },\n { code: 'MANA', name: 'Decentraland', chains: ['ETH'], popular: false },\n { code: 'MBX', name: 'Marblex', chains: ['IMMUTABLE_ZKEVM', 'KLAY'], popular: false },\n { code: 'MELANIA', name: 'Melania', chains: ['SOL'], popular: false },\n { code: 'METAMASKUSD', name: 'Metamask USD', chains: ['ETH', 'LINEA'], popular: false },\n { code: 'METIS', name: 'Metis', chains: ['METIS'], popular: false },\n { code: 'MEZOUSD', name: 'MUSD', chains: ['ETH', 'MEZO'], popular: false },\n { code: 'MKR', name: 'Maker', chains: ['ETH', 'BSC'], popular: false },\n { code: 'MNEE', name: 'MNEE', chains: ['BSV', 'ETH'], popular: false },\n { code: 'MNT', name: 'Mantle', chains: ['ETH', 'MNT'], popular: false },\n { code: 'MOB', name: 'MobileCoin', chains: ['MOB'], popular: false },\n { code: 'MON', name: 'Monad', chains: ['MONAD'], popular: false },\n { code: 'MOVE', name: 'Movement', chains: ['MOVE'], popular: false },\n { code: 'MOVR', name: 'Moonriver', chains: ['MOVR'], popular: false },\n { code: 'MYTH', name: 'Myth', chains: ['MYTH'], popular: false },\n { code: 'NEAR', name: 'NEAR Protocol', chains: ['NEAR', 'BSC'], popular: false },\n { code: 'NEIRO', name: 'NEIRO Ethereum', chains: ['ETH'], popular: false },\n { code: 'OAS', name: 'Oasys', chains: ['OAS'], popular: false },\n { code: 'OMG', name: 'OmiseGo', chains: ['ETH'], popular: false },\n { code: 'OMUSD', name: 'Open Money USD', chains: ['ETH'], popular: false },\n { code: 'ONE', name: 'Harmony', chains: ['ONE', 'BNB', 'ETH'], popular: false },\n { code: 'OP', name: 'Optimism', chains: ['OPTIMISM'], popular: false },\n { code: 'ORDER', name: 'Orderly Network', chains: ['ETH'], popular: false },\n { code: 'PEAQ', name: 'Peaq', chains: ['PEAQ_EVM'], popular: false },\n { code: 'PEN', name: 'Pendulum', chains: ['PEN'], popular: false },\n { code: 'PERC', name: 'Perion', chains: ['ETH'], popular: false },\n { code: 'PI', name: 'Pi', chains: ['PI'], popular: false },\n { code: 'PLMC', name: 'Polimec', chains: ['PLMC'], popular: false },\n { code: 'POL', name: 'Polygon', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'POLYX', name: 'Polymesh', chains: ['POLYX'], popular: false },\n { code: 'PROPC', name: 'Propchain', chains: ['ETH'], popular: false },\n { code: 'PSTAKE', name: 'pSTAKE Finance', chains: ['ETH'], popular: false },\n { code: 'Q', name: 'QuantumCoin', chains: ['Q'], popular: false },\n { code: 'QRDO', name: 'Qredo', chains: ['ETH'], popular: false },\n { code: 'QRL', name: 'Quantum Resistant Ledger', chains: ['QRL'], popular: false },\n { code: 'QUBIC', name: 'QUBIC', chains: ['QUBIC'], popular: false },\n { code: 'RBX', name: 'ReserveBlock', chains: ['RBX'], popular: false },\n { code: 'REVU', name: 'Revuto', chains: ['ADA'], popular: false },\n { code: 'RITE', name: 'Ritestream', chains: ['BSC'], popular: false },\n { code: 'RLUSD', name: 'Ripple USD', chains: ['ETH'], popular: false },\n { code: 'RON', name: 'Ronin', chains: ['RON'], popular: false },\n { code: 'RUNE', name: 'THORChain', chains: ['THORCHAIN'], popular: false },\n { code: 'S', name: 'Sonic', chains: ['S'], popular: false },\n { code: 'SAND', name: 'The Sandbox', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SEI', name: 'SEI', chains: ['SEI_EVM'], popular: false },\n { code: 'SNX', name: 'Synthetix', chains: ['ETH'], popular: false },\n { code: 'SOIL', name: 'Sun Minimeal', chains: ['PLS'], popular: false },\n { code: 'SOLO', name: 'Sologenic', chains: ['XRP'], popular: false },\n { code: 'SOMI', name: 'Somnia', chains: ['SOMI'], popular: false },\n { code: 'STRK', name: 'Starknet', chains: ['STARK'], popular: false },\n { code: 'SUI', name: 'Sui', chains: ['SUI'], popular: false },\n { code: 'SUPR', name: 'SuperDapp', chains: ['ROLLUX'], popular: false },\n { code: 'SUPRA', name: 'Supra', chains: ['SUPRA'], popular: false },\n { code: 'SUSHI', name: 'SushiSwap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SYS', name: 'Syscoin', chains: ['ROLLUX'], popular: false },\n { code: 'TBTC', name: 'tBTC', chains: ['SUI', 'STARK'], popular: false },\n { code: 'TON', name: 'Toncoin', chains: ['TON'], popular: false },\n { code: 'TRUMP', name: 'TRUMP', chains: ['SOL'], popular: false },\n { code: 'TRX', name: 'Tron', chains: ['TRON', 'BSC'], popular: false },\n { code: 'TWT', name: 'Trust Wallet Token', chains: ['BSC'], popular: false },\n { code: 'UNI', name: 'Uniswap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'URANIUM', name: 'Uranium', chains: ['ETHERLINK'], popular: false },\n { code: 'USD0', name: 'Usual USD', chains: ['ETH'], popular: false },\n { code: 'USD1', name: 'World Liberty Financial USD', chains: ['SOL'], popular: false },\n { code: 'USDE', name: 'Ethena USDe', chains: ['ETH'], popular: false },\n { code: 'USDP', name: 'Pax Dollar', chains: ['ETH'], popular: false },\n { code: 'USDQ', name: 'Quantoz USDQ', chains: ['ETH'], popular: false },\n { code: 'USDR', name: 'StablR USD', chains: ['ETH'], popular: false },\n { code: 'USDT0', name: 'USDT0', chains: ['INK'], popular: false },\n { code: 'VFX', name: 'VerifiedX', chains: ['VERIFIEDX'], popular: false },\n { code: 'VERSE', name: 'Verse', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'VIC', name: 'Viction', chains: ['VIC'], popular: false },\n { code: 'WAL', name: 'Walrus', chains: ['SUI'], popular: false },\n { code: 'WAVES', name: 'Waves', chains: ['WAVES'], popular: false },\n { code: 'WAXP', name: 'WAX', chains: ['WAX'], popular: false },\n { code: 'WBTC', name: 'Wrapped Bitcoin', chains: ['ETH', 'STARK'], popular: false },\n { code: 'WETH', name: 'Wrapped Ether', chains: ['ETHERLINK'], popular: false },\n { code: 'WLD', name: 'Worldcoin', chains: ['WLD'], popular: false },\n { code: 'WLFI', name: 'World Liberty Financial', chains: ['ETH'], popular: false },\n { code: 'WOLF', name: 'LandWolf', chains: ['ETH'], popular: false },\n { code: 'WOMBAT', name: 'Wombat', chains: ['MATIC'], popular: false },\n { code: 'XCH', name: 'Chia', chains: ['XCH'], popular: false },\n { code: 'XLM', name: 'Stellar Lumens', chains: ['XLM', 'BSC'], popular: false },\n { code: 'XPRT', name: 'Persistence', chains: ['XPRT'], popular: false },\n { code: 'XTZ', name: 'Tezos', chains: ['XTZ', 'ETHERLINK'], popular: false },\n { code: 'YFI', name: 'yearn.finance', chains: ['ETH'], popular: false },\n { code: 'ZBU', name: 'Zeebu', chains: ['BSC'], popular: false },\n { code: 'ZEC', name: 'ZCash', chains: ['ZEC'], popular: false },\n { code: 'ZCHF', name: 'Frankencoin', chains: ['ETH'], popular: false },\n { code: 'ZETA', name: 'Zeta', chains: ['ETH', 'ZETACHAIN'], popular: false },\n { code: 'ZTG', name: 'Zeitgeist', chains: ['ZTG'], popular: false },\n];\n\n// ── Crypto code -> name lookup (for API data that only has codes) ──\nexport const CRYPTO_NAMES: Record<string, string> = Object.fromEntries(\n CRYPTO_CURRENCIES.map(c => [c.code, c.name])\n);\n\n// ── Fiat currency code -> ISO country code for flag lookup ──\n\nexport const FIAT_TO_COUNTRY: Record<string, string> = {\n AED: 'ae',\n ALL: 'al',\n ARS: 'ar',\n AUD: 'au',\n BRL: 'br',\n CAD: 'ca',\n CHF: 'ch',\n CLP: 'cl',\n CZK: 'cz',\n DKK: 'dk',\n EUR: 'eu',\n GBP: 'gb',\n HKD: 'hk',\n IDR: 'id',\n INR: 'in',\n JPY: 'jp',\n KRW: 'kr',\n MXN: 'mx',\n NGN: 'ng',\n NOK: 'no',\n NZD: 'nz',\n PHP: 'ph',\n PLN: 'pl',\n QAR: 'qa',\n SAR: 'sa',\n SEK: 'se',\n SGD: 'sg',\n THB: 'th',\n TRY: 'tr',\n TWD: 'tw',\n USD: 'us',\n VND: 'vn',\n ZAR: 'za',\n};\n\n// ── Icon URL helpers ──\n\n/**\n * Get the icon URL for a crypto ticker.\n * Icons are stored as SVGs in /crypto-icons/{ticker}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getCryptoIconUrl(ticker: string, baseUrl = ''): string {\n return `${baseUrl}/crypto-icons/${ticker.toLowerCase()}.svg`;\n}\n\n/**\n * Get the flag URL for a fiat currency code.\n * Flags are stored as SVGs in /flags/{country_code}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getFiatFlagUrl(currencyCode: string, baseUrl = ''): string {\n const country = FIAT_TO_COUNTRY[currencyCode] || 'us';\n return `${baseUrl}/flags/${country}.svg`;\n}\n\n/**\n * Get the icon URL for a blockchain/chain.\n * Uses the chain's native token icon.\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\n/** Lookup a chain in BLOCKCHAINS, handling canonical ids, legacy codes, and separator differences */\nexport function getChainInfo(chainCode: string): BlockchainInfo | undefined {\n return BLOCKCHAINS[chainCode]\n || BLOCKCHAINS[chainCode.toLowerCase()]\n || BLOCKCHAINS[chainCode.toUpperCase()]\n || BLOCKCHAINS[chainCode.toUpperCase().replace(/-/g, '_')]\n || BLOCKCHAINS[chainCode.toLowerCase().replace(/-/g, '_')];\n}\n\nexport function getChainIconUrl(chainCode: string, baseUrl = ''): string {\n const chain = getChainInfo(chainCode);\n if (chain) return `${baseUrl}/crypto-icons/${chain.icon}.svg`;\n return `${baseUrl}/crypto-icons/${chainCode.toLowerCase()}.svg`;\n}\n\n// ── Fiat currencies ──\n\nexport const FIAT_CURRENCIES: FiatCurrency[] = [\n { code: 'ALL', name: 'Albania Lek' },\n { code: 'ARS', name: 'Argentina Peso' },\n { code: 'AUD', name: 'Australian Dollar' },\n { code: 'BRL', name: 'Brazilian Real' },\n { code: 'CAD', name: 'Canadian Dollar' },\n { code: 'EUR', name: 'Euro' },\n { code: 'GBP', name: 'British Pound' },\n { code: 'JPY', name: 'Japanese Yen' },\n { code: 'USD', name: 'US Dollar' },\n { code: 'CHF', name: 'Swiss Franc' },\n { code: 'MXN', name: 'Mexican Peso' },\n { code: 'INR', name: 'Indian Rupee' },\n];\n\n// ── Skin presets ──\n\nexport const SKINS: Skin[] = [\n { id: 'blue', name: 'Blue', accent: '#0077FF' },\n { id: 'violet', name: 'Violet', accent: '#7C3AED' },\n { id: 'green', name: 'Green', accent: '#10B981' },\n { id: 'orange', name: 'Orange', accent: '#F59E0B' },\n { id: 'rose', name: 'Rose', accent: '#F43F5E' },\n { id: 'mono', name: 'Mono', accent: null },\n];\n\n// ── Mock rates ──\n\nexport const MOCK_RATES: Record<string, Record<string, number>> = {\n USDC: { USD: 0.9962, EUR: 1.0814, GBP: 1.2573, JPY: 0.00667, CAD: 0.7198, AUD: 0.6384, BRL: 0.1726, CHF: 1.1306, MXN: 0.0487, INR: 0.01187, ARS: 0.000855, ALL: 0.01058 },\n USDT: { USD: 0.9958, EUR: 1.0810, GBP: 1.2568, JPY: 0.00666, CAD: 0.7194, AUD: 0.6380, BRL: 0.1724, CHF: 1.1301, MXN: 0.0486, INR: 0.01186, ARS: 0.000854, ALL: 0.01057 },\n BTC: { USD: 0.0000104, EUR: 0.00001129, GBP: 0.00001313, JPY: 0.0000000696, CAD: 0.00000751, AUD: 0.00000666, BRL: 0.0000018, CHF: 0.0000118, MXN: 0.000000508, INR: 0.000000124, ARS: 0.00000000892, ALL: 0.00000011 },\n ETH: { USD: 0.000316, EUR: 0.000343, GBP: 0.000399, JPY: 0.00000211, CAD: 0.000228, AUD: 0.000202, BRL: 0.0000547, CHF: 0.000358, MXN: 0.0000154, INR: 0.00000376, ARS: 0.000000271, ALL: 0.00000335 },\n SOL: { USD: 0.00424, EUR: 0.004607, GBP: 0.005356, JPY: 0.0000284, CAD: 0.003063, AUD: 0.002716, BRL: 0.000734, CHF: 0.004812, MXN: 0.000207, INR: 0.0000505, ARS: 0.00000364, ALL: 0.000045 },\n XRP: { USD: 0.4081, EUR: 0.4432, GBP: 0.5153, JPY: 0.00273, CAD: 0.2948, AUD: 0.2614, BRL: 0.0707, CHF: 0.4630, MXN: 0.01992, INR: 0.00486, ARS: 0.000350, ALL: 0.00433 },\n DOGE: { USD: 3.896, EUR: 4.232, GBP: 4.920, JPY: 0.02607, CAD: 2.815, AUD: 2.496, BRL: 0.6750, CHF: 4.421, MXN: 0.1902, INR: 0.04641, ARS: 0.003345, ALL: 0.04134 },\n ADA: { USD: 1.333, EUR: 1.448, GBP: 1.683, JPY: 0.00892, CAD: 0.963, AUD: 0.854, BRL: 0.2309, CHF: 1.512, MXN: 0.0651, INR: 0.01588, ARS: 0.001145, ALL: 0.01414 },\n};\n\n// ── Stablecoin detection ──\n\nconst STABLECOINS = new Set([\n 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'FDUSD', 'PYUSD',\n 'USDP', 'USDE', 'USDQ', 'USDR', 'USDT0', 'RLUSD',\n 'CUSD', 'EUSD', 'OMUSD', 'MEZOUSD', 'METAMASKUSD',\n 'USD0', 'USD1', 'AUDD', 'EUROC', 'EURQ', 'EURR', 'ZCHF',\n]);\n\n/** Check if a crypto code is a known stablecoin */\nexport function isStablecoin(code: string): boolean {\n return STABLECOINS.has(code.toUpperCase());\n}\n\n// ── Helper functions ──\n\nexport function getMockRate(crypto: string, fiat: string): number {\n return MOCK_RATES[crypto]?.[fiat] ?? MOCK_RATES['USDC']?.[fiat] ?? 1;\n}\n\nexport function parseAmount(str: string): number {\n return parseFloat(str.replace(/,/g, '')) || 0;\n}\n\nexport function formatOutput(num: number): string {\n if (num === 0) return '0';\n if (num >= 1000) return num.toLocaleString('en-US', { maximumFractionDigits: 2 });\n if (num >= 1) return num.toFixed(2);\n if (num >= 0.01) return num.toFixed(4);\n const s = num.toPrecision(4);\n return parseFloat(s).toString();\n}\n\nexport const isValidHex = (str: string): boolean => /^#([0-9A-Fa-f]{3}){1,2}$/.test(str);\n\n// ── Validation constants ──\n\nexport const MIN_FIAT_AMOUNT = 10;\nexport const MIN_CRYPTO_AMOUNT = 0.0001;\n\n// ── Pre-built flat list of every crypto+chain combination ──\n\nexport const CRYPTO_CHAIN_COMBOS: CryptoChainCombo[] = (() => {\n const list: CryptoChainCombo[] = [];\n for (const c of CRYPTO_CURRENCIES) {\n for (const chain of c.chains) {\n list.push({ code: c.code, name: c.name, chain, popular: c.popular });\n }\n }\n return list;\n})();\n","import type React from 'react';\nimport { useState, useCallback, useRef } from 'react';\nimport { getCryptoIconUrl, getFiatFlagUrl } from '../../data/cryptoData';\n\n/* ───────────── icon helpers ───────────── */\n\n/** Lazy-loaded image with placeholder and fallback */\nfunction LazyIcon({\n src,\n alt,\n size,\n className = '',\n background,\n}: {\n src: string;\n alt: string;\n size: number;\n className?: string;\n /** Background color for transparent icons */\n background?: string;\n}) {\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState(false);\n const currentSrc = useRef(src);\n\n // Reset state when src changes, using ref to avoid race with onLoad\n if (currentSrc.current !== src) {\n currentSrc.current = src;\n setLoaded(false);\n setError(false);\n }\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setError(true), []);\n\n return (\n <div\n className={`relative rounded-full shrink-0 ${className}`}\n style={{ width: size, height: size, background }}\n >\n {/* Placeholder while loading */}\n {!loaded && !error && (\n <div\n className=\"absolute inset-0 rounded-full animate-pulse\"\n style={{ background: 'var(--t-pill-bg, #333)' }}\n />\n )}\n {/* Fallback for broken images */}\n {error ? (\n <div\n className=\"absolute inset-0 rounded-full flex items-center justify-center font-bold\"\n style={{\n background: 'var(--t-pill-bg, #333)',\n color: 'var(--t-text-muted)',\n fontSize: Math.max(8, size * 0.35),\n }}\n >\n {alt.slice(0, 3)}\n </div>\n ) : (\n <img\n src={src}\n alt={alt}\n width={size}\n height={size}\n onLoad={handleLoad}\n onError={handleError}\n className={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n style={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n />\n )}\n </div>\n );\n}\n\nexport function CryptoIcon({ ticker, size = 32, baseUrl = '' }: { ticker: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getCryptoIconUrl(ticker, baseUrl)}\n alt={ticker}\n size={size}\n background=\"#ffffff\"\n />\n );\n}\n\nexport function FiatFlag({ currencyCode, size = 16, baseUrl = '' }: { currencyCode: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getFiatFlagUrl(currencyCode, baseUrl)}\n alt={currencyCode}\n size={size}\n />\n );\n}\n\nexport function GenericCoinIcon({ size = 32, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill={color} />\n <circle cx=\"16\" cy=\"16\" r=\"8\" stroke=\"white\" strokeWidth=\"1.5\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function BankIcon({ size = 24 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-card-icon-bg)' }}\n >\n <svg width={size * 0.6} height={size * 0.58} viewBox=\"0 0 25 24\" fill=\"none\">\n <path d=\"M23.292 7.5H1.70801L12.5 0.592773L23.292 7.5Z\" stroke=\"var(--t-card-icon-stroke)\" strokeWidth=\"1\" />\n <rect x=\"3\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"9\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"15\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"21\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect y=\"23\" width=\"25\" height=\"1\" fill=\"var(--t-card-icon-stroke)\" />\n </svg>\n </div>\n );\n}\n\nexport function RevolutIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center text-white font-semibold shrink-0\"\n style={{ width: size, height: size, backgroundColor: '#333', fontSize: size * 0.45 }}\n >\n R\n </div>\n );\n}\n\nexport function ApplePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#000', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.288} viewBox=\"0 0 50 20\" fill=\"none\">\n <path\n d=\"M9.14529 2.57901C8.55528 3.25398 7.61984 3.7887 6.68351 3.70976C6.56186 2.7971 7.02999 1.82591 7.55883 1.23105C8.14846 0.535892 9.166 0.0403839 9.9999 0C10.1017 0.952461 9.71518 1.88488 9.14529 2.57901ZM9.98932 3.88805C10.5171 3.92756 12.0384 4.08587 13.0125 5.48951C12.9312 5.54899 11.2066 6.51813 11.2267 8.55562C11.247 10.9883 13.4176 11.7995 13.4379 11.8193C13.4176 11.8787 13.0939 12.9667 12.3023 14.0939C11.6126 15.083 10.902 16.052 9.76606 16.0717C8.67023 16.0915 8.30483 15.4389 7.04742 15.4389C5.78949 15.4389 5.38394 16.052 4.34875 16.0915C3.25329 16.1307 2.42185 15.0429 1.73195 14.054C0.310872 12.0564 -0.764097 8.41705 0.696758 5.96431C1.40722 4.73809 2.70553 3.96677 4.10507 3.94695C5.18064 3.92756 6.17501 4.63962 6.82446 4.63962C7.47376 4.63962 8.62918 3.80889 9.98932 3.88805ZM23.544 1.13133C26.4989 1.13133 28.5569 3.11593 28.5569 6.00514C28.5569 8.90473 26.4567 10.8997 23.4702 10.8997H20.1987V15.9694H17.8349V1.13133H23.544ZM20.1987 8.96648H22.9108C24.9692 8.96648 26.1402 7.88694 26.1402 6.01552C26.1402 4.14448 24.9688 3.07467 22.9212 3.07467H20.1987V8.96648ZM29.1434 12.8945C29.1434 10.9923 30.6314 9.90226 33.375 9.7378L36.3194 9.56295V8.74027C36.3194 7.53753 35.5071 6.87939 34.0613 6.87939C32.8683 6.87939 32.0028 7.47564 31.8242 8.39042H29.6919C29.7556 6.46802 31.6126 5.06972 34.1246 5.06972C36.8262 5.06972 38.5886 6.44746 38.5886 8.58634V15.969H36.4042V14.1901H36.3515C35.7287 15.3518 34.3565 16.0817 32.8683 16.0817C30.6734 16.0817 29.1434 14.8072 29.1434 12.8945ZM36.3195 11.9385V11.1054L33.6918 11.27C32.2138 11.3624 31.4442 11.897 31.4442 12.8325C31.4442 13.7375 32.2459 14.3238 33.5018 14.3238C35.1055 14.3238 36.3195 13.3262 36.3195 11.9385ZM40.597 19.9377V18.1592C40.7449 18.1794 41.1032 18.1999 41.2935 18.1999C42.3381 18.1999 42.9291 17.7688 43.288 16.6575L43.4992 15.9997L39.4992 5.20338H41.9686L44.7548 13.9638H44.8077L47.5936 5.20338H50L45.8524 16.5445C44.9024 19.1463 43.8155 20 41.515 20C41.3354 20 40.7549 19.9793 40.597 19.9377Z\"\n fill=\"white\"\n />\n </svg>\n </div>\n );\n}\n\nexport function GooglePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#3C4043', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.296} viewBox=\"0 0 51 21\" fill=\"none\">\n <path d=\"M50.9156 5.87122L44.6406 20.2837H42.6992L45.0289 15.2416L40.9009 5.87122H42.9451L45.929 13.0573H45.9689L48.8714 5.87122H50.9156Z\" fill=\"white\" />\n <path d=\"M39.3906 6.65832C38.5866 5.91563 37.4895 5.54547 36.0995 5.54547C34.314 5.54547 32.9657 6.19816 32.0513 7.50532L33.7084 8.54664C34.3211 7.66089 35.1512 7.21951 36.2011 7.21951C36.8967 7.21951 37.5008 7.44661 38.0194 7.9023C38.538 8.35948 38.7964 8.91352 38.7964 9.5665V9.99507C38.0751 9.58796 37.1536 9.38381 36.0366 9.38381C34.7297 9.38381 33.6839 9.68959 32.8998 10.3023C32.1172 10.9151 31.7256 11.738 31.7256 12.7706C31.7256 13.8033 32.0969 14.5675 32.8396 15.2216C33.5808 15.8758 34.5065 16.2016 35.6092 16.2016C36.9033 16.2016 37.9389 15.6302 38.7147 14.4876H38.7976V15.8761H40.5944V9.70955C40.5944 8.4167 40.1944 7.39982 39.3903 6.65862L39.3906 6.65832ZM37.8665 13.6501C37.2451 14.2343 36.5424 14.5272 35.7511 14.5272C35.1926 14.5272 34.7068 14.3645 34.2913 14.0387C33.8741 13.7103 33.6673 13.3032 33.6673 12.8132C33.6673 12.2675 33.923 11.8134 34.4344 11.4462C34.9443 11.079 35.5815 10.8948 36.3442 10.8948C37.3926 10.8948 38.211 11.1249 38.7967 11.5889C38.7967 12.3775 38.4867 13.0645 37.8668 13.6501H37.8665Z\" fill=\"white\" />\n <path d=\"M30.4166 2.52282C29.5296 1.67999 28.4552 1.25739 27.1883 1.25739H22.2017V15.8758H24.0813V9.95362H27.188C28.4678 9.95362 29.5448 9.53936 30.4163 8.70815C31.3175 7.87962 31.7661 6.84397 31.7661 5.60565C31.7661 4.36733 31.3175 3.36744 30.4163 2.52312L30.4166 2.52282ZM29.0895 7.40248C28.598 7.90525 27.9781 8.15798 27.2297 8.15798H24.0816V3.05272H27.2297C27.9781 3.05272 28.5983 3.31141 29.0895 3.82849C29.5937 4.33276 29.845 4.92554 29.845 5.60535C29.845 6.28516 29.5934 6.8994 29.0895 7.40218V7.40248Z\" fill=\"white\" />\n <path d=\"M16.2663 11.4026C15.8887 12.6964 15.1901 13.9058 14.2131 14.8354C14.1815 14.8655 14.1496 14.895 14.1178 14.9245C14.116 14.9263 14.1148 14.9277 14.113 14.9292C13.1524 15.8144 11.9487 16.4295 10.6737 16.7272C10.6621 16.7302 10.6502 16.7329 10.6385 16.7356C10.2484 16.8241 9.85204 16.8888 9.45357 16.929C8.81668 16.9928 8.17293 16.9928 7.53723 16.9222C7.22102 16.8873 6.9063 16.8348 6.59546 16.7639C6.49293 16.7407 6.39101 16.7156 6.28938 16.6882C5.16759 16.3884 4.11256 15.8564 3.20476 15.1337C3.0018 14.971 2.80599 14.7987 2.61823 14.6184C2.61257 14.613 2.60721 14.6077 2.60154 14.6026C1.93962 13.9657 1.38081 13.22 0.956413 12.4034C0.938829 12.3691 0.921246 12.3352 0.90396 12.3009C0.717393 11.9319 0.559138 11.5493 0.429793 11.1574C0.364822 10.9618 0.307302 10.7634 0.257233 10.5631C0.226834 10.443 0.199117 10.3226 0.174678 10.2013C0.141299 10.0397 0.112986 9.87702 0.0894411 9.714C-0.0509314 8.75165 -0.0267907 7.76517 0.166929 6.81118C0.176168 6.76468 0.185705 6.71879 0.195838 6.6723C0.345748 5.97997 0.582981 5.31 0.903662 4.67698C1.53102 3.42525 2.48025 2.33983 3.62498 1.53514H3.62528C3.73704 1.45616 3.85029 1.38076 3.96533 1.30775C3.99424 1.28957 4.02345 1.27169 4.05206 1.25351C4.11018 1.21774 4.16889 1.18257 4.2276 1.148C4.34562 1.07945 4.46513 1.01329 4.58643 0.950111C4.64723 0.918519 4.70773 0.887822 4.76912 0.858018C5.0755 0.707811 5.39111 0.576975 5.71418 0.466108C5.77021 0.446438 5.82624 0.427961 5.88227 0.409781C5.96661 0.38266 6.05095 0.356731 6.13619 0.332292C6.19312 0.315603 6.25064 0.300106 6.30786 0.284906C6.36448 0.269707 6.4217 0.255401 6.47863 0.241393C6.51111 0.233346 6.5433 0.225895 6.57579 0.218146C6.62764 0.206225 6.6792 0.194901 6.73136 0.183874C6.73464 0.183278 6.73762 0.182681 6.7406 0.181787C6.90481 0.147216 7.06992 0.117711 7.23593 0.093273C7.25262 0.0905907 7.2693 0.088205 7.28629 0.0861187C8.67482 -0.111774 10.114 0.0309834 11.4319 0.518561C12.4443 0.889311 13.3712 1.47882 14.1651 2.21048C13.899 2.4957 13.6138 2.76661 13.3378 3.04705C12.8151 3.56533 12.2971 4.08807 11.774 4.60605C11.7734 4.60545 11.7723 4.60486 11.7717 4.60367L11.7645 4.61082C11.2465 4.11639 10.6192 3.74564 9.9346 3.53642C9.1314 3.29412 8.26652 3.26044 7.44425 3.43658C7.14741 3.49946 6.85772 3.59066 6.57847 3.70779C6.57519 3.70898 6.57221 3.71047 6.56893 3.71166C5.95231 3.97393 5.38843 4.36047 4.92022 4.83881C4.3638 5.39941 3.94089 6.09352 3.68906 6.83979C3.68727 6.8386 3.68548 6.83711 3.68369 6.83591C3.31831 7.89571 3.32308 9.07889 3.68399 10.1384C3.68191 10.1402 3.67982 10.1417 3.67773 10.1435C3.67833 10.1446 3.67863 10.1458 3.67893 10.147C3.68071 10.1461 3.6822 10.1446 3.68399 10.1435C4.03567 11.1892 4.72501 12.1158 5.62835 12.7482C6.19371 13.1473 6.84014 13.428 7.51995 13.5654C8.18545 13.6987 8.87927 13.6844 9.54477 13.5705C10.2103 13.4564 10.8519 13.209 11.4128 12.8338C11.4128 12.8338 11.413 12.834 11.4134 12.8344C11.4164 12.8326 11.4194 12.8308 11.4221 12.8287C12.3081 12.2294 12.9301 11.2691 13.1095 10.2147H8.48467V6.90178H8.48944V6.89701H16.4797C16.7458 8.38955 16.6889 9.94378 16.2657 11.4029L16.2663 11.4026Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PayPalIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#003087' }}\n >\n <span className=\"text-white font-bold\" style={{ fontSize: size * 0.38 }}>P</span>\n </div>\n );\n}\n\nexport function VisaIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#1A1F71', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.234} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function MastercardIcon({ size = 32 }: { size?: number }) {\n const s = size * 0.8;\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <svg width={s} height={s * 0.625} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n );\n}\n\nexport function CardIcon({ size = 32 }: { size?: number }) {\n const markW = size * 0.56;\n const markH = markW * 0.65;\n const r = Math.max(2, markW * 0.1);\n const overlap = markW * 0.2;\n return (\n <div className=\"flex items-center justify-center shrink-0\" style={{ width: size, height: size }}>\n {/* Visa mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#1A1F71',\n borderRadius: r,\n position: 'relative',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width={markW * 0.7} height={markH * 0.35} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n {/* Mastercard mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#252525',\n borderRadius: r,\n marginLeft: -overlap,\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <svg width={markH * 0.85} height={markH * 0.6} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n </div>\n );\n}\n\nexport function CoinifyIcon({ size = 18 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full bg-white flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <span className=\"text-black font-bold\" style={{ fontSize: size * 0.55 }}>C</span>\n </div>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\n <path d=\"M1 1L7 7L1 13\" stroke=\"var(--t-icon-stroke)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function MenuIcon({ onClick }: { onClick: () => void }) {\n return (\n <button onClick={onClick} className=\"hover:opacity-70 transition-opacity\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path\n d=\"M22.4004 12V4C22.4004 2.67452 21.3255 1.59961 20 1.59961H6.7998V14.4004H20V16H4V14.4004H5.2002V1.59961H4C2.67452 1.59961 1.59961 2.67452 1.59961 4V12C1.59961 13.3255 2.67452 14.4004 4 14.4004V16L3.79395 15.9951C1.68056 15.8879 0 14.14 0 12V4C0 1.79086 1.79086 6.44266e-08 4 0H20C22.2091 0 24 1.79086 24 4V12L23.9951 12.2061C23.8913 14.2512 22.2512 15.8913 20.2061 15.9951L20 16V14.4004C21.3255 14.4004 22.4004 13.3255 22.4004 12Z\"\n fill=\"var(--t-icon-stroke)\"\n />\n </svg>\n </button>\n );\n}\n\nexport function DarkModeIcon({ size = 40 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-surface)' }}\n >\n <svg width={size * 0.5} height={size * 0.5} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" />\n <path d=\"M10 2.5A7.5 7.5 0 0 1 10 17.5\" fill=\"var(--t-text)\" />\n </svg>\n </div>\n );\n}\n\nexport function getPaymentIcon(type: string, size = 32): React.ReactNode {\n switch (type) {\n case 'revolut': return <RevolutIcon size={size} />;\n case 'applepay': return <ApplePayIcon size={size} />;\n case 'card': return <CardIcon size={size} />;\n case 'googlepay': return <GooglePayIcon size={size} />;\n case 'paypal': return <PayPalIcon size={size} />;\n case 'bank': return <BankIcon size={size} />;\n case 'visa': return <VisaIcon size={size} />;\n case 'mastercard': return <MastercardIcon size={size} />;\n default: return <GenericCoinIcon size={size} />;\n }\n}\n","/**\n * PaymentMethodSelector\n * Inline row that opens a modal to choose a payment method.\n * Styled to match the exchange rate row in the form.\n */\n\nimport { useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { getPaymentIcon, GenericCoinIcon, ChevronDown } from './ui/icons';\n\n// Map Banxa payment-method IDs to icon keys used by getPaymentIcon\nconst ICON_KEY_MAP: Record<string, string> = {\n\t'debit-credit-card': 'card',\n\t'bank-transfer': 'bank',\n\t'ach-bank-transfer': 'bank',\n\t'payid-bank-transfer': 'bank',\n\t'sepa-bank-transfer': 'bank',\n\tsepa: 'bank',\n\t'apple-pay': 'applepay',\n\t'google-pay': 'googlepay',\n\tpaypal: 'paypal',\n\trevolut: 'revolut',\n};\n\nconst SHORT_NAME_MAP: Record<string, string> = {\n\t'debit-credit-card': 'Card',\n\t'bank-transfer': 'Bank Transfer',\n\t'ach-bank-transfer': 'ACH',\n\t'apple-pay': 'Apple Pay',\n\t'google-pay': 'Google Pay',\n\t'payid-bank-transfer': 'PayID',\n\tpaypal: 'PayPal',\n\trevolut: 'Revolut',\n};\n\nexport function getMethodDisplayName(id: string, fullName: string): string {\n\treturn SHORT_NAME_MAP[id] || fullName;\n}\n\nexport function getMethodIcon(methodId: string, icon?: string, size = 24): React.ReactNode {\n\tconst iconKey = ICON_KEY_MAP[methodId];\n\tif (iconKey) return getPaymentIcon(iconKey, size);\n\tif (icon) return <img src={icon} alt=\"\" width={size} height={size} style={{ borderRadius: '50%' }} />;\n\treturn <GenericCoinIcon size={size} />;\n}\n\nexport interface PaymentMethodSelectorProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonOpenModal: () => void;\n\tfiatCurrency: string;\n}\n\nexport function PaymentMethodSelector({\n\tmethods,\n\tselectedId,\n\tonOpenModal,\n\tfiatCurrency,\n}: PaymentMethodSelectorProps) {\n\tconst filtered = useMemo(\n\t\t() => methods.filter((m) => m.supportedFiats.includes(fiatCurrency)),\n\t\t[methods, fiatCurrency]\n\t);\n\n\tconst selected = filtered.find((m) => m.id === selectedId) || filtered[0];\n\n\tif (filtered.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center justify-between px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\tNo payment methods available for {fiatCurrency}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={0}\n\t\t\t\tonClick={onOpenModal}\n\t\t\t\tonKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n\t\t\t\tclassName=\"flex items-center justify-between w-full px-[18px] transition-colors\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\theight: 42,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tPayment method\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n\t\t\t\t\t\t{selected && getMethodIcon(selected.id, selected.icon, 20)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t{selected ? getMethodDisplayName(selected.id, selected.name) : 'Select'}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown />\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Checkout Step Component\n * Displays provider checkout iframe or redirect button.\n * Iframe/widget checkouts render in a full-screen portal overlay.\n */\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRamp } from '../context/RampContext';\n\nexport interface CheckoutStepProps {\n\tclassName?: string;\n\tautoRedirect?: boolean;\n\tredirectDelay?: number;\n}\n\nexport function CheckoutStep({\n\tclassName = '',\n\tautoRedirect = false,\n\tredirectDelay = 3000,\n}: CheckoutStepProps) {\n\tconst { order, orderStatus, goToStep, goBack } = useRamp();\n\tconst [iframeLoaded, setIframeLoaded] = useState(false);\n\tconst [redirectCountdown, setRedirectCountdown] = useState<number | null>(null);\n\n\tconst isExpired = order?.checkout.expiresAt ? Date.now() > order.checkout.expiresAt : false;\n\n\t// Handle auto-redirect\n\tuseEffect(() => {\n\t\tif (order?.checkout.method === 'redirect' && autoRedirect && !isExpired) {\n\t\t\tsetRedirectCountdown(Math.ceil(redirectDelay / 1000));\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\twindow.location.href = order.checkout.url;\n\t\t\t}, redirectDelay);\n\n\t\t\tconst countdownInterval = setInterval(() => {\n\t\t\t\tsetRedirectCountdown((prev) => (prev && prev > 1 ? prev - 1 : null));\n\t\t\t}, 1000);\n\n\t\t\treturn () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclearInterval(countdownInterval);\n\t\t\t};\n\t\t}\n\t}, [order, autoRedirect, redirectDelay, isExpired]);\n\n\t// Navigate on terminal statuses\n\tuseEffect(() => {\n\t\tif (!orderStatus) return;\n\t\tif (orderStatus.status === 'completed') {\n\t\t\tgoToStep('complete');\n\t\t} else if (['failed', 'cancelled', 'expired'].includes(orderStatus.status)) {\n\t\t\tgoToStep('error');\n\t\t}\n\t}, [orderStatus?.status, goToStep]);\n\n\tif (!order) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<p className=\"text-[15px] mb-4\">No order found</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tGo Back\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isExpired) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t{/* <div className=\"text-[48px] mb-4\">⏰</div> */}\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">Checkout expired</h3>\n\t\t\t\t<p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tThe session has expired. Please try again.\n\t\t\t\t</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tStart over\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Iframe checkout — full-screen portal overlay\n\tif (order.checkout.method === 'iframe') {\n\t\tconst iframeSrc = order.checkout.url;\n\t\tconst allowAttr =\n\t\t\torder.checkout.allowedFeatures?.join('; ') ||\n\t\t\t'payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share';\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"nramp-spinner\" />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\tLoading checkout...\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={iframeSrc}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow={allowAttr}\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle=\"Provider Checkout\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\t// Redirect checkout\n\tif (order.checkout.method === 'redirect') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<div className=\"text-[48px] mb-4\">🔗</div>\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">Complete Payment</h3>\n\t\t\t\t<p className=\"text-[14px] mb-4\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tYou'll be redirected to {order.gateway} to complete your payment.\n\t\t\t\t</p>\n\t\t\t\t{redirectCountdown !== null && (\n\t\t\t\t\t<p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tRedirecting in {redirectCountdown}...\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t<a\n\t\t\t\t\thref={order.checkout.url}\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] flex items-center justify-center transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t\ttextDecoration: 'none',\n\t\t\t\t\t}}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t>\n\t\t\t\t\tContinue to {order.gateway}\n\t\t\t\t</a>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[14px] mt-2 transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Widget checkout — full-screen portal overlay\n\tif (order.checkout.method === 'widget' && order.widgetConfig) {\n\t\tconst widgetUrl = buildWidgetUrl(order.checkout.url, order.widgetConfig);\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"nramp-spinner\" />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\tLoading checkout...\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={widgetUrl}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow=\"payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share\"\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle=\"Payment Checkout\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t>\n\t\t\t<p className=\"text-[15px] mb-4\">Unknown checkout method</p>\n\t\t\t<button\n\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: 48,\n\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t}}\n\t\t\t\tonClick={goBack}\n\t\t\t>\n\t\t\t\tGo Back\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction buildWidgetUrl(baseUrl: string, config: Record<string, unknown>): string {\n\tconst url = new URL('/en/partner/widget', baseUrl);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value != null && value !== '') {\n\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\t}\n\treturn url.toString();\n}\n","/**\n * Processing Step Component\n * Shows order processing status with live updates.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useEffect } from 'react';\nimport { useRamp } from '../context/RampContext';\n\nexport interface ProcessingStepProps {\n className?: string;\n}\n\nexport function ProcessingStep({ className = '' }: ProcessingStepProps) {\n const { orderStatus, orderStatusLoading, goToStep } = useRamp();\n\n useEffect(() => {\n if (!orderStatus) return;\n if (orderStatus.status === 'completed') {\n goToStep('complete');\n } else if (['failed', 'cancelled', 'expired', 'refunded'].includes(orderStatus.status)) {\n goToStep('error');\n }\n }, [orderStatus?.status, goToStep]);\n\n const getStatusMessage = () => {\n if (!orderStatus) return 'Processing your order...';\n switch (orderStatus.status) {\n case 'pending':\n return 'Waiting for payment confirmation...';\n case 'processing':\n return 'Processing your transaction...';\n default:\n return 'Processing...';\n }\n };\n\n return (\n <div className={`flex flex-col items-center justify-center px-8 py-12 text-center ${className}`}>\n <div className=\"mb-6\">\n <div className=\"nramp-spinner-large nramp-spinner\" />\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-3\" style={{ color: 'var(--t-text)' }}>\n {getStatusMessage()}\n </h2>\n\n {orderStatusLoading && (\n <p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>Checking status...</p>\n )}\n\n {orderStatus && (\n <div className=\"w-full mt-6 text-left\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <DetailRow label=\"Order ID\" value={orderStatus.orderId} mono />\n <DetailRow label=\"Provider\" value={orderStatus.gateway} />\n <DetailRow\n label=\"Amount\"\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow\n label=\"Receiving\"\n value={`${orderStatus.cryptoAmount || '...'} ${orderStatus.cryptoCurrency}`}\n />\n <DetailRow label=\"Network\" value={orderStatus.network} />\n <DetailRow\n label=\"To Address\"\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n </div>\n )}\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n This usually takes a few minutes.\n </p>\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n You can safely close this page - we'll send you an email when complete.\n </p>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Complete Step Component\n * Success screen with transaction details.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\n\nexport interface CompleteStepProps {\n className?: string;\n explorerUrl?: string;\n onDone?: () => void;\n doneButtonText?: string;\n}\n\nexport function CompleteStep({\n className = '',\n explorerUrl,\n onDone,\n doneButtonText = 'Done',\n}: CompleteStepProps) {\n const { orderStatus, state, dispatch } = useRamp();\n const isSell = state.flowType === 'sell';\n\n const getExplorerUrl = () => {\n if (!orderStatus?.transactionHash) return null;\n if (!explorerUrl) {\n const defaultExplorers: Record<string, string> = {\n ethereum: 'https://etherscan.io/tx/{txHash}',\n polygon: 'https://polygonscan.com/tx/{txHash}',\n arbitrum: 'https://arbiscan.io/tx/{txHash}',\n optimism: 'https://optimistic.etherscan.io/tx/{txHash}',\n base: 'https://basescan.org/tx/{txHash}',\n bitcoin: 'https://mempool.space/tx/{txHash}',\n solana: 'https://solscan.io/tx/{txHash}',\n avalanche: 'https://snowtrace.io/tx/{txHash}',\n fantom: 'https://ftmscan.com/tx/{txHash}',\n };\n const baseUrl = defaultExplorers[state.network] || defaultExplorers.ethereum;\n return baseUrl.replace('{txHash}', orderStatus.transactionHash);\n }\n return explorerUrl.replace('{txHash}', orderStatus.transactionHash);\n };\n\n const handleDone = () => {\n if (onDone) {\n onDone();\n } else {\n dispatch({ type: 'RESET' });\n }\n };\n\n const explorerLink = getExplorerUrl();\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Success icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-success, #10b981)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {isSell ? 'Sale Complete!' : 'Purchase Complete!'}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {isSell\n ? `Your ${orderStatus?.fiatCurrency || state.fiatCurrency} payout is being processed.`\n : `Your ${orderStatus?.cryptoCurrency || state.cryptoCurrency} has been sent to your wallet.`\n }\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <DetailRow\n label={isSell ? 'Amount Sold' : 'Amount Received'}\n value={`${orderStatus.cryptoAmount} ${orderStatus.cryptoCurrency}`}\n highlight\n />\n <DetailRow\n label={isSell ? 'Payout Amount' : 'Amount Paid'}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow label=\"Network\" value={orderStatus.network} />\n <DetailRow\n label=\"Wallet\"\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n {orderStatus.transactionHash && (\n <DetailRow\n label=\"Transaction\"\n value={`${orderStatus.transactionHash.slice(0, 10)}...${orderStatus.transactionHash.slice(-8)}`}\n mono\n />\n )}\n <DetailRow label=\"Provider\" value={orderStatus.gateway} />\n <DetailRow label=\"Order ID\" value={orderStatus.orderId} mono />\n {orderStatus.completedAt && (\n <DetailRow\n label=\"Completed\"\n value={new Date(orderStatus.completedAt).toLocaleString()}\n />\n )}\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n {explorerLink && (\n <a\n href={explorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full font-semibold text-[14px] flex items-center justify-center transition-all\"\n style={{ height: 48, borderRadius: 5, background: 'var(--t-surface)', color: 'var(--t-text)', textDecoration: 'none' }}\n >\n View on Explorer\n </a>\n )}\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleDone}\n >\n {doneButtonText}\n </button>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Error Step Component\n * Displays error state with retry options.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\n\nexport interface ErrorStepProps {\n className?: string;\n onRetry?: () => void;\n supportEmail?: string;\n}\n\nexport function ErrorStep({\n className = '',\n onRetry,\n supportEmail = 'support@nowramp.com',\n}: ErrorStepProps) {\n const { state, orderStatus, dispatch, goToStep } = useRamp();\n const isSell = state.flowType === 'sell';\n\n const getErrorTitle = () => {\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed': return 'Payment Failed';\n case 'cancelled': return 'Order Cancelled';\n case 'expired': return 'Order Expired';\n case 'refunded': return 'Order Refunded';\n default: return 'Something Went Wrong';\n }\n }\n return 'Something Went Wrong';\n };\n\n const getErrorMessage = () => {\n if (state.errorMessage) return state.errorMessage;\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed':\n return isSell\n ? 'Your sale could not be processed. Please try again.'\n : 'Your payment could not be processed. Please try again or use a different payment method.';\n case 'cancelled':\n return isSell\n ? 'Your sale was cancelled. No crypto was transferred.'\n : 'Your order was cancelled. No payment was processed.';\n case 'expired':\n return isSell\n ? 'Your order has expired. Please start a new sale.'\n : 'Your order has expired. Please start a new purchase.';\n case 'refunded':\n return isSell\n ? 'Your crypto has been returned. The funds should appear in your wallet shortly.'\n : 'Your payment has been refunded. The funds should appear in your account within 5-10 business days.';\n default:\n return 'An unexpected error occurred. Please try again.';\n }\n }\n return 'An unexpected error occurred. Please try again.';\n };\n\n const handleRetry = () => {\n dispatch({ type: 'CLEAR_ERROR' });\n if (onRetry) {\n onRetry();\n } else {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n }\n };\n\n const handleStartOver = () => {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n };\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Error icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-error, #EF4444)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {getErrorTitle()}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {getErrorMessage()}\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <div className=\"flex justify-between items-center py-2\">\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>Order ID</span>\n <span className=\"text-[13px] font-medium font-mono\" style={{ color: 'var(--t-text)' }}>\n {orderStatus.orderId}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleRetry}\n >\n Try Again\n </button>\n <button\n className=\"w-full font-semibold text-[14px] transition-all\"\n style={{ height: 48, borderRadius: 5, background: 'var(--t-surface)', color: 'var(--t-text)' }}\n onClick={handleStartOver}\n >\n Start Over\n </button>\n </div>\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n Need help? Contact{' '}\n <a\n href={`mailto:${supportEmail}`}\n className=\"underline\"\n style={{ color: 'var(--t-accent)' }}\n >\n {supportEmail}\n </a>\n </p>\n {orderStatus && (\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n Reference: {orderStatus.orderId}\n </p>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Confirm Step Component\n * Shown when all fields are pre-configured (session mode).\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useState } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { isStablecoin, formatOutput } from '../data/cryptoData';\n\nexport interface ConfirmStepProps {\n className?: string;\n stablecoinParity?: boolean;\n partnerName?: string;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-6)}`;\n}\n\nexport function ConfirmStep({ className = '', stablecoinParity, partnerName }: ConfirmStepProps) {\n const {\n config,\n configLoading,\n state,\n defaultGateway,\n quotes,\n fetchQuotes,\n createOrder,\n orderLoading,\n } = useRamp();\n\n const isSell = state.flowType === 'sell';\n const [error, setError] = useState<string | null>(null);\n\n const gatewayInfo = config?.gateways.find((g) => g.id === defaultGateway);\n\n // Parity display for confirm step: stablecoin equivalent of fiat (partner absorbs fees)\n const exchangeRate = quotes?.bestQuote?.exchangeRate ? parseFloat(quotes.bestQuote.exchangeRate) : null;\n const fiatNumeric = parseFloat(state.fiatAmount) || 0;\n const confirmParityActive = !!(stablecoinParity && partnerName && !isSell && isStablecoin(state.cryptoCurrency) && exchangeRate);\n const confirmSamePeg = confirmParityActive && state.cryptoCurrency.toUpperCase().includes(state.fiatCurrency.toUpperCase());\n const confirmParityAmount = confirmParityActive && fiatNumeric > 0\n ? formatOutput(confirmSamePeg ? fiatNumeric : fiatNumeric / exchangeRate)\n : null;\n\n const handleConfirm = async () => {\n setError(null);\n try {\n fetchQuotes();\n await createOrder();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n setError(message);\n }\n };\n\n if (configLoading) {\n return (\n <div className={`flex flex-col items-center justify-center p-12 ${className}`}>\n <div className=\"nramp-spinner\" />\n <p className=\"text-[14px] mt-4\" style={{ color: 'var(--t-text-secondary)' }}>Loading...</p>\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 ${className}`}>\n <h2 className=\"text-[20px] font-semibold mb-6\" style={{ color: 'var(--t-text)' }}>\n {isSell ? 'Confirm Sale' : 'Confirm Purchase'}\n </h2>\n\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n {gatewayInfo && (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>Provider</span>\n <span className=\"flex items-center gap-2\">\n {gatewayInfo.logo && (\n <img src={gatewayInfo.logo} alt={gatewayInfo.name} width={20} height={20} style={{ borderRadius: 4 }} />\n )}\n <span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>{gatewayInfo.name}</span>\n </span>\n </div>\n )}\n\n {isSell ? (\n <>\n <DetailRow label=\"You sell\" value={`${state.cryptoAmount} ${state.cryptoCurrency}`} highlight />\n <DetailRow label=\"You receive\" value={`${state.fiatCurrency} payout`} />\n </>\n ) : (\n <>\n <DetailRow label=\"You pay\" value={`${state.fiatAmount} ${state.fiatCurrency}`} highlight />\n <DetailRow\n label=\"You receive\"\n value={confirmParityAmount ? `${confirmParityAmount} ${state.cryptoCurrency}` : `${state.cryptoCurrency} on ${state.network}`}\n />\n <DetailRow label=\"Wallet\" value={truncateAddress(state.walletAddress)} mono />\n {confirmParityActive && confirmParityAmount && (\n <div className=\"py-2 text-[11px]\" style={{ color: 'var(--t-text-muted)', lineHeight: '15px' }}>\n Charged amount from provider may differ. The rest up to {confirmParityAmount} {state.cryptoCurrency} will be credited to your {partnerName} account.\n </div>\n )}\n </>\n )}\n\n <DetailRow label=\"Network\" value={state.network} />\n\n {isSell && state.walletAddress && (\n <DetailRow label=\"Refund address\" value={truncateAddress(state.walletAddress)} mono />\n )}\n </div>\n\n {error && (\n <p className=\"text-[12px] mb-4\" style={{ color: '#EF4444' }}>{error}</p>\n )}\n\n <button\n className=\"w-full font-semibold text-[16px] transition-all flex items-center justify-center gap-2\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)', opacity: orderLoading ? 0.7 : 1 }}\n disabled={orderLoading}\n onClick={handleConfirm}\n >\n {orderLoading ? (\n <>\n <span className=\"nramp-spinner-inline\" />\n Processing...\n </>\n ) : (\n isSell ? 'Confirm & Sell' : 'Confirm & Pay'\n )}\n </button>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function Modal({\n isOpen,\n onClose,\n children,\n}: {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n}) {\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setAnimating(true)));\n } else if (mounted) {\n setAnimating(false);\n const t = setTimeout(() => setMounted(false), 250);\n return () => clearTimeout(t);\n }\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setAnimating(false);\n setTimeout(() => onClose(), 250);\n }, [onClose]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [isOpen, handleClose]);\n\n if (!mounted) return null;\n\n return (\n <div\n className=\"absolute inset-0 z-20 transition-opacity duration-250\"\n style={{ opacity: animating ? 1 : 0 }}\n >\n <div\n className=\"absolute inset-0 flex flex-col transition-transform duration-250 ease-out\"\n style={{ background: 'var(--t-modal-bg)', transform: animating ? 'translateY(0)' : 'translateY(24px)' }}\n >\n {typeof children === 'function' ? children(handleClose) : children}\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nexport function AnimatedDigit({ char, height = 38 }: { char: string; height?: number }) {\n const digits = '0123456789';\n const idx = digits.indexOf(char);\n if (idx === -1) return <span>{char}</span>;\n return (\n <span className=\"digit-slot\" style={{ height, lineHeight: `${height}px` }}>\n <span className=\"digit-slot-inner block\" style={{ transform: `translateY(-${idx * height}px)` }}>\n {digits.split('').map(d => (\n <span key={d} className=\"block\" style={{ height, lineHeight: `${height}px` }}>{d}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport function AnimatedNumber({\n value,\n height = 38,\n className = '',\n style = {},\n}: {\n value: string;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <span className={className} style={{ display: 'inline-flex', ...style }}>\n {value.split('').map((ch, i) => (\n <AnimatedDigit key={i} char={ch} height={height} />\n ))}\n </span>\n );\n}\n","export function Skeleton({\n w,\n h,\n className = '',\n}: {\n w: number | string;\n h: number | string;\n className?: string;\n}) {\n return <div className={`skeleton ${className}`} style={{ width: w, height: h }} />;\n}\n\nexport function FormSkeleton() {\n return (\n <div className=\"flex-1 px-5 flex flex-col\">\n <div className=\"px-[18px] pt-[14px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5 }}>\n <Skeleton w={70} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={120} h={32} />\n <Skeleton w={75} h={32} />\n </div>\n </div>\n <div className=\"px-[18px] pt-[12px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5, marginTop: 4 }}>\n <Skeleton w={50} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={180} h={32} />\n <Skeleton w={85} h={32} />\n </div>\n </div>\n <div className=\"flex justify-between mt-3 px-[2px]\">\n <Skeleton w={140} h={12} />\n <Skeleton w={90} h={12} />\n </div>\n <div className=\"mt-8\">\n <Skeleton w={65} h={14} className=\"mb-2.5\" />\n <Skeleton w=\"100%\" h={47} />\n </div>\n <div className=\"flex-1\" />\n <Skeleton w=\"100%\" h={60} className=\"mb-2\" />\n <div className=\"text-center py-3\">\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>Powered by NowRamp</span>\n </div>\n </div>\n );\n}\n","export function CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center transition-colors rounded-full shrink-0\"\n style={{ width: 30, height: 30, backgroundColor: 'var(--t-close-bg)' }}\n onMouseEnter={e => (e.currentTarget.style.backgroundColor = 'var(--t-close-hover)')}\n onMouseLeave={e => (e.currentTarget.style.backgroundColor = 'var(--t-close-bg)')}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"var(--t-icon-close)\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n );\n}\n","import { useState } from 'react';\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = '',\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n}) {\n const [focused, setFocused] = useState(false);\n return (\n <div className=\"relative mx-5 mb-5\">\n <input\n type=\"text\"\n value={value}\n onChange={e => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder}\n style={{ height: 47, borderRadius: 4.5, border: `1px solid ${focused ? 'var(--t-border-focus)' : 'var(--t-border)'}`, outline: 'none', boxShadow: 'none', color: 'var(--t-text)', padding: `0 ${value ? 40 : 14}px 0 14px`, fontSize: 14, backgroundColor: 'transparent' }}\n className=\"w-full outline-none transition-colors\"\n />\n {value && (\n <button\n onClick={() => onChange('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center transition-colors rounded\"\n style={{ width: 22, height: 22, backgroundColor: 'var(--t-close-bg)', borderRadius: 4 }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1L7 7M7 1L1 7\" stroke=\"var(--t-icon-close)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Fiat Currency Selector Modal\n * Searchable list of fiat currencies with flag icons.\n * Uses API currencies if provided, falls back to static FIAT_CURRENCIES data.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { FiatFlag } from '../ui/icons';\nimport { FIAT_CURRENCIES, type FiatCurrency } from '../../data/cryptoData';\n\nexport interface FiatCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string) => void;\n\t/** Currencies from API config — takes precedence over static fallback */\n\tcurrencies?: Array<{ code: string; name?: string }>;\n\t/** Base URL for static assets (fiat flags) */\n\tassetBaseUrl?: string;\n\t/** Currently selected currency code */\n\tselectedCode?: string;\n}\n\nexport function FiatCurrencyModal({\n\tonClose,\n\tonSelect,\n\tcurrencies,\n\tassetBaseUrl = '',\n\tselectedCode,\n}: FiatCurrencyModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\t// Merge API data with static fallback for display names\n\tconst currencyList = useMemo<FiatCurrency[]>(() => {\n\t\tif (!currencies || currencies.length === 0) return FIAT_CURRENCIES;\n\n\t\t// Build a lookup from static data for display names\n\t\tconst staticMap = new Map(FIAT_CURRENCIES.map((c) => [c.code, c.name]));\n\n\t\treturn currencies.map((c) => ({\n\t\t\tcode: c.code,\n\t\t\tname: c.name || staticMap.get(c.code) || c.code,\n\t\t}));\n\t}, [currencies]);\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode) {\n\t\t\t\tconst selected = currencyList.find((c) => c.code === selectedCode);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = currencyList.filter((c) => c.code !== selectedCode);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn currencyList;\n\t\t}\n\n\t\treturn currencyList.filter(\n\t\t\t(c) => c.code.toLowerCase().includes(raw) || c.name.toLowerCase().includes(raw)\n\t\t);\n\t}, [currencyList, search, selectedCode]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tfontSize: 17,\n\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\tmarginTop: 8,\n\t\t\t\t\tmarginBottom: 24,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\tSelect fiat currency\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((c, idx) => {\n\t\t\t\t\t// Only show name if different from code\n\t\t\t\t\tconst displayName = c.name !== c.code ? c.name : '';\n\t\t\t\t\tconst isSelected = selectedCode === c.code;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={c.code}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(c.code)}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FiatFlag currencyCode={c.code} size={32} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<span className=\"font-semibold text-[15px]\">{c.code}</span>\n\t\t\t\t\t\t\t\t\t{displayName && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo currencies found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Crypto Currency + Chain Selector Modal\n * Searchable list of crypto+chain combinations with compound icons (crypto icon + chain badge).\n * Smart search ranking: exact code > starts with > popular > other.\n * Uses API data if provided, falls back to static CRYPTO_CHAIN_COMBOS.\n */\n\nimport { useState, useMemo, useCallback, useRef } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport {\n\tCRYPTO_CHAIN_COMBOS,\n\tgetCryptoIconUrl,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\tCRYPTO_NAMES,\n\ttype CryptoChainCombo,\n} from '../../data/cryptoData';\n\n/** Image component with loading state and error fallback */\nfunction CryptoImage({ src, alt, size, className, style }: {\n\tsrc: string;\n\talt: string;\n\tsize: number;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\tconst [loaded, setLoaded] = useState(false);\n\tconst [error, setError] = useState(false);\n\tconst currentSrc = useRef(src);\n\n\t// Reset state when src changes, using ref to avoid race with onLoad\n\tif (currentSrc.current !== src) {\n\t\tcurrentSrc.current = src;\n\t\tsetLoaded(false);\n\t\tsetError(false);\n\t}\n\n\tconst handleLoad = useCallback(() => setLoaded(true), []);\n\tconst handleError = useCallback(() => setError(true), []);\n\n\treturn (\n\t\t<div className={className} style={{ ...style, width: size, height: size, position: 'relative' }}>\n\t\t\t{/* Placeholder shown while loading */}\n\t\t\t{!loaded && !error && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full animate-pulse\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{/* Fallback for broken images */}\n\t\t\t{error ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full flex items-center justify-center text-[10px] font-bold\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)', color: 'var(--t-text-muted)' }}\n\t\t\t\t>\n\t\t\t\t\t{alt.slice(0, 3)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<img\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={size}\n\t\t\t\t\theight={size}\n\t\t\t\t\tonLoad={handleLoad}\n\t\t\t\t\tonError={handleError}\n\t\t\t\t\tclassName={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n\t\t\t\t\tstyle={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport interface CryptoCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string, chain: string) => void;\n\t/** Crypto data from API config — takes precedence over static fallback */\n\tcryptos?: Array<{\n\t\tcode: string;\n\t\tname?: string;\n\t\tnetworks?: Array<{ code: string; id?: string; name?: string }>;\n\t}>;\n\t/** Base URL for static assets (crypto icons) */\n\tassetBaseUrl?: string;\n\t/** Currently selected crypto code */\n\tselectedCode?: string;\n\t/** Currently selected chain/network */\n\tselectedChain?: string;\n}\n\nexport function CryptoCurrencyModal({ onClose, onSelect, cryptos, assetBaseUrl = '', selectedCode, selectedChain }: CryptoCurrencyModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\t// Build flat combo list from API data or fall back to static data\n\tconst comboList = useMemo<CryptoChainCombo[]>(() => {\n\t\tif (!cryptos || cryptos.length === 0) return CRYPTO_CHAIN_COMBOS;\n\n\t\tconst list: CryptoChainCombo[] = [];\n\t\tfor (const c of cryptos) {\n\t\t\tconst networks = c.networks || [];\n\t\t\t// Get name from API, fallback to CRYPTO_NAMES lookup, then code\n\t\t\tconst cryptoName = c.name || CRYPTO_NAMES[c.code] || c.code;\n\t\t\tif (networks.length === 0) {\n\t\t\t\t// No networks listed — add a single entry with the code as chain\n\t\t\t\tlist.push({ code: c.code, name: cryptoName, chain: c.code, popular: false });\n\t\t\t} else {\n\t\t\t\tfor (const net of networks) {\n\t\t\t\t\tconst chainCode = net.code || net.id || net.name || c.code;\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\tname: cryptoName,\n\t\t\t\t\t\tchain: chainCode,\n\t\t\t\t\t\tchainName: net.name,\n\t\t\t\t\t\tpopular: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}, [cryptos]);\n\n\t// Check if an item is currently selected\n\tconst isSelected = useCallback((code: string, chain: string) => {\n\t\treturn selectedCode === code && selectedChain === chain;\n\t}, [selectedCode, selectedChain]);\n\n\t// Filtered and ranked results\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode && selectedChain) {\n\t\t\t\tconst selected = comboList.find(c => c.code === selectedCode && c.chain === selectedChain);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = comboList.filter(c => !(c.code === selectedCode && c.chain === selectedChain));\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn comboList;\n\t\t}\n\n\t\tconst terms = raw.split(/\\s+/);\n\t\tconst scored: Array<{ item: CryptoChainCombo; score: number }> = [];\n\n\t\tfor (const c of comboList) {\n\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\tconst chainName = chain ? chain.name.toLowerCase() : '';\n\t\t\tconst chainShort = chain?.shortName?.toLowerCase() || '';\n\t\t\tconst chainCode = c.chain.toLowerCase();\n\t\t\tconst code = c.code.toLowerCase();\n\t\t\tconst name = c.name.toLowerCase();\n\t\t\tconst fields = [code, name, chainName, chainShort, chainCode];\n\n\t\t\t// All search terms must match at least one field\n\t\t\tconst allMatch = terms.every((t) => fields.some((f) => f.includes(t)));\n\t\t\tif (!allMatch) continue;\n\n\t\t\t// Scoring: exact code match > starts with > chain match bonus > popular\n\t\t\tlet score = 0;\n\t\t\tif (code === raw) score += 100;\n\t\t\telse if (code.startsWith(terms[0])) score += 50;\n\t\t\tif (c.popular) score += 10;\n\t\t\tif (\n\t\t\t\tterms.length > 1 &&\n\t\t\t\t(chainName.includes(terms[1]) ||\n\t\t\t\t\tchainShort.includes(terms[1]) ||\n\t\t\t\t\tchainCode.includes(terms[1]))\n\t\t\t) {\n\t\t\t\tscore += 25;\n\t\t\t}\n\t\t\tscored.push({ item: c, score });\n\t\t}\n\n\t\tscored.sort((a, b) => b.score - a.score);\n\t\treturn scored.map((s) => s.item);\n\t}, [comboList, search, selectedCode, selectedChain]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tSelect crypto currency\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((c, idx) => {\n\t\t\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\t\t\tconst chainName = chain?.name || c.chainName || c.chain;\n\t\t\t\t\t// Only show name if it's different from code\n\t\t\t\t\tconst displayName = c.name !== c.code ? c.name : '';\n\t\t\t\t\tconst itemSelected = isSelected(c.code, c.chain);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={`${c.code}-${c.chain}`}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(c.code, c.chain)}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n\t\t\t\t\t\t\t\tstyle={{ gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Compound icon: crypto icon + chain badge */}\n\t\t\t\t\t\t\t\t<div className=\"relative shrink-0\" style={{ width: 40, height: 40 }}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ background: '#ffffff', borderRadius: '50%' }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\t\tsrc={getCryptoIconUrl(c.code, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\talt={c.code}\n\t\t\t\t\t\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\t\tborder: '2px solid var(--t-surface, #1C1C22)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\t\t\tbackground: '#ffffff',\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(c.chain, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\talt={c.chain}\n\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-[15px]\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{displayName && (\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[13px]\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 shrink-0\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t{chainName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{itemSelected && (\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo currencies found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Payment Method Modal\n * Searchable list of payment methods with icons.\n * Follows the same pattern as FiatCurrencyModal / CryptoCurrencyModal.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { getMethodIcon, getMethodDisplayName } from '../PaymentMethodSelector';\n\nexport interface PaymentMethodModalProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tonClose: () => void;\n}\n\nexport function PaymentMethodModal({\n\tmethods,\n\tselectedId,\n\tonSelect,\n\tonClose,\n}: PaymentMethodModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedId) {\n\t\t\t\tconst selected = methods.find((m) => m.id === selectedId);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = methods.filter((m) => m.id !== selectedId);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn methods;\n\t\t}\n\n\t\treturn methods.filter(\n\t\t\t(m) =>\n\t\t\t\tm.id.toLowerCase().includes(raw) ||\n\t\t\t\tm.name.toLowerCase().includes(raw) ||\n\t\t\t\t(m.description && m.description.toLowerCase().includes(raw))\n\t\t);\n\t}, [methods, search, selectedId]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tChoose payment method\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((m, idx) => {\n\t\t\t\t\tconst isSelected = m.id === selectedId;\n\t\t\t\t\tconst shortName = getMethodDisplayName(m.id, m.name);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={m.id}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(m.id)}\n\t\t\t\t\t\t\t\tclassName={`flex w-full transition-colors rounded-lg hover-item ${m.description ? 'items-start' : 'items-center'}`}\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center shrink-0 ${m.description ? 'mt-0.5' : ''}`}\n\t\t\t\t\t\t\t\t\tstyle={{ width: 32, height: 32 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{getMethodIcon(m.id, m.icon, 32)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-[15px] leading-tight\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{shortName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{m.description && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[13px] leading-snug mt-1\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{m.description}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0 mt-1\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo payment methods found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","export function ToggleSwitch({\n checked,\n onChange,\n accentColor = 'var(--t-accent)',\n}: {\n checked: boolean;\n onChange: (v: boolean) => void;\n accentColor?: string;\n}) {\n return (\n <button\n onClick={() => onChange(!checked)}\n className=\"relative shrink-0 transition-colors duration-200\"\n style={{\n width: 48,\n height: 28,\n borderRadius: 14,\n backgroundColor: checked ? accentColor : 'var(--t-border)',\n }}\n >\n <div\n className=\"absolute top-[3px] rounded-full bg-white shadow transition-transform duration-200\"\n style={{\n width: 22,\n height: 22,\n transform: checked ? 'translateX(23px)' : 'translateX(3px)',\n }}\n />\n </button>\n );\n}\n","/**\n * Settings Screen Modal\n * Location selector, dark mode toggle, theme skin picker, and links (Privacy Policy, Terms of Use).\n */\n\nimport { useState } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { DarkModeIcon, ChevronRight } from '../ui/icons';\nimport { ToggleSwitch } from '../ui/ToggleSwitch';\n// import { SkinSwatch } from '../ui/SkinSwatch';\n// import { SKINS } from '../../data/cryptoData';\n\nconst SETTINGS_LINKS = [\n { label: 'Privacy policy', href: 'https://nowramp.com/privacy-policy' },\n { label: 'Terms of use', href: 'https://nowramp.com/terms-and-conditions' },\n];\n\nexport interface SettingsScreenProps {\n onClose: () => void;\n darkMode: boolean;\n onToggleDarkMode: (v: boolean) => void;\n skinId: string;\n onSelectSkin: (id: string) => void;\n /** Show dark mode toggle (default: true) */\n showThemeToggle?: boolean;\n /** Currently detected/selected country code */\n country?: string;\n /** Display name for the country */\n countryName?: string;\n /** Callback when location row is pressed */\n onLocationPress?: () => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n}\n\nexport function SettingsScreen({\n onClose,\n darkMode,\n onToggleDarkMode,\n skinId: _skinId,\n onSelectSkin: _onSelectSkin,\n showThemeToggle = true,\n country,\n countryName,\n onLocationPress,\n assetBaseUrl = '',\n}: SettingsScreenProps) {\n void _skinId;\n void _onSelectSkin;\n\n const [flagError, setFlagError] = useState(false);\n\n return (\n <>\n <div className=\"flex justify-end items-center px-5 pt-5\">\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"px-5 flex-1 pt-6 overflow-y-auto custom-scroll\">\n {/* Location row */}\n {onLocationPress && (\n <>\n <div style={{ borderTop: '1px solid var(--t-divider)' }}>\n <button\n onClick={onLocationPress}\n className=\"flex items-center justify-between w-full py-5 transition-colors\"\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer', padding: '20px 0' }}\n >\n <div className=\"flex items-center gap-3.5\">\n {country && !flagError ? (\n <img\n src={`${assetBaseUrl}/flags/${country.toLowerCase()}.svg`}\n alt={country}\n width={40}\n height={40}\n style={{ width: 40, height: 40, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setFlagError(true)}\n />\n ) : (\n <GlobeIcon size={40} />\n )}\n <div className=\"text-left\">\n <span\n className=\"font-medium text-[15px] block\"\n style={{ color: 'var(--t-text)' }}\n >\n Location\n </span>\n {countryName && (\n <span\n className=\"text-[13px]\"\n style={{ color: 'var(--t-text-secondary)' }}\n >\n {countryName}\n </span>\n )}\n </div>\n </div>\n <ChevronRight />\n </button>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </>\n )}\n\n {/* Dark mode toggle */}\n {showThemeToggle && (\n <>\n <div style={{ borderTop: onLocationPress ? 'none' : '1px solid var(--t-divider)' }}>\n <div className=\"flex items-center justify-between w-full py-5\">\n <div className=\"flex items-center gap-3.5\">\n <DarkModeIcon size={40} />\n <span\n className=\"font-medium text-[15px]\"\n style={{ color: 'var(--t-text)' }}\n >\n Dark Mode\n </span>\n </div>\n <ToggleSwitch checked={darkMode} onChange={onToggleDarkMode} accentColor=\"#4CD964\" />\n </div>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </>\n )}\n\n {/* Skin picker — controlled via code props only, hidden from end-user settings */}\n {/* <div className=\"py-5\">\n <div\n className=\"text-[15px] font-medium mb-4\"\n style={{ color: 'var(--t-text)' }}\n >\n Theme\n </div>\n <div className=\"flex gap-3\">\n {SKINS.map(skin => (\n <SkinSwatch\n key={skin.id}\n skin={skin}\n active={skin.id === skinId}\n dimmed={hasCustomAccent}\n onClick={() => onSelectSkin(skin.id)}\n darkMode={darkMode}\n />\n ))}\n </div>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} /> */}\n\n {/* Links: Privacy Policy, Terms of Use */}\n {SETTINGS_LINKS.map((item) => (\n <div key={item.label}>\n <a\n href={item.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-between w-full py-5 transition-colors\"\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n <span\n className=\"font-medium text-[15px]\"\n style={{ color: 'var(--t-text)' }}\n >\n {item.label}\n </span>\n <ChevronRight />\n </a>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </div>\n ))}\n </div>\n </>\n );\n}\n\nfunction GlobeIcon({ size = 40 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <ellipse cx=\"20\" cy=\"20\" rx=\"9\" ry=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <line x1=\"2\" y1=\"20\" x2=\"38\" y2=\"20\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" />\n <path d=\"M5 12h30M5 28h30\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n","/**\n * Country Picker Modal\n * Searchable list of countries with flag icons.\n * Follows the FiatCurrencyModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { COUNTRIES, COUNTRY_MAP } from '../../data/countries';\n\nexport interface CountryPickerModalProps {\n onClose: () => void;\n onSelect: (countryCode: string) => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n /** Currently selected country code */\n selectedCode?: string;\n}\n\nexport function CountryPickerModal({\n onClose,\n onSelect,\n assetBaseUrl = '',\n selectedCode,\n}: CountryPickerModalProps) {\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const normalizedCode = selectedCode.toLowerCase();\n const selected = COUNTRY_MAP[normalizedCode];\n if (selected) {\n const rest = COUNTRIES.filter((c) => c.code !== normalizedCode);\n return [selected, ...rest];\n }\n }\n return COUNTRIES;\n }\n\n return COUNTRIES.filter(\n (c) =>\n c.name.toLowerCase().includes(raw) ||\n c.code.includes(raw) ||\n c.defaultFiat.toLowerCase().includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n <div className=\"flex justify-end px-5 pt-5\">\n <CloseButton onClick={onClose} />\n </div>\n <h2\n className=\"text-center text-[17px] font-medium mt-2 mb-6\"\n style={{\n color: 'var(--t-text)',\n fontSize: 17,\n fontWeight: 500,\n marginTop: 8,\n marginBottom: 24,\n }}\n >\n Select your country\n </h2>\n <SearchInput value={search} onChange={setSearch} />\n <div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n {filtered.map((c, idx) => {\n const isSelected = selectedCode?.toLowerCase() === c.code;\n return (\n <div key={c.code}>\n <button\n onClick={() => onSelect(c.code)}\n className=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n style={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n >\n <CountryFlag code={c.code} size={32} baseUrl={assetBaseUrl} />\n <div className=\"text-left flex-1\">\n <span className=\"font-semibold text-[15px]\">{c.name}</span>\n <span className=\"text-[13px] ml-2\" style={{ color: 'var(--t-text-secondary)' }}>\n {c.defaultFiat}\n </span>\n </div>\n {isSelected && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n {idx < filtered.length - 1 && (\n <div\n style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }}\n />\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n No countries found\n </div>\n )}\n </div>\n </>\n );\n}\n\n/** Country flag image using the /flags/{code}.svg pattern */\nfunction CountryFlag({ code, size = 32, baseUrl = '' }: { code: string; size?: number; baseUrl?: string }) {\n const [error, setError] = useState(false);\n\n if (error) {\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'var(--t-pill-bg, #333)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: size * 0.4,\n color: 'var(--t-text-muted)',\n }}\n >\n {code.toUpperCase().slice(0, 2)}\n </div>\n );\n }\n\n return (\n <img\n src={`${baseUrl}/flags/${code}.svg`}\n alt={code}\n width={size}\n height={size}\n style={{ width: size, height: size, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setError(true)}\n />\n );\n}\n","/**\n * RampForm\n * Main single-screen form with modal overlays (new NowRamp design).\n * Replaces the old multi-step wizard.\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { RampProvider, useRamp, type RampProviderProps } from '../context/RampContext';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { CheckoutStep } from './CheckoutStep';\nimport { ProcessingStep } from './ProcessingStep';\nimport { CompleteStep } from './CompleteStep';\nimport { ErrorStep } from './ErrorStep';\nimport { ConfirmStep } from './ConfirmStep';\nimport { Modal } from './ui/Modal';\nimport { AnimatedNumber } from './ui/AnimatedNumber';\nimport { Skeleton, FormSkeleton } from './ui/Skeleton';\nimport { CryptoIcon, FiatFlag, ChevronDown, MenuIcon } from './ui/icons';\nimport { FiatCurrencyModal } from './modals/FiatCurrencyModal';\nimport { CryptoCurrencyModal } from './modals/CryptoCurrencyModal';\nimport { PaymentMethodModal } from './modals/PaymentMethodModal';\nimport { SettingsScreen } from './modals/SettingsScreen';\nimport { CountryPickerModal } from './modals/CountryPickerModal';\nimport { COUNTRY_MAP } from '../data/countries';\nimport {\n\tSKINS,\n\tparseAmount,\n\tformatOutput,\n\tisValidHex,\n\tisStablecoin,\n\tMIN_FIAT_AMOUNT,\n\tMIN_CRYPTO_AMOUNT,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\ttype Skin,\n} from '../data/cryptoData';\nimport type { Transaction } from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RampFormProps extends Omit<RampProviderProps, 'children'> {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\t/** Skin preset ID */\n\tskinId?: string;\n\t/** Custom accent color override (hex) */\n\taccentColor?: string;\n\t/** Custom background color override (hex) */\n\tbgColor?: string;\n\t/** Custom background image URL */\n\tbgImage?: string;\n\t/** Custom border color (hex) */\n\tborderColor?: string;\n\t/** Custom border radius (CSS value, e.g. '5px') */\n\tborderRadius?: string;\n\t// Extended theme color overrides\n\t/** Surface/card background color (hex) */\n\tsurfaceColor?: string;\n\t/** Input/pill background color (hex) */\n\tinputBgColor?: string;\n\t/** Primary text color (hex) */\n\ttextColor?: string;\n\t/** Secondary/label text color (hex) */\n\ttextSecondaryColor?: string;\n\t/** Muted text color (hex) */\n\ttextMutedColor?: string;\n\t/** Success/rate indicator color (hex) */\n\tsuccessColor?: string;\n\t/** Show Buy/Sell flow toggle (default: true). Set false to lock to the provided flowType. */\n\tshowFlowToggle?: boolean;\n\t/** Show settings menu icon (default: true). Set false to hide settings entirely. */\n\tshowSettings?: boolean;\n\t/** Show dark mode toggle in settings (default: true). Set false to hide theme switching. */\n\tshowThemeToggle?: boolean;\n\t/** Auto-redirect for redirect checkouts */\n\tautoRedirect?: boolean;\n\t/** Block explorer URL pattern */\n\texplorerUrl?: string;\n\t/** Done button text */\n\tdoneButtonText?: string;\n\t/** Support email */\n\tsupportEmail?: string;\n\t/** Show email field in wallet step */\n\tshowEmail?: boolean;\n\t/** Require email */\n\trequireEmail?: boolean;\n\t/** Show fee-free stablecoin amount (partner absorbs fees) */\n\tstablecoinParity?: boolean;\n\t/** Partner display name for parity info banner */\n\tpartnerName?: string;\n\t/** Callback when user clicks done */\n\tonDone?: () => void;\n\tonComplete?: (status: Transaction) => void;\n\tonError?: (error: Error) => void;\n}\n\n// =============================================================================\n// Inner Form\n// =============================================================================\n\ninterface InnerFormProps {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\tskinId?: string;\n\taccentColor?: string;\n\tbgColor?: string;\n\tbgImage?: string;\n\tborderColor?: string;\n\tborderRadius?: string;\n\tsurfaceColor?: string;\n\tinputBgColor?: string;\n\ttextColor?: string;\n\ttextSecondaryColor?: string;\n\ttextMutedColor?: string;\n\tsuccessColor?: string;\n\tshowFlowToggle?: boolean;\n\tshowSettings?: boolean;\n\tshowThemeToggle?: boolean;\n\tautoRedirect?: boolean;\n\texplorerUrl?: string;\n\tdoneButtonText?: string;\n\tsupportEmail?: string;\n\tstablecoinParity?: boolean;\n\tpartnerName?: string;\n\tonDone?: () => void;\n}\n\ntype ModalType = 'fiat' | 'crypto' | 'payment' | 'settings' | 'country' | null;\n\nfunction InnerForm({\n\tclassName = '',\n\ttheme = 'dark',\n\tskinId: skinIdProp = 'mono',\n\taccentColor: accentColorProp,\n\tbgColor: bgColorProp,\n\tbgImage: bgImageProp,\n\tborderColor: borderColorProp,\n\tborderRadius: borderRadiusProp,\n\tsurfaceColor: surfaceColorProp,\n\tinputBgColor: inputBgColorProp,\n\ttextColor: textColorProp,\n\ttextSecondaryColor: textSecondaryColorProp,\n\ttextMutedColor: textMutedColorProp,\n\tsuccessColor: successColorProp,\n\tshowFlowToggle = true,\n\tshowSettings = true,\n\tshowThemeToggle = true,\n\tautoRedirect = false,\n\texplorerUrl,\n\tdoneButtonText = 'Done',\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tonDone,\n}: InnerFormProps) {\n\tconst {\n\t\tstate,\n\t\tdispatch,\n\t\tconfig,\n\t\tconfigLoading,\n\t\tquotes,\n\t\tquotesLoading,\n\t\tquotesError,\n\t\tfetchQuotes,\n\t\tcreateOrder,\n\t\torderLoading,\n\t\tamountError,\n\t\tfieldLocks,\n\t\tapiConfig,\n\t\tassetBaseUrl,\n\t} = useRamp();\n\n\t// Local UI state\n\tconst [darkMode, setDarkMode] = useState(theme === 'dark');\n\tconst [skinId, setSkinId] = useState(skinIdProp);\n\tconst [modal, setModal] = useState<ModalType>(null);\n\tconst [amountTouched, setAmountTouched] = useState(false);\n\tconst [walletTouched, setWalletTouched] = useState(false);\n\tconst [walletFocused, setWalletFocused] = useState(false);\n\tconst [walletValidating, setWalletValidating] = useState(false);\n\tconst [walletServerValid, setWalletServerValid] = useState<boolean | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [switching, setSwitching] = useState(false);\n\tconst [autoSelectPending, setAutoSelectPending] = useState(false);\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst walletValidationTimer = useRef<ReturnType<typeof setTimeout>>();\n\tconst prevTabRef = useRef(state.flowType);\n\n\t// Sync darkMode with theme prop\n\tuseEffect(() => {\n\t\tsetDarkMode(theme === 'dark');\n\t}, [theme]);\n\n\t// Initial load animation\n\tuseEffect(() => {\n\t\tconst t = setTimeout(() => setLoading(false), configLoading ? 0 : 800);\n\t\treturn () => clearTimeout(t);\n\t}, [configLoading]);\n\n\t// Tab switching animation\n\tuseEffect(() => {\n\t\tif (prevTabRef.current !== state.flowType && !loading) {\n\t\t\tprevTabRef.current = state.flowType;\n\t\t\tsetSwitching(true);\n\t\t\tsetAmountTouched(false);\n\t\t\tsetWalletTouched(false);\n\t\t\tconst t = setTimeout(() => setSwitching(false), 350);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevTabRef.current = state.flowType;\n\t}, [state.flowType, loading]);\n\n\tconst tab = state.flowType;\n\tconst isBuy = tab === 'buy';\n\n\t// Compute display values from real quotes only\n\tconst cryptoCode = state.cryptoCurrency || 'BTC';\n\tconst fiatCode = state.fiatCurrency || 'USD';\n\tconst spendAmount = isBuy ? state.fiatAmount : state.cryptoAmount;\n\tconst spendNumeric = parseAmount(spendAmount);\n\n\tconst quoteRate = quotes?.bestQuote?.exchangeRate\n\t\t? parseFloat(quotes.bestQuote.exchangeRate)\n\t\t: null;\n\n\t// Persist last known rate so it stays visible between quote fetches\n\tconst lastRateRef = useRef<{ rate: number; crypto: string; fiat: string } | null>(null);\n\tif (quoteRate && cryptoCode && fiatCode) {\n\t\tlastRateRef.current = { rate: quoteRate, crypto: cryptoCode, fiat: fiatCode };\n\t}\n\n\tconst receiveAmount = useMemo(() => {\n\t\tif (quotes?.bestQuote) {\n\t\t\tconst amt = isBuy ? quotes.bestQuote.cryptoAmount : quotes.bestQuote.fiatAmount;\n\t\t\tif (amt) return amt;\n\t\t}\n\t\treturn '0';\n\t}, [quotes, isBuy]);\n\n\t// Stablecoin parity: partner absorbs fees, credits user full amount\n\t// Same-peg (crypto code contains fiat code) → 1:1 fiat amount.\n\t// Cross-currency → FX-convert via quote rate.\n\tconst parityActive = !!(stablecoinParity && partnerName && isBuy && isStablecoin(cryptoCode) && quoteRate);\n\tconst isSamePeg = parityActive && cryptoCode.toUpperCase().includes(fiatCode.toUpperCase());\n\tconst parityAmount = parityActive && spendNumeric > 0\n\t\t? formatOutput(isSamePeg ? spendNumeric : spendNumeric / quoteRate)\n\t\t: null;\n\tconst displayReceiveAmount = parityActive && parityAmount ? parityAmount : receiveAmount;\n\n\tconst displayRate = useMemo(() => {\n\t\tconst r = quoteRate || lastRateRef.current?.rate;\n\t\tconst cc = quoteRate ? cryptoCode : lastRateRef.current?.crypto;\n\t\tconst fc = quoteRate ? fiatCode : lastRateRef.current?.fiat;\n\t\tif (!r || !cc || !fc) return '';\n\t\treturn `1 ${cc} ≈ ${r.toFixed(2)} ${fc}`;\n\t}, [cryptoCode, fiatCode, quoteRate]);\n\n\t// Server-side wallet address validation (debounced with AbortController)\n\tuseEffect(() => {\n\t\tconst addr = state.walletAddress.trim();\n\t\tconst network = state.network;\n\n\t\t// Reset when empty\n\t\tif (!addr || addr.length < 10) {\n\t\t\tsetWalletServerValid(null);\n\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\treturn;\n\t\t}\n\n\t\tsetWalletValidating(true);\n\t\tsetWalletServerValid(null);\n\n\t\tconst abortController = new AbortController();\n\n\t\tclearTimeout(walletValidationTimer.current);\n\t\twalletValidationTimer.current = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${apiConfig.apiUrl}/public/validate/address`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ address: addr, ...(network ? { network } : {}) }),\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t});\n\t\t\t\tconst data = await res.json();\n\t\t\t\tconst result = data.data?.attributes || data.data || data;\n\t\t\t\tif (result.isValid) {\n\t\t\t\t\tsetWalletServerValid(true);\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\t\t} else {\n\t\t\t\t\tsetWalletServerValid(false);\n\t\t\t\t\tconst msg = result.errors?.[0] || result.details?.formatMessage || 'Invalid wallet address';\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: msg });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Ignore aborted requests; network errors don't block the user\n\t\t\t\tif (err instanceof DOMException && err.name === 'AbortError') return;\n\t\t\t\tsetWalletServerValid(null);\n\t\t\t} finally {\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tsetWalletValidating(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 500);\n\n\t\treturn () => {\n\t\t\tclearTimeout(walletValidationTimer.current);\n\t\t\tabortController.abort();\n\t\t};\n\t}, [state.walletAddress, state.network, apiConfig.apiUrl]);\n\n\t// Validation — use server-provided limits (amountError) as source of truth, fall back to hardcoded\n\tconst amountIsEmpty = !spendAmount || spendNumeric === 0;\n\tconst amountBelowMin = spendNumeric > 0 && (isBuy ? spendNumeric < MIN_FIAT_AMOUNT : spendNumeric < MIN_CRYPTO_AMOUNT);\n\tconst hasAmountError = !!amountError || amountBelowMin || (amountTouched && amountIsEmpty);\n\tconst isAmountValid = spendNumeric > 0 && !amountError && !amountBelowMin;\n\tconst isWalletValid = state.walletAddress.trim().length >= 10 && walletServerValid !== false && !walletValidating;\n\tconst isFormValid = isAmountValid && isWalletValid && !!state.cryptoCurrency && !!state.network;\n\n\tconst handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tlet raw = e.target.value.replace(/[^0-9.,]/g, '');\n\t\t// Limit decimal places: 2 for fiat, 6 for crypto\n\t\tconst maxDecimals = isBuy ? 2 : 6;\n\t\tconst dotIndex = raw.indexOf('.');\n\t\tif (dotIndex !== -1 && raw.length - dotIndex - 1 > maxDecimals) {\n\t\t\traw = raw.slice(0, dotIndex + maxDecimals + 1);\n\t\t}\n\t\tif (isBuy) {\n\t\t\tdispatch({ type: 'SET_FIAT_AMOUNT', amount: raw });\n\t\t} else {\n\t\t\tdispatch({ type: 'SET_CRYPTO_AMOUNT', amount: raw });\n\t\t}\n\t};\n\n\tconst handleTabSwitch = (newTab: 'buy' | 'sell') => {\n\t\tif (newTab === tab) return;\n\t\tdispatch({ type: 'SET_FLOW_TYPE', flowType: newTab });\n\t};\n\n\tconst handleFiatSelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_FIAT_CURRENCY', currency: code });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCryptoSelect = useCallback(\n\t\t(code: string, chain: string) => {\n\t\t\tdispatch({ type: 'SET_CRYPTO_CURRENCY', currency: code });\n\t\t\tdispatch({ type: 'SET_CRYPTO_CHAIN', chain });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handlePaymentMethodSelect = useCallback(\n\t\t(methodId: string) => {\n\t\t\tdispatch({ type: 'SET_PAYMENT_METHOD', methodId });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCountrySelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_COUNTRY', country: code });\n\t\t\tsetModal(null);\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleLocationPress = useCallback(() => {\n\t\t// Close settings, then open country picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('country'), 280);\n\t}, []);\n\n\tconst countryName = state.country ? COUNTRY_MAP[state.country.toLowerCase()]?.name : undefined;\n\n\tconst handleCtaClick = () => {\n\t\tif (!isFormValid) return;\n\t\tsetAutoSelectPending(true);\n\t\tfetchQuotes();\n\t};\n\n\t// Auto-select best quote when quotes arrive after CTA click\n\tuseEffect(() => {\n\t\tif (!autoSelectPending || quotesLoading) return;\n\n\t\tif (quotes?.bestQuote) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t\tcreateOrder().catch(() => {\n\t\t\t\t// Error handled by context\n\t\t\t});\n\t\t} else if (quotesError) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SET_ERROR', message: quotesError.message || 'No quotes available' });\n\t\t} else if (quotes && !quotes.bestQuote) {\n\t\t\t// Quotes loaded successfully but no providers available\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst reasons = (quotes as any).unavailableGateways\n\t\t\t\t?.map((g: any) => g.reason)\n\t\t\t\t.filter(Boolean);\n\t\t\tconst message = reasons?.length\n\t\t\t\t? `No providers available: ${reasons.join('; ')}`\n\t\t\t\t: 'No providers available for this currency/network combination';\n\t\t\tdispatch({ type: 'SET_ERROR', message });\n\t\t}\n\t}, [autoSelectPending, quotes, quotesLoading, quotesError, dispatch, createOrder]);\n\n\t// Theme computation\n\tconst themeClass = darkMode ? 'theme-dark' : 'theme-light';\n\tconst activeSkin = SKINS.find((s: Skin) => s.id === skinId) || SKINS[0];\n\tconst isMono = activeSkin.accent === null;\n\n\tconst hasCustomAccent = accentColorProp ? isValidHex(accentColorProp) : false;\n\n\t// Auto-detect best text color for CTA based on accent luminance\n\tconst getCtaTextColor = (hex: string): string => {\n\t\tconst c = hex.replace('#', '');\n\t\tconst r = parseInt(c.substring(0, 2), 16);\n\t\tconst g = parseInt(c.substring(2, 4), 16);\n\t\tconst b = parseInt(c.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#000000' : '#ffffff';\n\t};\n\n\tconst accentStyle: Record<string, string> = hasCustomAccent\n\t\t? { '--t-accent': accentColorProp!, '--t-cta-bg': accentColorProp!, '--t-cta-text': getCtaTextColor(accentColorProp!) }\n\t\t: isMono\n\t\t\t? {\n\t\t\t\t\t'--t-accent': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-bg': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-text': darkMode ? '#000000' : '#ffffff',\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t'--t-accent': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-bg': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-text': getCtaTextColor(activeSkin.accent!),\n\t\t\t\t};\n\n\t// Extended theme overrides\n\tconst themeOverrides: Record<string, string> = {};\n\tif (surfaceColorProp && isValidHex(surfaceColorProp)) {\n\t\tthemeOverrides['--t-surface'] = surfaceColorProp;\n\t\tthemeOverrides['--t-modal-bg'] = surfaceColorProp;\n\t}\n\tif (inputBgColorProp && isValidHex(inputBgColorProp)) {\n\t\tthemeOverrides['--t-pill-bg'] = inputBgColorProp;\n\t\tthemeOverrides['--t-close-bg'] = inputBgColorProp;\n\t}\n\tif (textColorProp && isValidHex(textColorProp)) {\n\t\tthemeOverrides['--t-text'] = textColorProp;\n\t}\n\tif (textSecondaryColorProp && isValidHex(textSecondaryColorProp)) {\n\t\tthemeOverrides['--t-text-secondary'] = textSecondaryColorProp;\n\t}\n\tif (textMutedColorProp && isValidHex(textMutedColorProp)) {\n\t\tthemeOverrides['--t-text-muted'] = textMutedColorProp;\n\t\tthemeOverrides['--t-text-tertiary'] = textMutedColorProp;\n\t}\n\tif (successColorProp && isValidHex(successColorProp)) {\n\t\tthemeOverrides['--t-success'] = successColorProp;\n\t}\n\n\tconst backgroundStyle: Record<string, string> = {};\n\tif (bgColorProp && isValidHex(bgColorProp)) {\n\t\tbackgroundStyle.backgroundColor = bgColorProp;\n\t} else {\n\t\tbackgroundStyle.backgroundColor = 'var(--t-bg)';\n\t}\n\tif (bgImageProp && (bgImageProp.startsWith('https://') || bgImageProp.startsWith('data:image/'))) {\n\t\tbackgroundStyle.backgroundImage = `url(${bgImageProp})`;\n\t\tbackgroundStyle.backgroundSize = 'cover';\n\t\tbackgroundStyle.backgroundPosition = 'center';\n\t}\n\n\t// Pill text: always high-contrast against pill background (not affected by textColor override)\n\tconst pillTextColor = darkMode ? '#ffffff' : '#111111';\n\n\tconst borderStyle: Record<string, string> = {};\n\tif (borderColorProp && isValidHex(borderColorProp)) {\n\t\tborderStyle.border = `1px solid ${borderColorProp}`;\n\t}\n\tif (borderRadiusProp) {\n\t\tborderStyle.borderRadius = borderRadiusProp;\n\t}\n\n\t// If we're in a post-form step, render inside the same themed container\n\tconst postFormStep =\n\t\tstate.step === 'checkout' ? <CheckoutStep autoRedirect={autoRedirect} /> :\n\t\tstate.step === 'processing' ? <ProcessingStep /> :\n\t\tstate.step === 'complete' ? <CompleteStep explorerUrl={explorerUrl} doneButtonText={doneButtonText} onDone={onDone} /> :\n\t\tstate.step === 'error' ? <ErrorStep supportEmail={supportEmail} /> :\n\t\tstate.step === 'confirm' ? <ConfirmStep stablecoinParity={parityActive} partnerName={partnerName} /> :\n\t\tnull;\n\n\tif (postFormStep) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] h-[640px] overflow-hidden flex flex-col select-none transition-colors duration-300 ${className}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t\t...backgroundStyle,\n\t\t\t\t\t...accentStyle,\n\t\t\t\t\t...themeOverrides,\n\t\t\t\t\t...borderStyle,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{postFormStep}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst chainCode = state.network;\n\tconst chainInfo = chainCode ? getChainInfo(chainCode) : null;\n\tconst chainDisplay = chainInfo?.shortName || chainInfo?.name || chainCode;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] min-h-[640px] overflow-hidden flex flex-col select-none transition-colors duration-300 ${className}`}\n\t\t\tstyle={{\n\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t...backgroundStyle,\n\t\t\t\t...accentStyle,\n\t\t\t\t...themeOverrides,\n\t\t\t\t...borderStyle,\n\t\t\t}}\n\t\t>\n\t\t\t{/* Menu icon */}\n\t\t\t{showSettings && (\n\t\t\t\t<div className={`flex justify-end items-center px-5 pt-3 ${showFlowToggle ? 'pb-1' : 'pb-5'}`}>\n\t\t\t\t\t<MenuIcon onClick={() => setModal('settings')} />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Buy / Sell tabs */}\n\t\t\t{showFlowToggle ? (\n\t\t\t\t<div className=\"flex flex-col items-center pt-3 pb-5\">\n\t\t\t\t\t<div className=\"flex\" style={{ width: 165 }}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => handleTabSwitch('buy')}\n\t\t\t\t\t\t\tclassName=\"flex-1 pb-2.5 text-[16px] font-medium text-center transition-colors duration-200\"\n\t\t\t\t\t\t\tstyle={{ color: tab === 'buy' ? 'var(--t-text)' : 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tBuy\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => handleTabSwitch('sell')}\n\t\t\t\t\t\t\tclassName=\"flex-1 pb-2.5 text-[16px] font-medium text-center transition-colors duration-200\"\n\t\t\t\t\t\t\tstyle={{ color: tab === 'sell' ? 'var(--t-text)' : 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSell\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"relative\" style={{ width: 165, height: 1 }}>\n\t\t\t\t\t\t<div className=\"absolute inset-0\" style={{ background: 'var(--t-divider)' }} />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"absolute top-0 h-full transition-all duration-300 ease-in-out\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '50%',\n\t\t\t\t\t\t\t\tleft: tab === 'buy' ? '0%' : '50%',\n\t\t\t\t\t\t\t\tbackground: 'var(--t-accent)',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{loading || switching || configLoading ? (\n\t\t\t\t<FormSkeleton />\n\t\t\t) : (\n\t\t\t\t<div key={tab} className=\"flex-1 overflow-hidden px-5 flex flex-col tab-fade-in\">\n\t\t\t\t\t{/* You spend card */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"px-[18px] pt-[14px] pb-[18px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder:\n\t\t\t\t\t\t\t\tamountTouched && hasAmountError ? '1px solid #EF4444' : '1px solid transparent',\n\t\t\t\t\t\t\tminHeight: 102,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\tYou spend\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={spendAmount}\n\t\t\t\t\t\t\t\tonChange={handleAmountChange}\n\t\t\t\t\t\t\t\tonBlur={() => setAmountTouched(true)}\n\t\t\t\t\t\t\t\tplaceholder={isBuy ? '250' : '0.01'}\n\t\t\t\t\t\t\t\tclassName=\"bg-transparent outline-none w-0 flex-1 mr-3\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 24, fontWeight: 600, lineHeight: '32px', padding: 0, border: 'none', borderRadius: 0, backgroundColor: 'transparent', height: 'auto', width: 0 }}\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceAmount?.locked}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{isBuy ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setModal('fiat')}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 shrink-0 transition-colors\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceCurrency?.locked}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FiatFlag currencyCode={fiatCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t{fiatCode}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-end shrink-0\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={() => setModal('crypto')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 transition-colors\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationCurrency?.locked}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoIcon ticker={cryptoCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t\t{cryptoCode}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{chainCode && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(chainCode, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={chainCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 14, height: 14 }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{chainDisplay}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{amountTouched && hasAmountError && (\n\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5 px-[2px]\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t{amountError\n\t\t\t\t\t\t\t\t|| (amountIsEmpty\n\t\t\t\t\t\t\t\t\t? 'Amount should be more than 0'\n\t\t\t\t\t\t\t\t\t: isBuy\n\t\t\t\t\t\t\t\t\t\t? `Minimum amount is ${MIN_FIAT_AMOUNT} ${fiatCode}`\n\t\t\t\t\t\t\t\t\t\t: `Minimum amount is ${MIN_CRYPTO_AMOUNT} ${cryptoCode}`)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* You get card */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\tborderTopLeftRadius: 5,\n\t\t\t\t\t\t\tborderTopRightRadius: 5,\n\t\t\t\t\t\t\tborderBottomLeftRadius: 0,\n\t\t\t\t\t\t\tborderBottomRightRadius: 0,\n\t\t\t\t\t\t\tmarginTop: 4,\n\t\t\t\t\t\t\tminHeight: 102,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\tYou get\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-start justify-between\">\n\t\t\t\t\t\t\t{quotesLoading && !autoSelectPending ? (\n\t\t\t\t\t\t\t\t<Skeleton w={180} h={32} />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<AnimatedNumber\n\t\t\t\t\t\t\t\t\tvalue={spendNumeric > 0 ? displayReceiveAmount : '0'}\n\t\t\t\t\t\t\t\t\theight={32}\n\t\t\t\t\t\t\t\t\tclassName=\"font-semibold\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: spendNumeric > 0 ? 'var(--t-text)' : 'var(--t-text-muted)', fontSize: 24 }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{isBuy ? (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-end shrink-0\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={() => setModal('crypto')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 transition-colors\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationCurrency?.locked}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoIcon ticker={cryptoCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t\t{cryptoCode}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{chainCode && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(chainCode, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={chainCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 14, height: 14 }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{chainDisplay}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setModal('fiat')}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 shrink-0 transition-colors\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceCurrency?.locked}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FiatFlag currencyCode={fiatCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t{fiatCode}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Parity info banner */}\n\t\t\t\t\t{parityActive && spendNumeric > 0 && quotes?.bestQuote && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 mt-[2px] px-[14px] py-[10px]\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', fontSize: 12, color: 'var(--t-text-secondary)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0, marginTop: 1 }}>\n\t\t\t\t\t\t\t\t<circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n\t\t\t\t\t\t\t\t<path d=\"M8 7v4M8 5.5v-.01\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\tYou will be charged for {receiveAmount} {cryptoCode}, the rest up to {formatOutput(spendNumeric)} {fiatCode} will be credited to your {partnerName} account\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Exchange rate row */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-between mt-[2px] px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t...(!config?.paymentMethods?.length ? { borderBottomLeftRadius: 5, borderBottomRightRadius: 5 } : {}),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: successColorProp ? 'var(--t-success)' : 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t{displayRate || '\\u00A0'}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Payment method selector */}\n\t\t\t\t\t{config?.paymentMethods && config.paymentMethods.length > 0 && (\n\t\t\t\t\t\t<div className=\"mt-[2px]\">\n\t\t\t\t\t\t\t<PaymentMethodSelector\n\t\t\t\t\t\t\t\tmethods={config.paymentMethods}\n\t\t\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\t\t\tonOpenModal={() => setModal('payment')}\n\t\t\t\t\t\t\t\tfiatCurrency={state.fiatCurrency}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Wallet address */}\n\t\t\t\t\t<div className=\"mt-8\">\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t{isBuy ? 'Receiving wallet address' : 'Sending wallet address'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tvalue={state.walletAddress}\n\t\t\t\t\t\t\tonChange={(e) => dispatch({ type: 'SET_WALLET_ADDRESS', address: e.target.value })}\n\t\t\t\t\t\t\tonFocus={() => setWalletFocused(true)}\n\t\t\t\t\t\t\tonBlur={() => { setWalletFocused(false); setWalletTouched(true); }}\n\t\t\t\t\t\t\tplaceholder={isBuy ? 'Enter your receiving address' : 'Enter your sending address'}\n\t\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tclassName=\"w-full bg-transparent text-[13px] outline-none transition-colors\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tborder:\n\t\t\t\t\t\t\t\t\tstate.walletError || (walletTouched && !isWalletValid)\n\t\t\t\t\t\t\t\t\t\t? '1px solid #EF4444'\n\t\t\t\t\t\t\t\t\t\t: walletFocused\n\t\t\t\t\t\t\t\t\t\t\t? '1px solid var(--t-border-focus)'\n\t\t\t\t\t\t\t\t\t\t\t: '1px solid var(--t-border)',\n\t\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t\tborderRadius: 3.5,\n\t\t\t\t\t\t\t\theight: 47,\n\t\t\t\t\t\t\t\tpadding: '0 14px',\n\t\t\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\t\t\tfontSize: 13,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationAddress?.locked}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{state.walletError ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t\t{state.walletError}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : walletTouched && !isWalletValid && !walletValidating ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t\tEnter a valid wallet address\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : walletValidating && state.walletAddress.trim().length >= 10 ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\tValidating address...\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex-1\" style={{ minHeight: 16 }} />\n\n\t\t\t\t\t{/* CTA button */}\n\t\t\t\t\t<button\n\t\t\t\t\t\tdisabled={!isFormValid || orderLoading || autoSelectPending}\n\t\t\t\t\t\tonClick={handleCtaClick}\n\t\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t\t\topacity: isFormValid && !orderLoading && !autoSelectPending ? 1 : 0.4,\n\t\t\t\t\t\t\tcursor:\n\t\t\t\t\t\t\t\tisFormValid && !orderLoading && !autoSelectPending ? 'pointer' : 'not-allowed',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{autoSelectPending\n\t\t\t\t\t\t\t? 'Getting best price...'\n\t\t\t\t\t\t\t: orderLoading\n\t\t\t\t\t\t\t\t? 'Processing...'\n\t\t\t\t\t\t\t\t: isBuy\n\t\t\t\t\t\t\t\t\t? `Buy ${cryptoCode}`\n\t\t\t\t\t\t\t\t\t: `Sell ${cryptoCode}`}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t<div className=\"text-center py-3\">\n\t\t\t\t\t\t<span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>\n\t\t\t\t\t\t\tPowered by NowRamp\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Modal overlays */}\n\t\t\t<Modal isOpen={modal === 'fiat'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<FiatCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(v) => {\n\t\t\t\t\t\t\thandleFiatSelect(v);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcurrencies={config?.fiats?.map((f) => ({ code: f.code, name: f.code }))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.fiatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'crypto'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CryptoCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code, chain) => {\n\t\t\t\t\t\t\thandleCryptoSelect(code, chain);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcryptos={config?.cryptos?.map((c) => ({\n\t\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\t\tname: c.code,\n\t\t\t\t\t\t\tnetworks: c.networks?.map((n) => ({ code: n.id, name: n.name })),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.cryptoCurrency}\n\t\t\t\t\t\tselectedChain={state.network}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'payment'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<PaymentMethodModal\n\t\t\t\t\t\tmethods={config?.paymentMethods?.filter((m) => m.supportedFiats.includes(state.fiatCurrency)) || []}\n\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\tonSelect={(id) => {\n\t\t\t\t\t\t\thandlePaymentMethodSelect(id);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'settings'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<SettingsScreen\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\tonToggleDarkMode={setDarkMode}\n\t\t\t\t\t\tskinId={skinId}\n\t\t\t\t\t\tonSelectSkin={(id) => {\n\t\t\t\t\t\t\tsetSkinId(id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\t\tcountry={state.country}\n\t\t\t\t\t\tcountryName={countryName}\n\t\t\t\t\t\tonLocationPress={handleLocationPress}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'country'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CountryPickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\thandleCountrySelect(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.country}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t</div>\n\t);\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport function RampForm({\n\tprojectId,\n\tapiUrl,\n\tassetBaseUrl,\n\tflowType,\n\tcustomerId,\n\tbrandId,\n\tdefaultFiatCurrency,\n\tdefaultCryptoCurrency,\n\tdefaultNetwork,\n\tdefaultFiatAmount,\n\tdefaultCryptoAmount,\n\tdefaultWalletAddress,\n\tdefaultGateway,\n\tdefaultCountry,\n\tfieldLocks,\n\tstatusPollInterval,\n\tonComplete,\n\tonError,\n\tclassName,\n\ttheme,\n\tskinId,\n\taccentColor,\n\tbgColor,\n\tbgImage,\n\tborderColor,\n\tborderRadius,\n\tsurfaceColor,\n\tinputBgColor,\n\ttextColor,\n\ttextSecondaryColor,\n\ttextMutedColor,\n\tsuccessColor,\n\tshowFlowToggle,\n\tshowSettings,\n\tshowThemeToggle,\n\tautoRedirect,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tonDone,\n}: RampFormProps) {\n\treturn (\n\t\t<RampProvider\n\t\t\tprojectId={projectId}\n\t\t\tapiUrl={apiUrl}\n\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\tflowType={flowType}\n\t\t\tcustomerId={customerId}\n\t\t\tbrandId={brandId}\n\t\t\tdefaultFiatCurrency={defaultFiatCurrency}\n\t\t\tdefaultCryptoCurrency={defaultCryptoCurrency}\n\t\t\tdefaultNetwork={defaultNetwork}\n\t\t\tdefaultFiatAmount={defaultFiatAmount}\n\t\t\tdefaultCryptoAmount={defaultCryptoAmount}\n\t\t\tdefaultWalletAddress={defaultWalletAddress}\n\t\t\tdefaultGateway={defaultGateway}\n\t\t\tdefaultCountry={defaultCountry}\n\t\t\tfieldLocks={fieldLocks}\n\t\t\tstatusPollInterval={statusPollInterval}\n\t\t\tonComplete={onComplete}\n\t\t\tonError={onError}\n\t\t>\n\t\t\t<InnerForm\n\t\t\t\tclassName={className}\n\t\t\t\ttheme={theme}\n\t\t\t\tskinId={skinId}\n\t\t\t\taccentColor={accentColor}\n\t\t\t\tbgColor={bgColor}\n\t\t\t\tbgImage={bgImage}\n\t\t\t\tborderColor={borderColor}\n\t\t\t\tborderRadius={borderRadius}\n\t\t\t\tsurfaceColor={surfaceColor}\n\t\t\t\tinputBgColor={inputBgColor}\n\t\t\t\ttextColor={textColor}\n\t\t\t\ttextSecondaryColor={textSecondaryColor}\n\t\t\t\ttextMutedColor={textMutedColor}\n\t\t\t\tsuccessColor={successColor}\n\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\tautoRedirect={autoRedirect}\n\t\t\t\texplorerUrl={explorerUrl}\n\t\t\t\tdoneButtonText={doneButtonText}\n\t\t\t\tsupportEmail={supportEmail}\n\t\t\t\tstablecoinParity={stablecoinParity}\n\t\t\t\tpartnerName={partnerName}\n\t\t\t\tonDone={onDone}\n\t\t\t/>\n\t\t</RampProvider>\n\t);\n}\n","/**\n * CheckoutForm Component\n * Single-page checkout form using the same NowRamp design as RampForm.\n * This is the hosted-checkout variant — both components now produce the\n * same visual since the new design is inherently single-page.\n */\n\nimport { RampForm, type RampFormProps } from './RampForm';\n\nexport interface CheckoutFormProps extends RampFormProps {\n /** Submit button text (legacy — maps to nothing in new design, kept for API compat) */\n submitButtonText?: string;\n /** Rate refresh interval in ms (legacy, kept for API compat) */\n rateRefreshInterval?: number;\n}\n\n/**\n * Hosted checkout form.\n * Now uses the same NowRamp design as RampForm.\n */\nexport function CheckoutForm({\n submitButtonText: _submitButtonText,\n rateRefreshInterval: _rateRefreshInterval,\n ...props\n}: CheckoutFormProps) {\n return <RampForm {...props} />;\n}\n","export interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport function SkinSwatch({\n skin,\n active,\n onClick,\n darkMode,\n dimmed,\n}: {\n skin: Skin;\n active: boolean;\n onClick: () => void;\n darkMode: boolean;\n dimmed: boolean;\n}) {\n const isMono = skin.accent === null;\n const size = 32;\n return (\n <button\n onClick={onClick}\n className=\"relative shrink-0\"\n style={{ width: size, height: size, opacity: dimmed ? 0.4 : 1, transition: 'opacity 0.2s' }}\n >\n {isMono ? (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <clipPath id=\"mono-left\"><rect x=\"0\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <clipPath id=\"mono-right\"><rect x=\"16\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#111111\" clipPath=\"url(#mono-left)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#ffffff\" clipPath=\"url(#mono-right)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"none\" stroke={darkMode ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.1)'} strokeWidth=\"1\" />\n </svg>\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill={skin.accent!} />\n </svg>\n )}\n {active && !dimmed && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{ boxShadow: '0 0 0 2px var(--t-bg), 0 0 0 4px var(--t-text)' }}\n />\n )}\n </button>\n );\n}\n","/**\n * Choose Ramp (Provider) Modal\n * Displays REAL quotes from the aggregation engine in a ranked list.\n * First item (best quote) gets a border outline, remaining items get surface background.\n * Shows loading skeletons while quotes load, and an empty state if no quotes available.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { GenericCoinIcon } from '../ui/icons';\nimport { Skeleton } from '../ui/Skeleton';\nimport type { Quote, QuotesResponse } from '@nowramp/sdk';\n\nexport interface ChooseRampModalProps {\n\tonClose: () => void;\n\tonSelect: (quote: Quote) => void;\n\t/** Real quotes from the aggregation engine */\n\tquotes: QuotesResponse | null;\n\t/** Whether quotes are still loading */\n\tquotesLoading: boolean;\n\t/** The selected crypto currency code (for display) */\n\tcryptoCurrency: string;\n}\n\nfunction QuoteTag({ quote }: { quote: Quote }) {\n\tif (quote.isBestRate) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\tBest price\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.isRecommended) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\tRecommended\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.rank && quote.rank <= 3) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t#{quote.rank}\n\t\t\t</div>\n\t\t);\n\t}\n\treturn null;\n}\n\nfunction ProviderIcon({ quote }: { quote: Quote }) {\n\tif (quote.gatewayLogo) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tsrc={quote.gatewayLogo}\n\t\t\t\talt={quote.gatewayName}\n\t\t\t\twidth={36}\n\t\t\t\theight={36}\n\t\t\t\tclassName=\"rounded-full shrink-0\"\n\t\t\t\tstyle={{ width: 36, height: 36 }}\n\t\t\t/>\n\t\t);\n\t}\n\treturn <GenericCoinIcon size={36} />;\n}\n\nfunction LoadingSkeletons() {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={i}\n\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\theight: 64,\n\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Skeleton w={36} h={36} className=\"rounded-full shrink-0\" />\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Skeleton w={90} h={14} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={60} h={12} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-right\">\n\t\t\t\t\t\t<Skeleton w={40} h={10} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={80} h={14} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function ChooseRampModal({\n\tonClose,\n\tonSelect,\n\tquotes,\n\tquotesLoading,\n\tcryptoCurrency,\n}: ChooseRampModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\tconst filteredQuotes = useMemo(() => {\n\t\tif (!quotes?.quotes) return [];\n\t\tconst raw = search.trim().toLowerCase();\n\t\tif (!raw) return quotes.quotes;\n\t\treturn quotes.quotes.filter((q) => q.gatewayName.toLowerCase().includes(raw));\n\t}, [quotes, search]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tChoose Ramp\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5 space-y-2\">\n\t\t\t\t{quotesLoading ? (\n\t\t\t\t\t<LoadingSkeletons />\n\t\t\t\t) : filteredQuotes.length === 0 ? (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{quotes && quotes.quotes.length === 0\n\t\t\t\t\t\t\t? 'No quotes available for this request'\n\t\t\t\t\t\t\t: 'No providers found'}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\tfilteredQuotes.map((quote, i) => {\n\t\t\t\t\t\tconst isBest = i === 0;\n\t\t\t\t\t\tconst receiveAmount = parseFloat(quote.cryptoAmount);\n\t\t\t\t\t\tconst displayAmount =\n\t\t\t\t\t\t\treceiveAmount >= 1 ? receiveAmount.toFixed(4) : receiveAmount.toPrecision(6);\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={quote.gatewayId}\n\t\t\t\t\t\t\t\tonClick={() => onSelect(quote)}\n\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5 transition-colors\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: isBest ? 4.5 : 5,\n\t\t\t\t\t\t\t\t\theight: isBest ? 63 : 64,\n\t\t\t\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\t\t\t\tborder: isBest ? '1px solid var(--t-border)' : '1px solid transparent',\n\t\t\t\t\t\t\t\t\tbackground: isBest ? 'transparent' : 'var(--t-surface)',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon quote={quote} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{quote.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<QuoteTag quote={quote} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-[11px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\tYou get\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{cryptoCurrency} {displayAmount}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)}\n\n\t\t\t\t{/* Unavailable gateways info */}\n\t\t\t\t{!quotesLoading && quotes?.unavailableGateways && quotes.unavailableGateways.length > 0 && (\n\t\t\t\t\t<div className=\"pt-3\">\n\t\t\t\t\t\t{quotes.unavailableGateways.map((g) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={g.gatewayId}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between py-2 text-[12px]\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-muted)' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{g.gatewayName}</span>\n\t\t\t\t\t\t\t\t<span>{g.reason}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],"names":["useRampConfig","config","orderType","country","data","setData","useState","loading","setLoading","error","setError","apiRef","useRef","RampApi","fetchConfig","useCallback","supportedParams","result","err","useEffect","useQuotes","params","configKeyRef","configKey","fetchIdRef","id","refetch","useCheckoutIntent","order","setOrder","createOrder","reset","useTransaction","transactionId","options","status","setStatus","fetchStatus","delay","timer","interval","COUNTRIES","COUNTRY_MAP","c","getDefaultFiatForCountry","countryCode","supportedFiats","preferredFiat","normalizeAmount","value","maxDecimals","dotIndex","initialState","rampReducer","state","action","RampContext","createContext","RampProvider","projectId","apiUrl","assetBaseUrl","flowType","customerId","brandId","defaultFiatCurrency","defaultCryptoCurrency","defaultNetworkProp","defaultFiatAmount","defaultCryptoAmount","defaultWalletAddress","defaultGateway","defaultCountry","fieldLocks","statusPollInterval","onComplete","onError","children","apiConfig","useMemo","defaultNetwork","initialIsSell","hasAmount","initialStep","effectiveFiatAmount","dispatch","useReducer","isSell","configLoading","configError","geoAppliedRef","React","detected","_a","f","fiat","defaultCountryAppliedRef","prevCountryRef","geoFallbackAppliedRef","prevFiatRef","currentAmount","minAmount","crypto","defaultNet","_b","n","_c","methods","m","match","amountError","amount","min","max","quoteParams","quotes","quotesLoading","quotesError","fetchQuotes","orderLoading","orderError","createOrderApi","CHECKOUT_POLL_INITIAL_DELAY","orderStatus","orderStatusLoading","effectiveDefaultGateway","gatewayRef","quotesRef","brandIdRef","gateway","missing","message","goToStep","step","goBack","stepOrder","currentIndex","canProceed","jsx","useRamp","context","useContext","BLOCKCHAINS","CRYPTO_CURRENCIES","CRYPTO_NAMES","FIAT_TO_COUNTRY","getCryptoIconUrl","ticker","baseUrl","getFiatFlagUrl","currencyCode","getChainInfo","chainCode","getChainIconUrl","chain","FIAT_CURRENCIES","SKINS","MOCK_RATES","STABLECOINS","isStablecoin","code","getMockRate","parseAmount","str","formatOutput","num","s","isValidHex","MIN_FIAT_AMOUNT","MIN_CRYPTO_AMOUNT","CRYPTO_CHAIN_COMBOS","list","LazyIcon","src","alt","size","className","background","loaded","setLoaded","currentSrc","handleLoad","handleError","jsxs","CryptoIcon","FiatFlag","GenericCoinIcon","color","BankIcon","RevolutIcon","ApplePayIcon","GooglePayIcon","PayPalIcon","VisaIcon","MastercardIcon","CardIcon","markW","markH","overlap","CoinifyIcon","ChevronDown","ChevronRight","MenuIcon","onClick","DarkModeIcon","getPaymentIcon","type","ICON_KEY_MAP","SHORT_NAME_MAP","getMethodDisplayName","fullName","getMethodIcon","methodId","icon","iconKey","PaymentMethodSelector","selectedId","onOpenModal","fiatCurrency","filtered","selected","Fragment","e","CheckoutStep","autoRedirect","redirectDelay","iframeLoaded","setIframeLoaded","redirectCountdown","setRedirectCountdown","isExpired","countdownInterval","prev","iframeSrc","allowAttr","createPortal","widgetUrl","buildWidgetUrl","url","key","ProcessingStep","getStatusMessage","DetailRow","label","mono","CompleteStep","explorerUrl","onDone","doneButtonText","getExplorerUrl","defaultExplorers","handleDone","explorerLink","highlight","ErrorStep","onRetry","supportEmail","getErrorTitle","getErrorMessage","handleRetry","handleStartOver","truncateAddress","address","ConfirmStep","stablecoinParity","partnerName","gatewayInfo","g","exchangeRate","fiatNumeric","confirmParityActive","confirmSamePeg","confirmParityAmount","handleConfirm","Modal","isOpen","onClose","mounted","setMounted","animating","setAnimating","t","handleClose","onKey","AnimatedDigit","char","height","digits","idx","d","AnimatedNumber","style","ch","i","Skeleton","w","h","FormSkeleton","CloseButton","SearchInput","onChange","placeholder","focused","setFocused","FiatCurrencyModal","onSelect","currencies","selectedCode","search","setSearch","currencyList","staticMap","raw","rest","displayName","isSelected","CryptoImage","CryptoCurrencyModal","cryptos","selectedChain","comboList","networks","cryptoName","net","terms","scored","chainName","chainShort","name","fields","score","a","b","itemSelected","PaymentMethodModal","shortName","ToggleSwitch","checked","accentColor","SETTINGS_LINKS","SettingsScreen","darkMode","onToggleDarkMode","_skinId","_onSelectSkin","showThemeToggle","countryName","onLocationPress","flagError","setFlagError","GlobeIcon","item","CountryPickerModal","normalizedCode","CountryFlag","InnerForm","theme","skinIdProp","accentColorProp","bgColorProp","bgImageProp","borderColorProp","borderRadiusProp","surfaceColorProp","inputBgColorProp","textColorProp","textSecondaryColorProp","textMutedColorProp","successColorProp","showFlowToggle","showSettings","setDarkMode","skinId","setSkinId","modal","setModal","amountTouched","setAmountTouched","walletTouched","setWalletTouched","walletFocused","setWalletFocused","walletValidating","setWalletValidating","walletServerValid","setWalletServerValid","switching","setSwitching","autoSelectPending","setAutoSelectPending","inputRef","walletValidationTimer","prevTabRef","tab","isBuy","cryptoCode","fiatCode","spendAmount","spendNumeric","quoteRate","lastRateRef","receiveAmount","amt","parityActive","isSamePeg","parityAmount","displayReceiveAmount","displayRate","r","cc","fc","addr","network","abortController","msg","amountIsEmpty","amountBelowMin","hasAmountError","isAmountValid","isWalletValid","isFormValid","handleAmountChange","handleTabSwitch","newTab","handleFiatSelect","handleCryptoSelect","handlePaymentMethodSelect","handleCountrySelect","handleLocationPress","handleCtaClick","reasons","themeClass","activeSkin","isMono","hasCustomAccent","getCtaTextColor","hex","accentStyle","themeOverrides","backgroundStyle","pillTextColor","borderStyle","postFormStep","chainInfo","chainDisplay","_d","_e","_f","_g","_h","_i","close","v","RampForm","bgColor","bgImage","borderColor","borderRadius","surfaceColor","inputBgColor","textColor","textSecondaryColor","textMutedColor","successColor","CheckoutForm","_submitButtonText","_rateRefreshInterval","props","SkinSwatch","skin","active","dimmed","QuoteTag","quote","ProviderIcon","LoadingSkeletons","ChooseRampModal","cryptoCurrency","filteredQuotes","q","isBest","displayAmount"],"mappings":"2LA2DO,SAASA,GACdC,EACAC,EACAC,EACqB,CACrB,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAiC,IAAI,EACvD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAI,EACrC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAuB,IAAI,EAC/CK,EAASC,EAAAA,OAAuB,IAAI,GAGtC,CAACD,EAAO,SAAWA,EAAO,UAAYV,KACxCU,EAAO,QAAU,IAAIE,GAAAA,QAAQ,CAAE,OAAQ,GAAI,GAAGZ,EAAQ,GAGxD,MAAMa,EAAcC,EAAAA,YAAY,SAAY,CAC1C,GAAI,CAACd,EAAO,UAAW,CACrBS,EAAS,IAAI,MAAM,uBAAuB,CAAC,EAC3CF,EAAW,EAAK,EAChB,MACF,CAEAA,EAAW,EAAI,EACfE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMM,EAAsC,CAAA,EACxCd,MAA2B,UAAYA,GACvCC,MAAyB,QAAUA,GACvC,MAAMc,EAAS,MAAMN,EAAO,QAAS,aAAaK,CAAe,EACjEX,EAAQY,CAAM,CAChB,OAASC,EAAK,CACZR,EAASQ,aAAe,MAAQA,EAAM,IAAI,MAAM,wBAAwB,CAAC,CAC3E,QAAA,CACEV,EAAW,EAAK,CAClB,CACF,EAAG,CAACP,EAAO,UAAWC,EAAWC,CAAO,CAAC,EAEzCgB,OAAAA,EAAAA,UAAU,IAAM,CACdL,EAAA,CACF,EAAG,CAACA,CAAW,CAAC,EAET,CAAE,OAAQV,EAAM,QAAAG,EAAS,MAAAE,EAAO,QAASK,CAAA,CAClD,CAMO,SAASM,GACdnB,EACAoB,EACiB,CACjB,KAAM,CAACjB,EAAMC,CAAO,EAAIC,EAAAA,SAAgC,IAAI,EACtD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAuB,IAAI,EAC/CK,EAASC,EAAAA,OAAuB,IAAI,EACpCU,EAAeV,EAAAA,OAAO,EAAE,EAGxBW,EAAY,GAAGtB,EAAO,MAAM,IAAIA,EAAO,SAAS,IAClD,CAACU,EAAO,SAAWW,EAAa,UAAYC,KAC9CZ,EAAO,QAAU,IAAIE,GAAAA,QAAQ,CAAE,OAAQ,GAAI,GAAGZ,EAAQ,EACtDqB,EAAa,QAAUC,GAGzB,MAAMC,EAAaZ,EAAAA,OAAO,CAAC,EAE3BO,EAAAA,UAAU,IAAM,CAEd,MAAMM,EAAK,EAAED,EAAW,QAExB,GAAI,CAACH,GAAU,CAACpB,EAAO,UAAW,CAChCI,EAAQ,IAAI,EACZG,EAAW,EAAK,EAChB,MACF,CAEAA,EAAW,EAAI,EACfE,EAAS,IAAI,EAEbC,EAAO,QAAS,UAAUU,CAAM,EAAE,KAC/BJ,GAAW,CACNO,EAAW,UAAYC,IACzBpB,EAAQY,CAAM,EACdT,EAAW,EAAK,EAEpB,EACCU,GAAQ,CACHM,EAAW,UAAYC,IACzBf,EAASQ,aAAe,MAAQA,EAAM,IAAI,MAAM,wBAAwB,CAAC,EACzEb,EAAQ,IAAI,EACZG,EAAW,EAAK,EAEpB,CAAA,CAEJ,EAAG,CAACP,EAAO,UAAWoB,GAAA,YAAAA,EAAQ,aAAcA,GAAA,YAAAA,EAAQ,WAAYA,GAAA,YAAAA,EAAQ,aAAcA,GAAA,YAAAA,EAAQ,eAAgBA,GAAA,YAAAA,EAAQ,QAASA,GAAA,YAAAA,EAAQ,gBAAiBA,GAAA,YAAAA,EAAQ,QAASA,GAAA,YAAAA,EAAQ,SAAS,CAAC,EAE3L,MAAMK,EAAUX,EAAAA,YAAY,SAAY,CACtC,GAAI,GAACM,GAAU,CAACpB,EAAO,WACvB,CAAAO,EAAW,EAAI,EACfE,EAAS,IAAI,EACb,GAAI,CACF,MAAMO,EAAS,MAAMN,EAAO,QAAS,UAAUU,CAAM,EACrDhB,EAAQY,CAAM,CAChB,OAASC,EAAK,CACZR,EAASQ,aAAe,MAAQA,EAAM,IAAI,MAAM,wBAAwB,CAAC,CAC3E,QAAA,CACEV,EAAW,EAAK,CAClB,EACF,EAAG,CAACP,EAAO,UAAWoB,CAAM,CAAC,EAE7B,MAAO,CAAE,OAAQjB,EAAM,QAAAG,EAAS,MAAAE,EAAO,QAAAiB,CAAA,CACzC,CAKO,SAASC,GACd1B,EACyB,CACzB,KAAM,CAAC2B,EAAOC,CAAQ,EAAIvB,EAAAA,SAAgC,IAAI,EACxD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAuB,IAAI,EAC/CK,EAASC,EAAAA,OAAuB,IAAI,EACpCU,EAAeV,EAAAA,OAAO,EAAE,EAGxBW,EAAY,GAAGtB,EAAO,MAAM,IAAIA,EAAO,SAAS,IAClD,CAACU,EAAO,SAAWW,EAAa,UAAYC,KAC9CZ,EAAO,QAAU,IAAIE,GAAAA,QAAQ,CAAE,OAAQ,GAAI,GAAGZ,EAAQ,EACtDqB,EAAa,QAAUC,GAGzB,MAAMO,EAAcf,cAAY,MAAOM,GAAgE,CACrGb,EAAW,EAAI,EACfE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMO,EAAS,MAAMN,EAAO,QAAS,qBAAqBU,CAAM,EAChE,OAAAQ,EAASZ,CAAM,EACRA,CACT,OAASC,EAAK,CACZ,MAAMT,EAAQS,aAAe,MAAQA,EAAM,IAAI,MAAM,kCAAkC,EACvF,MAAAR,EAASD,CAAK,EACRA,CACR,QAAA,CACED,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAECuB,EAAQhB,EAAAA,YAAY,IAAM,CAC9Bc,EAAS,IAAI,EACbnB,EAAS,IAAI,CACf,EAAG,CAAA,CAAE,EAEL,MAAO,CAAE,MAAAkB,EAAO,QAAArB,EAAS,MAAAE,EAAO,YAAAqB,EAAa,MAAAC,CAAA,CAC/C,CAKO,SAASC,GACd/B,EACAgC,EACAC,EACsB,CACtB,KAAM,CAACC,EAAQC,CAAS,EAAI9B,EAAAA,SAA6B,IAAI,EACvD,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAuB,IAAI,EAC/CK,EAASC,EAAAA,OAAuB,IAAI,EAErCD,EAAO,UACVA,EAAO,QAAU,IAAIE,GAAAA,QAAQ,CAAE,OAAQ,GAAI,UAAW,GAAI,GAAGZ,EAAQ,GAGvE,MAAMoC,EAActB,EAAAA,YAAY,SAAY,CAC1C,GAAKkB,EAEL,CAAAzB,EAAW,EAAI,EACfE,EAAS,IAAI,EAEb,GAAI,CACF,MAAMO,EAAS,MAAMN,EAAO,QAAS,eAAesB,CAAa,EACjEG,EAAUnB,CAAM,CAClB,OAASC,EAAK,CACZR,EAASQ,aAAe,MAAQA,EAAM,IAAI,MAAM,wBAAwB,CAAC,CAC3E,QAAA,CACEV,EAAW,EAAK,CAClB,EACF,EAAG,CAACyB,CAAa,CAAC,EAGlBd,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACc,EAAe,OAEpB,MAAMK,GAAQJ,GAAA,YAAAA,EAAS,eAAgB,EACvC,GAAII,EAAQ,EAAG,CACb,MAAMC,EAAQ,WAAWF,EAAaC,CAAK,EAC3C,MAAO,IAAM,aAAaC,CAAK,CACjC,CAEAF,EAAA,CACF,EAAG,CAACA,EAAaJ,EAAeC,GAAA,YAAAA,EAAS,YAAY,CAAC,EAMtDf,EAAAA,UAAU,IAAM,CAQd,GAPI,CAACc,GAAiB,EAACC,GAAA,MAAAA,EAAS,eAG5B,CAACC,GAGoB,CAAC,YAAa,SAAU,YAAa,UAAW,UAAU,EAC9D,SAASA,EAAO,MAAM,EACzC,OAGF,MAAMK,EAAW,YAAYH,EAAaH,EAAQ,YAAY,EAC9D,MAAO,IAAM,cAAcM,CAAQ,CACrC,EAAG,CAACP,EAAeC,GAAA,YAAAA,EAAS,aAAcC,GAAA,YAAAA,EAAQ,OAAQE,CAAW,CAAC,EAE/D,CAAE,OAAAF,EAAQ,QAAA5B,EAAS,MAAAE,EAAO,QAAS4B,CAAA,CAC5C,CC/QO,MAAMI,GAAuB,CAClC,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,uBAAwB,YAAa,KAAA,EACzD,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,sBAAuB,YAAa,KAAA,EACxD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,yBAA0B,YAAa,KAAA,EAC3D,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,2BAA4B,YAAa,KAAA,EAC7D,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,gBAAiB,YAAa,KAAA,EAClD,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,iBAAkB,YAAa,KAAA,EACnD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,qBAAsB,YAAa,KAAA,EACvD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,iBAAkB,YAAa,KAAA,EACnD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,oBAAqB,YAAa,KAAA,EACtD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,gBAAiB,YAAa,KAAA,EAClD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,wBAAyB,YAAa,KAAA,EAC1D,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,gBAAiB,YAAa,KAAA,EAClD,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,kBAAmB,YAAa,KAAA,EACpD,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,mBAAoB,YAAa,KAAA,EACrD,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,kBAAmB,YAAa,KAAA,EACpD,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,OAAQ,YAAa,KAAA,EACzC,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,cAAe,YAAa,KAAA,EAChD,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,sBAAuB,YAAa,KAAA,EACxD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,EAC7C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,gBAAiB,YAAa,KAAA,EAClD,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,aAAc,YAAa,KAAA,EAC/C,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,mCAAoC,YAAa,KAAA,EACrE,CAAE,KAAM,KAAM,KAAM,YAAa,YAAa,KAAA,EAC9C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,UAAW,YAAa,KAAA,EAC5C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,QAAS,YAAa,KAAA,EAC1C,CAAE,KAAM,KAAM,KAAM,eAAgB,YAAa,KAAA,EACjD,CAAE,KAAM,KAAM,KAAM,SAAU,YAAa,KAAA,EAC3C,CAAE,KAAM,KAAM,KAAM,WAAY,YAAa,KAAA,CAC/C,EAGaC,GAAuC,OAAO,YACzDD,GAAU,IAAKE,GAAM,CAACA,EAAE,KAAMA,CAAC,CAAC,CAClC,EAMO,SAASC,GACdC,EACAC,EACQ,CACR,GAAI,CAACD,EAAa,MAAO,MAEzB,MAAM1C,EAAUuC,GAAYG,EAAY,YAAA,CAAa,EAC/CE,GAAgB5C,GAAA,YAAAA,EAAS,cAAe,MAM9C,MAHI,CAAC2C,GAAkBA,EAAe,SAAW,GAG7CA,EAAe,SAASC,CAAa,EAAUA,EAG/CD,EAAe,SAAS,KAAK,EAAU,MAGpCA,EAAe,CAAC,GAAK,KAC9B,CC9GA,SAASE,GAAgBC,EAAeC,EAA6B,CACnE,GAAI,CAACD,EAAO,OAAOA,EACnB,MAAME,EAAWF,EAAM,QAAQ,GAAG,EAClC,GAAIE,IAAa,GAAI,OAAOF,EAC5B,IAAIhC,EAASgC,EACb,OAAIhC,EAAO,OAASkC,EAAW,EAAID,IACjCjC,EAASA,EAAO,MAAM,EAAGkC,EAAWD,EAAc,CAAC,GAErDjC,EAASA,EAAO,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,EAC7CA,CACT,CAMA,MAAMmC,GAA8B,CAClC,KAAM,SACN,SAAU,MACV,aAAc,MACd,WAAY,GACZ,eAAgB,GAChB,aAAc,GACd,QAAS,GACT,gBAAiB,GACjB,cAAe,GACf,YAAa,KACb,iBAAkB,KAClB,cAAe,KACf,WAAY,GACZ,MAAO,GACP,QAAS,GACT,cAAe,GACf,aAAc,IAChB,EAEA,SAASC,GAAYC,EAAsBC,EAAmC,CAC5E,OAAQA,EAAO,KAAA,CACb,IAAK,WACH,MAAO,CAAE,GAAGD,EAAO,KAAMC,EAAO,KAAM,aAAc,IAAA,EACtD,IAAK,gBACH,MAAO,CACL,GAAGD,EACH,SAAUC,EAAO,SACjB,WAAY,GACZ,aAAc,GACd,gBAAiB,GACjB,cAAe,KACf,iBAAkB,KAClB,aAAc,IAAA,EAElB,IAAK,oBACH,MAAO,CAAE,GAAGD,EAAO,aAAcC,EAAO,QAAA,EAC1C,IAAK,kBACH,MAAO,CAAE,GAAGD,EAAO,WAAYC,EAAO,MAAA,EACxC,IAAK,sBACH,MAAO,CAAE,GAAGD,EAAO,eAAgBC,EAAO,SAAU,QAAS,EAAA,EAC/D,IAAK,oBACH,MAAO,CAAE,GAAGD,EAAO,aAAcC,EAAO,MAAA,EAC1C,IAAK,cACH,MAAO,CAAE,GAAGD,EAAO,QAASC,EAAO,OAAA,EACrC,IAAK,mBACH,MAAO,CAAE,GAAGD,EAAO,QAASC,EAAO,KAAA,EACrC,IAAK,qBACH,MAAO,CAAE,GAAGD,EAAO,gBAAiBC,EAAO,QAAA,EAC7C,IAAK,qBACH,MAAO,CAAE,GAAGD,EAAO,cAAeC,EAAO,QAAS,YAAa,IAAA,EACjE,IAAK,mBACH,MAAO,CAAE,GAAGD,EAAO,YAAaC,EAAO,OAAA,EACzC,IAAK,eACH,MAAO,CACL,GAAGD,EACH,cAAeC,EAAO,MACtB,iBAAkBA,EAAO,MAAM,SAAA,EAEnC,IAAK,kBACH,MAAO,CAAE,GAAGD,EAAO,WAAYC,EAAO,UAAA,EACxC,IAAK,YACH,MAAO,CAAE,GAAGD,EAAO,MAAOC,EAAO,KAAA,EACnC,IAAK,cACH,MAAO,CAAE,GAAGD,EAAO,QAASC,EAAO,QAAS,cAAe,QAAA,EAC7D,IAAK,mBACH,MAAO,CAAE,GAAGD,EAAO,QAASC,EAAO,QAAS,cAAe,MAAA,EAC7D,IAAK,YACH,MAAO,CAAE,GAAGD,EAAO,KAAM,QAAS,aAAcC,EAAO,OAAA,EACzD,IAAK,cACH,MAAO,CAAE,GAAGD,EAAO,aAAc,IAAA,EACnC,IAAK,QACH,OAAOF,GACT,QACE,OAAOE,CAAA,CAEb,CAMA,MAAME,GAAcC,EAAAA,cAAuC,IAAI,EA0CxD,SAASC,GAAa,CAC3B,UAAAC,EACA,OAAAC,EAAS,0BACT,aAAAC,EAAe,GACf,SAAAC,EAAW,MACX,WAAAC,EAAa,GACb,QAAAC,EACA,oBAAAC,EAAsB,MACtB,sBAAAC,EAAwB,MACxB,eAAgBC,EAAqB,GACrC,kBAAAC,EAAoB,GACpB,oBAAAC,EAAsB,GACtB,qBAAAC,EAAuB,GACvB,eAAAC,EACA,eAAAC,EACA,WAAAC,EACA,mBAAAC,EAAqB,IACrB,WAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAAsB,CACpB,MAAMC,EAAYC,UAAQ,KAAO,CAAE,OAAAnB,EAAQ,UAAAD,IAAc,CAACC,EAAQD,CAAS,CAAC,EAGtEqB,EAAiBb,IAAuBD,EAAwBA,EAAsB,cAAgB,IAItGe,EAAgBnB,IAAa,OAC7BoB,EAAYD,EAAgB,CAAC,CAACZ,EAAsB,CAAC,CAACD,EAItDe,GAHeF,EACjB,CAAC,EAAEC,GAAahB,GAAyBc,GACzC,CAAC,EAAEE,GAAahB,GAAyBc,GAAkBV,KAChBC,EAAkB,UAAY,SAIvEa,EAAsBhB,IAAsBN,IAAa,MAAQ,MAAQ,IACzE,CAACR,EAAO+B,CAAQ,EAAIC,EAAAA,WAAWjC,GAAa,CAChD,GAAGD,GACH,KAAM+B,EACN,SAAArB,EACA,aAAcG,EACd,eAAgBC,EAChB,QAASc,EACT,WAAYhC,GAAgBoC,EAAqB,CAAC,EAClD,aAAcpC,GAAgBqB,EAAqB,CAAC,EACpD,cAAeC,EACf,WAAAP,EAEA,GAAIS,EAAiB,CAAE,QAASA,EAAe,cAAe,cAAe,UAAsB,CAAA,CAAC,CACrG,EAEKe,EAASjC,EAAM,WAAa,OAI5B,CACJ,OAAArD,EACA,QAASuF,GACT,MAAOC,EAAA,EACLzF,GAAc8E,EAAWxB,EAAM,SAAUA,EAAM,SAAW,MAAS,EAGjEoC,GAAgB9E,EAAAA,OAAO,EAAK,EAClC+E,EAAM,UAAU,IAAM,OAIpB,GAHID,GAAc,SACd,EAACzF,GAAA,MAAAA,EAAQ,kBAETqD,EAAM,QAAS,OAEnBoC,GAAc,QAAU,GACxB,MAAME,EAAW3F,EAAO,gBAAgB,YAAA,EACxCoF,EAAS,CAAE,KAAM,mBAAoB,QAASO,EAAU,EAGxD,MAAM9C,GAAiB+C,EAAA5F,EAAO,QAAP,YAAA4F,EAAc,IAAKC,GAAMA,EAAE,MAC5CC,EAAOnD,GAAyBgD,EAAU9C,CAAc,EAC1DiD,IAASzC,EAAM,cACjB+B,EAAS,CAAE,KAAM,oBAAqB,SAAUU,EAAM,CAE1D,EAAG,CAAC9F,EAAQqD,EAAM,QAASA,EAAM,YAAY,CAAC,EAG9C,MAAM0C,EAA2BpF,EAAAA,OAAO,EAAK,EAC7C+E,EAAM,UAAU,IAAM,OAEpB,GADIK,EAAyB,SACzB,CAACxB,GAAkB,GAACqB,EAAA5F,GAAA,YAAAA,EAAQ,QAAR,MAAA4F,EAAe,QAAQ,OAE/CG,EAAyB,QAAU,GACnC,MAAMlD,EAAiB7C,EAAO,MAAM,IAAK6F,GAAMA,EAAE,IAAI,EAC/CC,EAAOnD,GAAyB4B,EAAgB1B,CAAc,EAChEiD,IAASzC,EAAM,cACjB+B,EAAS,CAAE,KAAM,oBAAqB,SAAUU,EAAM,CAE1D,EAAG,CAACvB,EAAgBvE,EAAQqD,EAAM,YAAY,CAAC,EAK/C,MAAM2C,GAAiBrF,EAAAA,OAAO0C,EAAM,OAAO,EAC3CqC,EAAM,UAAU,IAAM,OASpB,GARIrC,EAAM,UAAY2C,GAAe,UACrCA,GAAe,QAAU3C,EAAM,QAC3BA,EAAM,gBAAkB,WAC1B4C,GAAsB,QAAU,IAI9B5C,EAAM,gBAAkB,WACxB,GAACuC,EAAA5F,GAAA,YAAAA,EAAQ,QAAR,MAAA4F,EAAe,QAAQ,OAE5B,MAAM/C,EAAiB7C,EAAO,MAAM,IAAK6F,GAAMA,EAAE,IAAI,EAC/CC,EAAOnD,GAAyBU,EAAM,QAASR,CAAc,EAC/DiD,IAASzC,EAAM,cACjB+B,EAAS,CAAE,KAAM,oBAAqB,SAAUU,EAAM,CAE1D,EAAG,CAACzC,EAAM,QAASA,EAAM,cAAerD,EAAQqD,EAAM,YAAY,CAAC,EAInE,MAAM6C,EAAcvF,EAAAA,OAAO0C,EAAM,YAAY,EAC7CqC,EAAM,UAAU,IAAM,OAIpB,GAHIrC,EAAM,eAAiB6C,EAAY,UACvCA,EAAY,QAAU7C,EAAM,aAExBiC,GAAU,GAACM,EAAA5F,GAAA,YAAAA,EAAQ,QAAR,MAAA4F,EAAe,SAAU,CAACvC,EAAM,YAAY,OAE3D,MAAMyC,EAAO9F,EAAO,MAAM,KAAM6F,GAAMA,EAAE,OAASxC,EAAM,YAAY,EACnE,GAAI,EAACyC,GAAA,MAAAA,EAAM,WAAW,OAEtB,MAAMK,EAAgB,WAAW9C,EAAM,UAAU,EAC3C+C,EAAY,WAAWN,EAAK,SAAS,EACvC,CAAC,MAAMK,CAAa,GAAK,CAAC,MAAMC,CAAS,GAAKD,EAAgBC,GAChEhB,EAAS,CAAE,KAAM,kBAAmB,OAAQ,OAAO,KAAK,KAAKgB,CAAS,CAAC,EAAG,CAE9E,EAAG,CAAC/C,EAAM,aAAcA,EAAM,WAAYrD,EAAQsF,CAAM,CAAC,EAGzDI,EAAM,UAAU,IAAM,WACpB,GAAI,CAAC1F,GAAU,CAACqD,EAAM,gBAAkBA,EAAM,QAAS,OACvD,MAAMgD,GAAST,EAAA5F,EAAO,UAAP,YAAA4F,EAAgB,KAAMlD,GAAWA,EAAE,OAASW,EAAM,gBAC3DiD,IAAaC,EAAAF,GAAA,YAAAA,EAAQ,WAAR,YAAAE,EAAkB,KAAMC,GAAWA,EAAE,eAAcC,EAAAJ,GAAA,YAAAA,EAAQ,WAAR,YAAAI,EAAmB,IACrFH,GAAA,MAAAA,EAAY,IACdlB,EAAS,CAAE,KAAM,cAAe,QAASkB,EAAW,GAAI,CAE5D,EAAG,CAACtG,EAAQqD,EAAM,eAAgBA,EAAM,OAAO,CAAC,EAGhDqC,EAAM,UAAU,IAAM,SACpB,GAAI,GAACE,EAAA5F,GAAA,YAAAA,EAAQ,iBAAR,MAAA4F,EAAwB,QAAQ,OACrC,MAAME,EAAOzC,EAAM,aACbqD,EAAU1G,EAAO,eAGvB,GAAIqD,EAAM,iBACWqD,EAAQ,KACxBC,GAAMA,EAAE,KAAOtD,EAAM,iBAAmBsD,EAAE,eAAe,SAASb,CAAI,CAAA,EAEzD,OAOlB,MAAMc,EAHYF,EAAQ,KACvBC,GAAMA,EAAE,eAAe,SAASb,CAAI,IAAMa,EAAE,GAAG,SAAS,MAAM,GAAKA,EAAE,GAAG,SAAS,OAAO,EAAA,GAEhED,EAAQ,KAAMC,GAAMA,EAAE,eAAe,SAASb,CAAI,CAAC,EAC9EV,EAAS,CAAE,KAAM,qBAAsB,UAAUwB,GAAA,YAAAA,EAAO,OAAML,EAAAG,EAAQ,CAAC,IAAT,YAAAH,EAAY,KAAM,EAAA,CAAI,CACtF,EAAG,CAACvG,EAAQqD,EAAM,aAAcA,EAAM,eAAe,CAAC,EAKtD,MAAMwD,EAAc/B,EAAAA,QAAQ,IAAM,CAChC,GAAIQ,EAAQ,CAEV,GAAI,CAACjC,EAAM,aAAc,OAAO,KAChC,MAAMyD,EAAS,WAAWzD,EAAM,YAAY,EAC5C,OAAI,MAAMyD,CAAM,GAAKA,GAAU,EAAU,uBAClC,IACT,CAEA,GAAI,CAAC9G,GAAU,CAACqD,EAAM,WAAY,OAAO,KAEzC,MAAMyD,EAAS,WAAWzD,EAAM,UAAU,EAC1C,GAAI,MAAMyD,CAAM,EAAG,OAAO,KAE1B,MAAMhB,EAAO9F,EAAO,MAAM,KAAM6F,GAAMA,EAAE,OAASxC,EAAM,YAAY,EACnE,GAAI,CAACyC,EAAM,OAAO,KAElB,MAAMiB,EAAM,WAAWjB,EAAK,SAAS,EAC/BkB,EAAM,WAAWlB,EAAK,SAAS,EAErC,MAAI,CAAC,MAAMiB,CAAG,GAAKD,EAASC,EACnB,qBAAqBjB,EAAK,SAAS,IAAIzC,EAAM,YAAY,GAE9D,CAAC,MAAM2D,CAAG,GAAKF,EAASE,EACnB,qBAAqBlB,EAAK,SAAS,IAAIzC,EAAM,YAAY,GAE3D,IACT,EAAG,CAACrD,EAAQqD,EAAM,WAAYA,EAAM,aAAcA,EAAM,aAAciC,CAAM,CAAC,EAKvE2B,EAAcnC,EAAAA,QAAQ,IAAM,CAChC,MAAMG,EAAYK,EAAS,CAAC,CAACjC,EAAM,aAAe,CAAC,CAACA,EAAM,WAQ1D,MAPI,CAACrD,GAAU,CAACiF,GAAa,CAAC5B,EAAM,gBAAkB,CAACA,EAAM,SAGzDwD,GAIA7G,EAAO,iBAAmBqD,EAAM,gBAAkB,IAAM,CAACkB,EACpD,KAEF,CACL,aAAclB,EAAM,aACpB,GAAIiC,EAAS,CAAE,aAAcjC,EAAM,cAAiB,CAAE,WAAYA,EAAM,UAAA,EACxE,eAAgBA,EAAM,eACtB,QAASA,EAAM,QACf,gBAAiBA,EAAM,iBAAmB,OAC1C,QAASA,EAAM,SAAW,OAC1B,UAAWA,EAAM,QAAA,CAErB,EAAG,CAACrD,EAAQqD,EAAM,aAAcA,EAAM,WAAYA,EAAM,aAAcA,EAAM,eAAgBA,EAAM,QAASA,EAAM,gBAAiBA,EAAM,QAASA,EAAM,cAAewD,EAAavB,EAAQjC,EAAM,SAAUkB,CAAc,CAAC,EAEpN,CACJ,OAAA2C,EACA,QAASC,GACT,MAAOC,GACP,QAASC,EAAA,EACPlG,GAAU0D,EAAWoC,CAAW,EAK9BhB,GAAwBtF,EAAAA,OAAO,EAAK,EAC1C+E,EAAM,UAAU,IAAM,CAChBO,GAAsB,SAEtB5C,EAAM,gBAAkB,SAExB8D,IAAiB,CAACF,GAGlBG,IAAe,CAACF,GAEhBA,EAAO,WAEP7D,EAAM,eAAiB,QAE3B4C,GAAsB,QAAU,GAChCb,EAAS,CAAE,KAAM,oBAAqB,SAAU,MAAO,EACvDA,EAAS,CAAE,KAAM,kBAAmB,OAAQ,MAAO,GACrD,EAAG,CAAC8B,EAAQC,GAAeC,GAAaH,EAAa5D,EAAM,cAAeA,EAAM,YAAY,CAAC,EAG7F,KAAM,CACJ,MAAA1B,EACA,QAAS2F,GACT,MAAOC,GACP,YAAaC,EAAA,EACX9F,GAAkBmD,CAAS,EAQzB4C,GAA8B,KAE9B,CACJ,OAAQC,EACR,QAASC,EAAA,EACP5F,GACF,CAAE,OAAA4B,CAAA,GACFhC,GAAA,YAAAA,EAAO,UAAW,KAClB,CAAE,aAAc8C,EAAoB,aAAcgD,EAAA,CAA4B,EAIhF/B,EAAM,UAAU,IAAM,EAChBgC,GAAA,YAAAA,EAAa,UAAW,aAAehD,GACzCA,EAAWgD,CAAW,CAE1B,EAAG,CAACA,GAAA,YAAAA,EAAa,OAAQhD,CAAU,CAAC,EAKpCgB,EAAM,UAAU,IAAM,CACpB,MAAMlF,EAAQgF,IAAe+B,GACzB/G,GAASmE,GACXA,EAAQnE,CAAK,CAEjB,EAAG,CAACgF,GAAa+B,GAAY5C,CAAO,CAAC,EAGrC,MAAMiD,GAA0BtD,IAAkBtE,GAAA,YAAAA,EAAQ,iBAAkB,KAItE6H,GAAalH,EAAAA,OAAOiH,EAAuB,EACjDC,GAAW,QAAUD,GAErB,MAAME,GAAYnH,EAAAA,OAAOuG,CAAM,EAC/BY,GAAU,QAAUZ,EAEpB,MAAMa,GAAapH,EAAAA,OAAOoD,CAAO,EACjCgE,GAAW,QAAUhE,EAGrB,MAAMlC,GAAcf,EAAAA,YAAY,SAAY,WAC1C,MAAMkH,IAAUpC,EAAAvC,EAAM,gBAAN,YAAAuC,EAAqB,cAAaa,GAAAF,EAAAuB,GAAU,UAAV,YAAAvB,EAAmB,YAAnB,YAAAE,EAA8B,YAAaoB,GAAW,QACxG,GAAI,CAACG,GAAW,CAAC3E,EAAM,cAAe,CACpC,MAAM4E,EAAU,CAAC,CAACD,GAAW,UAAW,CAAC3E,EAAM,eAAiB,eAAe,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAC1G+B,EAAS,CAAE,KAAM,YAAa,QAAS,4BAA4B6C,CAAO,GAAI,EAC9E,MACF,CAEA,GAAI,CACF,MAAMT,GAAe,CACnB,QAAAQ,EACA,WAAY3E,EAAM,YAAc,OAChC,aAAcA,EAAM,aACpB,GAAIiC,EACA,CAAE,aAAcjC,EAAM,cACtB,CAAE,WAAYA,EAAM,UAAA,EAExB,eAAgBA,EAAM,eACtB,QAASA,EAAM,QACf,cAAeA,EAAM,cACrB,gBAAiBA,EAAM,iBAAmB,OAC1C,MAAOA,EAAM,OAAS,OACtB,UAAWA,EAAM,SACjB,GAAI0E,GAAW,QAAU,CAAE,SAAU,CAAE,MAAOA,GAAW,OAAA,GAAc,CAAA,CAAC,CACzE,EAGD3C,EAAS,CAAE,KAAM,WAAY,KAAM,WAAY,CACjD,OAASnE,EAAK,CACZ,MAAMiH,EAAUjH,aAAe,MAAQA,EAAI,QAAU,yBAEjD,kBAAkB,KAAKiH,CAAO,EAChC9C,EAAS,CAAE,KAAM,mBAAoB,QAAS8C,EAAQ,QAAQ,yCAA0C,EAAE,EAAG,EAE7G9C,EAAS,CAAE,KAAM,YAAa,QAAA8C,CAAA,CAAS,CAE3C,CACF,EAAG,CAAC7E,EAAOmE,GAAgBlC,CAAM,CAAC,EAG5B6C,GAAWrH,cAAasH,GAAmB,CAC/ChD,EAAS,CAAE,KAAM,WAAY,KAAAgD,CAAA,CAAM,CACrC,EAAG,CAAA,CAAE,EAECC,GAASvH,EAAAA,YAAY,IAAM,CAC/B,MAAMwH,EAAwB,CAAC,UAAW,SAAU,SAAU,SAAU,WAAY,aAAc,UAAU,EACtGC,EAAeD,EAAU,QAAQjF,EAAM,IAAI,EAC7CkF,EAAe,GACjBnD,EAAS,CAAE,KAAM,WAAY,KAAMkD,EAAUC,EAAe,CAAC,EAAG,CAEpE,EAAG,CAAClF,EAAM,KAAMiC,CAAM,CAAC,EAGjBkD,GAAa1D,EAAAA,QAAQ,IAAM,CAC/B,MAAMG,EAAYK,EAAS,CAAC,CAACjC,EAAM,aAAe,CAAC,CAACA,EAAM,WAC1D,OAAQA,EAAM,KAAA,CACZ,IAAK,UACH,MAAO,CAAC,EAAE4B,GAAa5B,EAAM,gBAAkBA,EAAM,SAAWA,EAAM,eAAiB,CAACwD,GAC1F,IAAK,SACH,MAAO,CAAC,EAAE5B,GAAa5B,EAAM,gBAAkBA,EAAM,SAAW,CAACwD,GACnE,IAAK,SACH,MAAO,CAAC,CAACxD,EAAM,cACjB,IAAK,SACH,MAAO,CAAC,CAACA,EAAM,cACjB,QACE,MAAO,EAAA,CAEb,EAAG,CAACA,EAAOwD,EAAavB,CAAM,CAAC,EAEzBtC,GAA0B,CAC9B,UAAA6B,EACA,aAAAjB,EACA,OAAA5D,EACA,cAAAuF,GACA,YAAAC,GACA,MAAAnC,EACA,SAAA+B,EACA,OAAA8B,EACA,cAAAC,GACA,YAAAC,GACA,YAAAC,GACA,MAAA1F,EACA,aAAA2F,GACA,WAAAC,GACA,YAAA1F,GACA,YAAA6F,EACA,mBAAAC,GACA,WAAYnD,GAAc,KAC1B,eAAgBoD,GAChB,YAAAf,EACA,SAAAsB,GACA,OAAAE,GACA,WAAAG,EAAA,EAGF,OACEC,EAAAA,IAAClF,GAAY,SAAZ,CAAqB,MAAAP,GACnB,SAAA4B,CAAA,CACH,CAEJ,CAKO,SAAS8D,IAA4B,CAC1C,MAAMC,EAAUC,EAAAA,WAAWrF,EAAW,EACtC,GAAI,CAACoF,EACH,MAAM,IAAI,MAAM,4CAA4C,EAE9D,OAAOA,CACT,CCzoBO,MAAME,GAA8C,CAGzD,SAAU,CAAE,KAAM,mBAAoB,UAAW,WAAY,KAAM,KAAA,EACnE,QAAS,CAAE,KAAM,UAAW,KAAM,KAAA,EAClC,OAAQ,CAAE,KAAM,SAAU,KAAM,KAAA,EAChC,QAAS,CAAE,KAAM,UAAW,KAAM,KAAA,EAClC,SAAU,CAAE,KAAM,WAAY,KAAM,KAAA,EACpC,UAAW,CAAE,KAAM,oBAAqB,UAAW,YAAa,KAAM,MAAA,EACtE,SAAU,CAAE,KAAM,WAAY,KAAM,KAAA,EACpC,MAAO,CAAE,KAAM,QAAS,KAAM,KAAA,EAC9B,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,IAAK,CAAE,KAAM,cAAe,UAAW,YAAa,KAAM,KAAA,EAC1D,UAAW,CAAE,KAAM,OAAQ,KAAM,MAAA,EACjC,QAAS,CAAE,KAAM,aAAc,UAAW,SAAU,KAAM,QAAA,EAC1D,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,WAAY,CAAE,KAAM,aAAc,UAAW,OAAQ,KAAM,MAAA,EAC3D,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,MAAO,CAAE,KAAM,QAAS,KAAM,OAAA,EAC9B,IAAK,CAAE,KAAM,gBAAiB,UAAW,UAAW,KAAM,KAAA,EAC1D,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAE5B,OAAQ,CAAE,KAAM,iBAAkB,UAAW,SAAU,KAAM,KAAA,EAC7D,YAAa,CAAE,KAAM,iBAAkB,UAAW,SAAU,KAAM,MAAA,EAClE,gBAAiB,CAAE,KAAM,mBAAoB,UAAW,WAAY,KAAM,KAAA,EAC1E,YAAa,CAAE,KAAM,eAAgB,UAAW,OAAQ,KAAM,OAAA,EAC9D,iBAAkB,CAAE,KAAM,iBAAkB,UAAW,SAAU,KAAM,QAAA,EAGvE,IAAK,CAAE,KAAM,mBAAoB,UAAW,WAAY,KAAM,KAAA,EAC9D,IAAK,CAAE,KAAM,8BAA+B,UAAW,UAAW,KAAM,KAAA,EACxE,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,MAAO,CAAE,KAAM,UAAW,KAAM,KAAA,EAChC,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,SAAU,CAAE,KAAM,WAAY,KAAM,IAAA,EACpC,OAAQ,CAAE,KAAM,oBAAqB,UAAW,cAAe,KAAM,MAAA,EACrE,OAAQ,CAAE,KAAM,oBAAqB,UAAW,cAAe,KAAM,MAAA,EACrE,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,KAAM,CAAE,KAAM,eAAgB,UAAW,OAAQ,KAAM,KAAA,EACvD,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,KAAM,CAAE,KAAM,SAAU,KAAM,MAAA,EAC9B,KAAM,CAAE,KAAM,gBAAiB,UAAW,OAAQ,KAAM,MAAA,EACxD,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,KAAM,CAAE,KAAM,mBAAoB,UAAW,SAAU,KAAM,MAAA,EAC7D,IAAK,CAAE,KAAM,YAAa,KAAM,KAAA,EAChC,QAAS,CAAE,KAAM,YAAa,UAAW,MAAO,KAAM,KAAA,EACtD,OAAQ,CAAE,KAAM,SAAU,KAAM,QAAA,EAChC,MAAO,CAAE,KAAM,QAAS,KAAM,OAAA,EAC9B,MAAO,CAAE,KAAM,WAAY,KAAM,MAAA,EACjC,GAAI,CAAE,KAAM,YAAa,KAAM,KAAA,EAC/B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,KAAM,CAAE,KAAM,YAAa,KAAM,MAAA,EACjC,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,IAAK,CAAE,KAAM,mBAAoB,UAAW,cAAe,KAAM,KAAA,EACjE,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,IAAK,CAAE,KAAM,eAAgB,UAAW,WAAY,KAAM,KAAA,EAC1D,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,IAAK,CAAE,KAAM,uBAAwB,UAAW,UAAW,KAAM,KAAA,EACjE,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,IAAK,CAAE,KAAM,oBAAqB,UAAW,MAAO,KAAM,KAAA,EAC1D,KAAM,CAAE,KAAM,aAAc,KAAM,MAAA,EAClC,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,MAAO,CAAE,KAAM,QAAS,KAAM,OAAA,EAC9B,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,KAAM,CAAE,KAAM,QAAS,KAAM,MAAA,EAC7B,MAAO,CAAE,KAAM,aAAc,KAAM,OAAA,EACnC,UAAW,CAAE,KAAM,iBAAkB,UAAW,aAAc,KAAM,OAAA,EACpE,KAAM,CAAE,KAAM,gBAAiB,UAAW,QAAS,KAAM,MAAA,EACzD,SAAU,CAAE,KAAM,mBAAoB,UAAW,UAAW,KAAM,KAAA,EAClE,IAAK,CAAE,KAAM,iBAAkB,UAAW,UAAW,KAAM,KAAA,EAC3D,KAAM,CAAE,KAAM,eAAgB,UAAW,OAAQ,KAAM,MAAA,EACvD,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,UAAW,KAAM,KAAA,EAC9B,IAAK,CAAE,KAAM,aAAc,KAAM,KAAA,EACjC,OAAQ,CAAE,KAAM,SAAU,KAAM,QAAA,EAChC,MAAO,CAAE,KAAM,YAAa,KAAM,OAAA,EAClC,IAAK,CAAE,KAAM,YAAa,KAAM,KAAA,EAChC,KAAM,CAAE,KAAM,UAAW,KAAM,MAAA,EAC/B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,OAAQ,KAAM,KAAA,EAC3B,QAAS,CAAE,KAAM,UAAW,KAAM,SAAA,EAClC,KAAM,CAAE,KAAM,gBAAiB,UAAW,OAAQ,KAAM,MAAA,EACxD,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,OAAQ,CAAE,KAAM,SAAU,KAAM,QAAA,EAChC,SAAU,CAAE,KAAM,WAAY,KAAM,UAAA,EACpC,IAAK,CAAE,KAAM,aAAc,KAAM,KAAA,EACjC,UAAW,CAAE,KAAM,YAAa,KAAM,WAAA,EACtC,IAAK,CAAE,KAAM,aAAc,KAAM,KAAA,EACjC,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,KAAM,CAAE,KAAM,OAAQ,KAAM,KAAA,EAC5B,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,OAAQ,CAAE,KAAM,SAAU,KAAM,KAAA,EAChC,gBAAiB,CAAE,KAAM,kBAAmB,UAAW,YAAa,KAAM,KAAA,EAC1E,KAAM,CAAE,KAAM,SAAU,KAAM,MAAA,EAC9B,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,QAAS,CAAE,KAAM,UAAW,KAAM,KAAA,EAClC,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,yBAA0B,UAAW,SAAU,KAAM,KAAA,EAClE,KAAM,CAAE,KAAM,iBAAkB,UAAW,OAAQ,KAAM,MAAA,EACzD,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,IAAK,CAAE,KAAM,SAAU,KAAM,KAAA,EAC7B,IAAK,CAAE,KAAM,OAAQ,KAAM,KAAA,EAC3B,MAAO,CAAE,KAAM,kBAAmB,UAAW,QAAS,KAAM,OAAA,EAC5D,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,SAAU,CAAE,KAAM,aAAc,UAAW,OAAQ,KAAM,MAAA,EACzD,IAAK,CAAE,KAAM,WAAY,KAAM,KAAA,EAC/B,GAAI,CAAE,KAAM,KAAM,KAAM,IAAA,EACxB,MAAO,CAAE,KAAM,WAAY,KAAM,OAAA,EACjC,EAAG,CAAE,KAAM,cAAe,KAAM,GAAA,EAChC,IAAK,CAAE,KAAM,2BAA4B,UAAW,MAAO,KAAM,KAAA,EACjE,MAAO,CAAE,KAAM,QAAS,KAAM,OAAA,EAC9B,IAAK,CAAE,KAAM,eAAgB,KAAM,KAAA,EACnC,OAAQ,CAAE,KAAM,SAAU,KAAM,QAAA,EAChC,UAAW,CAAE,KAAM,YAAa,KAAM,MAAA,EACtC,EAAG,CAAE,KAAM,QAAS,KAAM,GAAA,EAC1B,MAAO,CAAE,KAAM,QAAS,KAAM,GAAA,EAC9B,OAAQ,CAAE,KAAM,SAAU,KAAM,MAAA,EAChC,GAAI,CAAE,KAAM,aAAc,KAAM,KAAA,EAChC,IAAK,CAAE,KAAM,MAAO,KAAM,MAAA,EAC1B,IAAK,CAAE,KAAM,aAAc,KAAM,KAAA,EACjC,KAAM,CAAE,KAAM,cAAe,KAAM,MAAA,EACnC,UAAW,CAAE,KAAM,YAAa,KAAM,MAAA,EACtC,IAAK,CAAE,KAAM,YAAa,KAAM,KAAA,EAChC,IAAK,CAAE,KAAM,aAAc,KAAM,YAAA,EACjC,KAAM,CAAE,KAAM,OAAQ,KAAM,MAAA,EAC5B,IAAK,CAAE,KAAM,aAAc,UAAW,SAAU,KAAM,KAAA,EACtD,MAAO,CAAE,KAAM,QAAS,KAAM,KAAA,EAC9B,MAAO,CAAE,KAAM,QAAS,KAAM,OAAA,EAC9B,KAAM,CAAE,KAAM,SAAU,KAAM,MAAA,EAC9B,UAAW,CAAE,KAAM,YAAa,KAAM,KAAA,EACtC,KAAM,CAAE,KAAM,WAAY,KAAM,MAAA,EAChC,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,EAC5B,SAAU,CAAE,KAAM,qBAAsB,UAAW,YAAa,KAAM,KAAA,EACtE,IAAK,CAAE,KAAM,MAAO,KAAM,KAAA,EAC1B,KAAM,CAAE,KAAM,OAAQ,KAAM,KAAA,EAC5B,KAAM,CAAE,KAAM,UAAW,KAAM,OAAA,EAC/B,IAAK,CAAE,KAAM,YAAa,KAAM,KAAA,EAChC,UAAW,CAAE,KAAM,MAAO,KAAM,KAAA,EAChC,IAAK,CAAE,KAAM,QAAS,KAAM,KAAA,CAC9B,EAMaC,GAAsC,CAEjD,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,MAAO,IAAI,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,MAAO,MAAO,OAAQ,MAAO,WAAY,QAAS,SAAU,MAAO,QAAS,MAAO,UAAW,OAAQ,MAAO,SAAU,WAAY,KAAK,EAAG,QAAS,EAAA,EAC9L,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAO,MAAO,MAAO,OAAQ,MAAO,QAAS,WAAY,SAAU,OAAQ,MAAO,OAAQ,OAAQ,OAAQ,QAAS,MAAO,SAAU,QAAS,MAAO,MAAO,UAAW,MAAO,MAAO,MAAO,QAAS,QAAS,UAAW,QAAS,SAAU,KAAM,WAAY,MAAO,WAAY,OAAQ,WAAY,OAAQ,MAAO,YAAa,MAAO,SAAU,MAAO,OAAQ,YAAa,OAAQ,UAAU,EAAG,QAAS,EAAA,EACtb,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,MAAO,MAAO,OAAQ,MAAO,QAAS,SAAU,MAAO,WAAY,SAAU,QAAS,MAAO,OAAQ,OAAQ,MAAO,MAAO,UAAW,YAAa,MAAO,WAAY,WAAY,OAAQ,MAAO,OAAQ,MAAO,UAAU,EAAG,QAAS,EAAA,EAC/Q,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,MAAO,MAAO,WAAY,OAAQ,MAAO,MAAM,EAAG,QAAS,EAAA,EACrG,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,SAAU,SAAU,KAAK,EAAG,QAAS,EAAA,EACjF,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAG3D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACjE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,QAAS,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,oCAAqC,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACrF,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,gBAAiB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACvE,CAAE,KAAM,QAAS,KAAM,aAAc,OAAQ,CAAC,QAAS,WAAW,EAAG,QAAS,EAAA,EAC9E,CAAE,KAAM,OAAQ,KAAM,gBAAiB,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAClE,CAAE,KAAM,SAAU,KAAM,iBAAkB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,MAAO,KAAM,wBAAyB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAC/E,CAAE,KAAM,MAAO,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,eAAgB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACtE,CAAE,KAAM,MAAO,KAAM,sBAAuB,OAAQ,CAAC,MAAO,UAAU,EAAG,QAAS,EAAA,EAClF,CAAE,KAAM,OAAQ,KAAM,eAAgB,OAAQ,CAAC,OAAQ,KAAK,EAAG,QAAS,EAAA,EACxE,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,mCAAoC,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACpF,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,QAAQ,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,MAAO,MAAO,KAAK,EAAG,QAAS,EAAA,EACvE,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,SAAU,KAAM,SAAU,OAAQ,CAAC,SAAU,KAAK,EAAG,QAAS,EAAA,EACtE,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,MAAO,KAAM,MAAO,OAAQ,CAAC,MAAO,OAAQ,OAAO,EAAG,QAAS,EAAA,EACvE,CAAE,KAAM,QAAS,KAAM,YAAa,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,OAAQ,KAAM,aAAc,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,QAAS,KAAM,cAAe,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,MAAO,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACtD,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACvD,CAAE,KAAM,MAAO,KAAM,mBAAoB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAC1E,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,QAAS,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,OAAQ,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,OAAQ,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,OAAQ,KAAM,iBAAkB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAClE,CAAE,KAAM,OAAQ,KAAM,wBAAyB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzE,CAAE,KAAM,QAAS,KAAM,oBAAqB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACtE,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAClE,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,MAAO,MAAO,KAAK,EAAG,QAAS,EAAA,EACvE,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,MAAO,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACtD,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,oBAAqB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,MAAO,KAAM,cAAe,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,cAAe,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,SAAS,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,SAAS,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,MAAO,KAAM,eAAgB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACtE,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,cAAe,OAAQ,CAAC,QAAQ,EAAG,QAAS,EAAA,EACjE,CAAE,KAAM,QAAS,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAClE,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACvD,CAAE,KAAM,OAAQ,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,kBAAmB,MAAM,EAAG,QAAS,EAAA,EAC9E,CAAE,KAAM,UAAW,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,cAAe,KAAM,eAAgB,OAAQ,CAAC,MAAO,OAAO,EAAG,QAAS,EAAA,EAChF,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,UAAW,KAAM,OAAQ,OAAQ,CAAC,MAAO,MAAM,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,OAAQ,KAAM,gBAAiB,OAAQ,CAAC,OAAQ,KAAK,EAAG,QAAS,EAAA,EACzE,CAAE,KAAM,QAAS,KAAM,iBAAkB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,QAAS,KAAM,iBAAkB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,MAAO,MAAO,KAAK,EAAG,QAAS,EAAA,EACxE,CAAE,KAAM,KAAM,KAAM,WAAY,OAAQ,CAAC,UAAU,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,QAAS,KAAM,kBAAmB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,UAAU,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,MAAO,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,KAAM,KAAM,KAAM,OAAQ,CAAC,IAAI,EAAG,QAAS,EAAA,EACnD,CAAE,KAAM,OAAQ,KAAM,UAAW,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,MAAO,OAAO,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,QAAS,KAAM,WAAY,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,QAAS,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,SAAU,KAAM,iBAAkB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,IAAK,KAAM,cAAe,OAAQ,CAAC,GAAG,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,MAAO,KAAM,2BAA4B,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3E,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,MAAO,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,OAAQ,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,QAAS,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,WAAW,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,IAAK,KAAM,QAAS,OAAQ,CAAC,GAAG,EAAG,QAAS,EAAA,EACpD,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACtE,CAAE,KAAM,MAAO,KAAM,MAAO,OAAQ,CAAC,SAAS,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,OAAQ,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,SAAU,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAC3D,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,MAAO,KAAM,MAAO,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACtD,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,QAAQ,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,QAAS,KAAM,YAAa,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACrE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,QAAQ,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAO,OAAO,EAAG,QAAS,EAAA,EACjE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,OAAQ,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,MAAO,KAAM,qBAAsB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACrE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACjE,CAAE,KAAM,UAAW,KAAM,UAAW,OAAQ,CAAC,WAAW,EAAG,QAAS,EAAA,EACpE,CAAE,KAAM,OAAQ,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC7D,CAAE,KAAM,OAAQ,KAAM,8BAA+B,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/E,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,OAAQ,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,OAAQ,KAAM,eAAgB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,OAAQ,KAAM,aAAc,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,WAAW,EAAG,QAAS,EAAA,EAClE,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,MAAO,OAAO,EAAG,QAAS,EAAA,EACnE,CAAE,KAAM,MAAO,KAAM,UAAW,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC1D,CAAE,KAAM,MAAO,KAAM,SAAU,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACzD,CAAE,KAAM,QAAS,KAAM,QAAS,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,OAAQ,KAAM,MAAO,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACvD,CAAE,KAAM,OAAQ,KAAM,kBAAmB,OAAQ,CAAC,MAAO,OAAO,EAAG,QAAS,EAAA,EAC5E,CAAE,KAAM,OAAQ,KAAM,gBAAiB,OAAQ,CAAC,WAAW,EAAG,QAAS,EAAA,EACvE,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,OAAQ,KAAM,0BAA2B,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC3E,CAAE,KAAM,OAAQ,KAAM,WAAY,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC5D,CAAE,KAAM,SAAU,KAAM,SAAU,OAAQ,CAAC,OAAO,EAAG,QAAS,EAAA,EAC9D,CAAE,KAAM,MAAO,KAAM,OAAQ,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACvD,CAAE,KAAM,MAAO,KAAM,iBAAkB,OAAQ,CAAC,MAAO,KAAK,EAAG,QAAS,EAAA,EACxE,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,MAAM,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,MAAO,WAAW,EAAG,QAAS,EAAA,EACrE,CAAE,KAAM,MAAO,KAAM,gBAAiB,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAChE,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,MAAO,KAAM,QAAS,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EACxD,CAAE,KAAM,OAAQ,KAAM,cAAe,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,EAC/D,CAAE,KAAM,OAAQ,KAAM,OAAQ,OAAQ,CAAC,MAAO,WAAW,EAAG,QAAS,EAAA,EACrE,CAAE,KAAM,MAAO,KAAM,YAAa,OAAQ,CAAC,KAAK,EAAG,QAAS,EAAA,CAC9D,EAGaC,GAAuC,OAAO,YACzDD,GAAkB,IAAIpG,GAAK,CAACA,EAAE,KAAMA,EAAE,IAAI,CAAC,CAC7C,EAIasG,GAA0C,CACrD,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACP,EASO,SAASC,GAAiBC,EAAgBC,EAAU,GAAY,CACrE,MAAO,GAAGA,CAAO,iBAAiBD,EAAO,aAAa,MACxD,CAOO,SAASE,GAAeC,EAAsBF,EAAU,GAAY,CACzE,MAAMjJ,EAAU8I,GAAgBK,CAAY,GAAK,KACjD,MAAO,GAAGF,CAAO,UAAUjJ,CAAO,MACpC,CAQO,SAASoJ,GAAaC,EAA+C,CAC1E,OAAOV,GAAYU,CAAS,GACvBV,GAAYU,EAAU,aAAa,GACnCV,GAAYU,EAAU,YAAA,CAAa,GACnCV,GAAYU,EAAU,YAAA,EAAc,QAAQ,KAAM,GAAG,CAAC,GACtDV,GAAYU,EAAU,YAAA,EAAc,QAAQ,KAAM,GAAG,CAAC,CAC7D,CAEO,SAASC,GAAgBD,EAAmBJ,EAAU,GAAY,CACvE,MAAMM,EAAQH,GAAaC,CAAS,EACpC,OAAIE,EAAc,GAAGN,CAAO,iBAAiBM,EAAM,IAAI,OAChD,GAAGN,CAAO,iBAAiBI,EAAU,aAAa,MAC3D,CAIO,MAAMG,GAAkC,CAC7C,CAAE,KAAM,MAAO,KAAM,aAAA,EACrB,CAAE,KAAM,MAAO,KAAM,gBAAA,EACrB,CAAE,KAAM,MAAO,KAAM,mBAAA,EACrB,CAAE,KAAM,MAAO,KAAM,gBAAA,EACrB,CAAE,KAAM,MAAO,KAAM,iBAAA,EACrB,CAAE,KAAM,MAAO,KAAM,MAAA,EACrB,CAAE,KAAM,MAAO,KAAM,eAAA,EACrB,CAAE,KAAM,MAAO,KAAM,cAAA,EACrB,CAAE,KAAM,MAAO,KAAM,WAAA,EACrB,CAAE,KAAM,MAAO,KAAM,aAAA,EACrB,CAAE,KAAM,MAAO,KAAM,cAAA,EACrB,CAAE,KAAM,MAAO,KAAM,cAAA,CACvB,EAIaC,GAAgB,CAC3B,CAAE,GAAI,OAAU,KAAM,OAAU,OAAQ,SAAA,EACxC,CAAE,GAAI,SAAU,KAAM,SAAU,OAAQ,SAAA,EACxC,CAAE,GAAI,QAAU,KAAM,QAAU,OAAQ,SAAA,EACxC,CAAE,GAAI,SAAU,KAAM,SAAU,OAAQ,SAAA,EACxC,CAAE,GAAI,OAAU,KAAM,OAAU,OAAQ,SAAA,EACxC,CAAE,GAAI,OAAU,KAAM,OAAU,OAAQ,IAAA,CAC1C,EAIaC,GAAqD,CAChE,KAAM,CAAE,IAAK,MAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAS,IAAK,MAAQ,IAAK,MAAQ,IAAK,MAAQ,IAAK,OAAQ,IAAK,MAAQ,IAAK,OAAS,IAAK,OAAU,IAAK,MAAA,EAChK,KAAM,CAAE,IAAK,MAAQ,IAAK,MAAQ,IAAK,OAAQ,IAAK,OAAS,IAAK,MAAQ,IAAK,KAAQ,IAAK,MAAQ,IAAK,OAAQ,IAAK,MAAQ,IAAK,OAAS,IAAK,OAAU,IAAK,MAAA,EAChK,IAAM,CAAE,IAAK,OAAW,IAAK,QAAY,IAAK,QAAY,IAAK,QAAc,IAAK,OAAY,IAAK,OAAY,IAAK,MAAW,IAAK,OAAW,IAAK,OAAa,IAAK,OAAa,IAAK,QAAe,IAAK,KAAA,EAC5M,IAAM,CAAE,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAY,IAAK,OAAU,IAAK,OAAU,IAAK,OAAW,IAAK,OAAU,IAAK,OAAW,IAAK,OAAY,IAAK,OAAa,IAAK,MAAA,EAC3L,IAAM,CAAE,IAAK,OAAS,IAAK,QAAU,IAAK,QAAU,IAAK,OAAW,IAAK,QAAU,IAAK,QAAU,IAAK,OAAU,IAAK,QAAU,IAAK,OAAU,IAAK,OAAW,IAAK,OAAY,IAAK,KAAA,EACrL,IAAM,CAAE,IAAK,MAAQ,IAAK,MAAQ,IAAK,MAAQ,IAAK,OAAS,IAAK,MAAQ,IAAK,MAAQ,IAAK,MAAQ,IAAK,KAAQ,IAAK,OAAS,IAAK,OAAS,IAAK,MAAU,IAAK,MAAA,EACjK,KAAM,CAAE,IAAK,MAAO,IAAK,MAAO,IAAK,KAAO,IAAK,OAAS,IAAK,MAAO,IAAK,MAAO,IAAK,KAAQ,IAAK,MAAO,IAAK,MAAQ,IAAK,OAAS,IAAK,QAAU,IAAK,MAAA,EAC1J,IAAM,CAAE,IAAK,MAAO,IAAK,MAAO,IAAK,MAAO,IAAK,OAAS,IAAK,KAAO,IAAK,KAAO,IAAK,MAAQ,IAAK,MAAO,IAAK,MAAQ,IAAK,OAAS,IAAK,QAAU,IAAK,MAAA,CAC5J,EAIMC,OAAkB,IAAI,CAC1B,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,QAChD,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,QACzC,OAAQ,OAAQ,QAAS,UAAW,cACpC,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,MACnD,CAAC,EAGM,SAASC,GAAaC,EAAuB,CAClD,OAAOF,GAAY,IAAIE,EAAK,YAAA,CAAa,CAC3C,CAIO,SAASC,GAAY3D,EAAgBP,EAAsB,SAChE,QAAOF,EAAAgE,GAAWvD,CAAM,IAAjB,YAAAT,EAAqBE,OAASS,EAAAqD,GAAW,OAAX,YAAArD,EAAqBT,KAAS,CACrE,CAEO,SAASmE,GAAYC,EAAqB,CAC/C,OAAO,WAAWA,EAAI,QAAQ,KAAM,EAAE,CAAC,GAAK,CAC9C,CAEO,SAASC,GAAaC,EAAqB,CAChD,GAAIA,IAAQ,EAAG,MAAO,IACtB,GAAIA,GAAO,IAAM,OAAOA,EAAI,eAAe,QAAS,CAAE,sBAAuB,EAAG,EAChF,GAAIA,GAAO,EAAG,OAAOA,EAAI,QAAQ,CAAC,EAClC,GAAIA,GAAO,IAAM,OAAOA,EAAI,QAAQ,CAAC,EACrC,MAAMC,EAAID,EAAI,YAAY,CAAC,EAC3B,OAAO,WAAWC,CAAC,EAAE,SAAA,CACvB,CAEO,MAAMC,GAAcJ,GAAyB,2BAA2B,KAAKA,CAAG,EAI1EK,GAAkB,GAClBC,GAAoB,KAIpBC,IAA2C,IAAM,CAC5D,MAAMC,EAA2B,CAAA,EACjC,UAAWhI,KAAKoG,GACd,UAAWW,KAAS/G,EAAE,OACpBgI,EAAK,KAAK,CAAE,KAAMhI,EAAE,KAAM,KAAMA,EAAE,KAAM,MAAA+G,EAAO,QAAS/G,EAAE,OAAA,CAAS,EAGvE,OAAOgI,CACT,GAAA,ECjkBA,SAASC,GAAS,CAChB,IAAAC,EACA,IAAAC,EACA,KAAAC,EACA,UAAAC,EAAY,GACZ,WAAAC,CACF,EAOG,CACD,KAAM,CAACC,EAAQC,CAAS,EAAI7K,EAAAA,SAAS,EAAK,EACpC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAS,EAAK,EAClC8K,EAAaxK,EAAAA,OAAOiK,CAAG,EAGzBO,EAAW,UAAYP,IACzBO,EAAW,QAAUP,EACrBM,EAAU,EAAK,EACfzK,EAAS,EAAK,GAGhB,MAAM2K,EAAatK,EAAAA,YAAY,IAAMoK,EAAU,EAAI,EAAG,CAAA,CAAE,EAClDG,EAAcvK,EAAAA,YAAY,IAAML,EAAS,EAAI,EAAG,CAAA,CAAE,EAExD,OACE6K,EAAAA,KAAC,MAAA,CACC,UAAW,kCAAkCP,CAAS,GACtD,MAAO,CAAE,MAAOD,EAAM,OAAQA,EAAM,WAAAE,CAAA,EAGnC,SAAA,CAAA,CAACC,GAAU,CAACzK,GACXiI,EAAAA,IAAC,MAAA,CACC,UAAU,8CACV,MAAO,CAAE,WAAY,wBAAA,CAAyB,CAAA,EAIjDjI,EACCiI,EAAAA,IAAC,MAAA,CACC,UAAU,2EACV,MAAO,CACL,WAAY,yBACZ,MAAO,sBACP,SAAU,KAAK,IAAI,EAAGqC,EAAO,GAAI,CAAA,EAGlC,SAAAD,EAAI,MAAM,EAAG,CAAC,CAAA,CAAA,EAGjBpC,EAAAA,IAAC,MAAA,CACC,IAAAmC,EACA,IAAAC,EACA,MAAOC,EACP,OAAQA,EACR,OAAQM,EACR,QAASC,EACT,UAAW,gBAAgBJ,EAAS,cAAgB,WAAW,GAC/D,MAAO,CAAE,MAAOH,EAAM,OAAQA,EAAM,WAAY,uBAAA,CAAwB,CAAA,CAC1E,CAAA,CAAA,CAIR,CAEO,SAASS,GAAW,CAAE,OAAArC,EAAQ,KAAA4B,EAAO,GAAI,QAAA3B,EAAU,IAA2D,CACnH,OACEV,EAAAA,IAACkC,GAAA,CACC,IAAK1B,GAAiBC,EAAQC,CAAO,EACrC,IAAKD,EACL,KAAA4B,EACA,WAAW,SAAA,CAAA,CAGjB,CAEO,SAASU,GAAS,CAAE,aAAAnC,EAAc,KAAAyB,EAAO,GAAI,QAAA3B,EAAU,IAAiE,CAC7H,OACEV,EAAAA,IAACkC,GAAA,CACC,IAAKvB,GAAeC,EAAcF,CAAO,EACzC,IAAKE,EACL,KAAAyB,CAAA,CAAA,CAGN,CAEO,SAASW,GAAgB,CAAE,KAAAX,EAAO,GAAI,MAAAY,EAAQ,QAA6C,CAChG,OACEJ,OAAC,OAAI,MAAOR,EAAM,OAAQA,EAAM,QAAQ,YAAY,KAAK,OACvD,SAAA,CAAArC,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAMiD,CAAA,CAAO,EAC5CjD,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,OAAO,QAAQ,YAAY,MAAM,KAAK,MAAA,CAAO,CAAA,EAC7E,CAEJ,CAEO,SAASkD,GAAS,CAAE,KAAAb,EAAO,IAAyB,CACzD,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,yDACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,uBAAA,EAEhD,SAAAQ,EAAAA,KAAC,MAAA,CAAI,MAAOR,EAAO,GAAK,OAAQA,EAAO,IAAM,QAAQ,YAAY,KAAK,OACpE,SAAA,CAAArC,MAAC,QAAK,EAAE,gDAAgD,OAAO,4BAA4B,YAAY,IAAI,EAC3GA,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,2BAAA,CAA4B,EAC5EA,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,2BAAA,CAA4B,EAC5EA,EAAAA,IAAC,OAAA,CAAK,EAAE,KAAK,EAAE,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,2BAAA,CAA4B,EAC7EA,EAAAA,IAAC,OAAA,CAAK,EAAE,KAAK,EAAE,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,2BAAA,CAA4B,EAC7EA,EAAAA,IAAC,QAAK,EAAE,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,2BAAA,CAA4B,CAAA,CAAA,CACtE,CAAA,CAAA,CAGN,CAEO,SAASmD,GAAY,CAAE,KAAAd,EAAO,IAAyB,CAC5D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,kFACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,gBAAiB,OAAQ,SAAUA,EAAO,GAAA,EAC/E,SAAA,GAAA,CAAA,CAIL,CAEO,SAASe,GAAa,CAAE,KAAAf,EAAO,IAAyB,CAC7D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,4CACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,OAAQ,aAAcA,EAAO,EAAA,EAE7E,SAAArC,EAAAA,IAAC,MAAA,CAAI,MAAOqC,EAAO,IAAM,OAAQA,EAAO,KAAO,QAAQ,YAAY,KAAK,OACtE,SAAArC,EAAAA,IAAC,OAAA,CACC,EAAE,y7DACF,KAAK,OAAA,CAAA,CACP,CACF,CAAA,CAAA,CAGN,CAEO,SAASqD,GAAc,CAAE,KAAAhB,EAAO,IAAyB,CAC9D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,4CACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,UAAW,aAAcA,EAAO,EAAA,EAEhF,SAAAQ,EAAAA,KAAC,MAAA,CAAI,MAAOR,EAAO,IAAM,OAAQA,EAAO,KAAO,QAAQ,YAAY,KAAK,OACtE,SAAA,CAAArC,EAAAA,IAAC,OAAA,CAAK,EAAE,mIAAmI,KAAK,QAAQ,EACxJA,EAAAA,IAAC,OAAA,CAAK,EAAE,4/BAA4/B,KAAK,QAAQ,EACjhCA,EAAAA,IAAC,OAAA,CAAK,EAAE,ufAAuf,KAAK,QAAQ,EAC5gBA,EAAAA,IAAC,OAAA,CAAK,EAAE,k/FAAk/F,KAAK,OAAA,CAAQ,CAAA,CAAA,CACzgG,CAAA,CAAA,CAGN,CAEO,SAASsD,GAAW,CAAE,KAAAjB,EAAO,IAAyB,CAC3D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,yDACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,SAAA,EAEhD,SAAArC,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAuB,MAAO,CAAE,SAAUqC,EAAO,KAAQ,SAAA,GAAA,CAAC,CAAA,CAAA,CAGhF,CAEO,SAASkB,GAAS,CAAE,KAAAlB,EAAO,IAAyB,CACzD,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,4CACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,UAAW,aAAcA,EAAO,EAAA,EAEhF,SAAAQ,EAAAA,KAAC,MAAA,CAAI,MAAOR,EAAO,IAAM,OAAQA,EAAO,KAAO,QAAQ,YAAY,KAAK,OACtE,SAAA,CAAArC,EAAAA,IAAC,OAAA,CAAK,EAAE,qEAAqE,KAAK,QAAQ,EAC1FA,EAAAA,IAAC,OAAA,CAAK,EAAE,2nBAA2nB,KAAK,QAAQ,EAChpBA,EAAAA,IAAC,OAAA,CAAK,EAAE,4eAA4e,KAAK,QAAQ,EACjgBA,EAAAA,IAAC,OAAA,CAAK,EAAE,sJAAsJ,KAAK,QAAQ,EAC3KA,EAAAA,IAAC,OAAA,CAAK,EAAE,2JAA2J,KAAK,OAAA,CAAQ,CAAA,CAAA,CAClL,CAAA,CAAA,CAGN,CAEO,SAASwD,GAAe,CAAE,KAAAnB,EAAO,IAAyB,CAC/D,MAAMT,EAAIS,EAAO,GACjB,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,4CACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,CAAA,EAE9B,SAAAQ,EAAAA,KAAC,MAAA,CAAI,MAAOjB,EAAG,OAAQA,EAAI,KAAO,QAAQ,YAAY,KAAK,OACzD,SAAA,CAAA5B,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,SAAA,CAAU,EAC9CA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,SAAA,CAAU,EAC9CA,EAAAA,IAAC,OAAA,CAAK,EAAE,qDAAqD,KAAK,SAAA,CAAU,CAAA,CAAA,CAC9E,CAAA,CAAA,CAGN,CAEO,SAASyD,GAAS,CAAE,KAAApB,EAAO,IAAyB,CACzD,MAAMqB,EAAQrB,EAAO,IACfsB,EAAQD,EAAQ,IAChB,EAAI,KAAK,IAAI,EAAGA,EAAQ,EAAG,EAC3BE,EAAUF,EAAQ,GACxB,OACEb,OAAC,MAAA,CAAI,UAAU,4CAA4C,MAAO,CAAE,MAAOR,EAAM,OAAQA,CAAA,EAEvF,SAAA,CAAArC,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO0D,EACP,OAAQC,EACR,WAAY,UACZ,aAAc,EACd,SAAU,WACV,OAAQ,EACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAAA,EAGlB,SAAAd,EAAAA,KAAC,MAAA,CAAI,MAAOa,EAAQ,GAAK,OAAQC,EAAQ,IAAM,QAAQ,YAAY,KAAK,OACtE,SAAA,CAAA3D,EAAAA,IAAC,OAAA,CAAK,EAAE,qEAAqE,KAAK,QAAQ,EAC1FA,EAAAA,IAAC,OAAA,CAAK,EAAE,sJAAsJ,KAAK,QAAQ,EAC3KA,EAAAA,IAAC,OAAA,CAAK,EAAE,2JAA2J,KAAK,QAAQ,EAChLA,EAAAA,IAAC,OAAA,CAAK,EAAE,2nBAA2nB,KAAK,QAAQ,EAChpBA,EAAAA,IAAC,OAAA,CAAK,EAAE,4eAA4e,KAAK,OAAA,CAAQ,CAAA,CAAA,CACngB,CAAA,CAAA,EAGFA,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO0D,EACP,OAAQC,EACR,WAAY,UACZ,aAAc,EACd,WAAY,CAACC,EACb,SAAU,WACV,OAAQ,EACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,SAAU,QAAA,EAGZ,SAAAf,EAAAA,KAAC,MAAA,CAAI,MAAOc,EAAQ,IAAM,OAAQA,EAAQ,GAAK,QAAQ,YAAY,KAAK,OACtE,SAAA,CAAA3D,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,SAAA,CAAU,EAC9CA,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,SAAA,CAAU,EAC9CA,EAAAA,IAAC,OAAA,CAAK,EAAE,qDAAqD,KAAK,SAAA,CAAU,CAAA,CAAA,CAC9E,CAAA,CAAA,CACF,EACF,CAEJ,CAEO,SAAS6D,GAAY,CAAE,KAAAxB,EAAO,IAAyB,CAC5D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,kEACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,CAAA,EAE9B,SAAArC,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAuB,MAAO,CAAE,SAAUqC,EAAO,KAAQ,SAAA,GAAA,CAAC,CAAA,CAAA,CAGhF,CAEO,SAASyB,IAAc,CAC5B,OACE9D,MAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,SAAAA,EAAAA,IAAC,QAAK,EAAE,qBAAqB,OAAO,0BAA0B,YAAY,MAAM,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CAC/H,CAEJ,CAEO,SAAS+D,IAAe,CAC7B,OACE/D,MAAC,OAAI,MAAM,IAAI,OAAO,KAAK,QAAQ,WAAW,KAAK,OACjD,SAAAA,EAAAA,IAAC,QAAK,EAAE,gBAAgB,OAAO,uBAAuB,YAAY,MAAM,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CACvH,CAEJ,CAEO,SAASgE,GAAS,CAAE,QAAAC,GAAoC,CAC7D,OACEjE,EAAAA,IAAC,SAAA,CAAO,QAAAiE,EAAkB,UAAU,sCAClC,SAAAjE,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,SAAAA,EAAAA,IAAC,OAAA,CACC,EAAE,gbACF,KAAK,sBAAA,CAAA,EAET,CAAA,CACF,CAEJ,CAEO,SAASkE,GAAa,CAAE,KAAA7B,EAAO,IAAyB,CAC7D,OACErC,EAAAA,IAAC,MAAA,CACC,UAAU,yDACV,MAAO,CAAE,MAAOqC,EAAM,OAAQA,EAAM,WAAY,kBAAA,EAEhD,SAAAQ,EAAAA,KAAC,MAAA,CAAI,MAAOR,EAAO,GAAK,OAAQA,EAAO,GAAK,QAAQ,YAAY,KAAK,OACnE,SAAA,CAAArC,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,OAAO,gBAAgB,YAAY,KAAA,CAAM,EACzEA,EAAAA,IAAC,OAAA,CAAK,EAAE,gCAAgC,KAAK,eAAA,CAAgB,CAAA,CAAA,CAC/D,CAAA,CAAA,CAGN,CAEO,SAASmE,GAAeC,EAAc/B,EAAO,GAAqB,CACvE,OAAQ+B,EAAA,CACN,IAAK,UAAW,OAAOpE,MAACmD,IAAY,KAAAd,EAAY,EAChD,IAAK,WAAY,OAAOrC,MAACoD,IAAa,KAAAf,EAAY,EAClD,IAAK,OAAQ,OAAOrC,MAACyD,IAAS,KAAApB,EAAY,EAC1C,IAAK,YAAa,OAAOrC,MAACqD,IAAc,KAAAhB,EAAY,EACpD,IAAK,SAAU,OAAOrC,MAACsD,IAAW,KAAAjB,EAAY,EAC9C,IAAK,OAAQ,OAAOrC,MAACkD,IAAS,KAAAb,EAAY,EAC1C,IAAK,OAAQ,OAAOrC,MAACuD,IAAS,KAAAlB,EAAY,EAC1C,IAAK,aAAc,OAAOrC,MAACwD,IAAe,KAAAnB,EAAY,EACtD,QAAS,OAAOrC,MAACgD,IAAgB,KAAAX,EAAY,CAAA,CAEjD,CChUA,MAAMgC,GAAuC,CAC5C,oBAAqB,OACrB,gBAAiB,OACjB,oBAAqB,OACrB,sBAAuB,OACvB,qBAAsB,OACtB,KAAM,OACN,YAAa,WACb,aAAc,YACd,OAAQ,SACR,QAAS,SACV,EAEMC,GAAyC,CAC9C,oBAAqB,OACrB,gBAAiB,gBACjB,oBAAqB,MACrB,YAAa,YACb,aAAc,aACd,sBAAuB,QACvB,OAAQ,SACR,QAAS,SACV,EAEO,SAASC,GAAqBxL,EAAYyL,EAA0B,CAC1E,OAAOF,GAAevL,CAAE,GAAKyL,CAC9B,CAEO,SAASC,GAAcC,EAAkBC,EAAetC,EAAO,GAAqB,CAC1F,MAAMuC,EAAUP,GAAaK,CAAQ,EACrC,OAAIE,EAAgBT,GAAeS,EAASvC,CAAI,EAC5CsC,EAAa3E,MAAC,MAAA,CAAI,IAAK2E,EAAM,IAAI,GAAG,MAAOtC,EAAM,OAAQA,EAAM,MAAO,CAAE,aAAc,OAAS,EAC5FrC,MAACgD,IAAgB,KAAAX,EAAY,CACrC,CASO,SAASwC,GAAsB,CACrC,QAAA5G,EACA,WAAA6G,EACA,YAAAC,EACA,aAAAC,CACD,EAA+B,CAC9B,MAAMC,EAAW5I,EAAAA,QAChB,IAAM4B,EAAQ,OAAQ,GAAM,EAAE,eAAe,SAAS+G,CAAY,CAAC,EACnE,CAAC/G,EAAS+G,CAAY,CAAA,EAGjBE,EAAWD,EAAS,KAAM,GAAM,EAAE,KAAOH,CAAU,GAAKG,EAAS,CAAC,EAExE,OAAIA,EAAS,SAAW,EAEtBjF,EAAAA,IAAC,MAAA,CACA,UAAU,kEACV,MAAO,CACN,WAAY,mBACZ,uBAAwB,EACxB,wBAAyB,CAAA,EAG1B,SAAA6C,EAAAA,KAAC,QAAK,UAAU,cAAc,MAAO,CAAE,MAAO,uBAAyB,SAAA,CAAA,oCACpCmC,CAAA,CAAA,CACnC,CAAA,CAAA,EAMFhF,MAAAmF,EAAAA,SAAA,CACC,SAAAtC,EAAAA,KAAC,MAAA,CACA,KAAK,SACL,SAAU,EACV,QAASkC,EACT,UAAYK,GAAM,EAAMA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKL,EAAA,CAAe,EAC3E,UAAU,uEACV,MAAO,CACN,WAAY,mBACZ,uBAAwB,EACxB,wBAAyB,EACzB,OAAQ,UACR,OAAQ,EAAA,EAGT,SAAA,CAAA/E,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,gBAAA,CAE3E,EACA6C,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACf,SAAA,CAAA7C,MAAC,QAAK,UAAU,mCAAmC,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,EAC7E,YAAYyE,GAAcS,EAAS,GAAIA,EAAS,KAAM,EAAE,EAC1D,QACC,OAAA,CAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO,eAAA,EACxD,SAAAA,EAAWX,GAAqBW,EAAS,GAAIA,EAAS,IAAI,EAAI,SAChE,QACCpB,GAAA,CAAA,CAAY,CAAA,CAAA,CACd,CAAA,CAAA,CAAA,EAEF,CAEF,CClGO,SAASuB,GAAa,CAC5B,UAAA/C,EAAY,GACZ,aAAAgD,EAAe,GACf,cAAAC,EAAgB,GACjB,EAAsB,OACrB,KAAM,CAAE,MAAArM,EAAO,YAAA+F,EAAa,SAAAS,EAAU,OAAAE,CAAA,EAAWK,GAAA,EAC3C,CAACuF,EAAcC,CAAe,EAAI7N,EAAAA,SAAS,EAAK,EAChD,CAAC8N,EAAmBC,CAAoB,EAAI/N,EAAAA,SAAwB,IAAI,EAExEgO,EAAY1M,GAAA,MAAAA,EAAO,SAAS,UAAY,KAAK,IAAA,EAAQA,EAAM,SAAS,UAAY,GA+BtF,GA5BAT,EAAAA,UAAU,IAAM,CACf,IAAIS,GAAA,YAAAA,EAAO,SAAS,UAAW,YAAcoM,GAAgB,CAACM,EAAW,CACxED,EAAqB,KAAK,KAAKJ,EAAgB,GAAI,CAAC,EACpD,MAAM1L,EAAQ,WAAW,IAAM,CAC9B,OAAO,SAAS,KAAOX,EAAM,SAAS,GACvC,EAAGqM,CAAa,EAEVM,EAAoB,YAAY,IAAM,CAC3CF,EAAsBG,GAAUA,GAAQA,EAAO,EAAIA,EAAO,EAAI,IAAK,CACpE,EAAG,GAAI,EAEP,MAAO,IAAM,CACZ,aAAajM,CAAK,EAClB,cAAcgM,CAAiB,CAChC,CACD,CACD,EAAG,CAAC3M,EAAOoM,EAAcC,EAAeK,CAAS,CAAC,EAGlDnN,EAAAA,UAAU,IAAM,CACVwG,IACDA,EAAY,SAAW,YAC1BS,EAAS,UAAU,EACT,CAAC,SAAU,YAAa,SAAS,EAAE,SAAST,EAAY,MAAM,GACxES,EAAS,OAAO,EAElB,EAAG,CAACT,GAAA,YAAAA,EAAa,OAAQS,CAAQ,CAAC,EAE9B,CAACxG,EACJ,OACC2J,EAAAA,KAAC,MAAA,CACA,UAAW,iDAAiDP,CAAS,GACrE,MAAO,CAAE,MAAO,eAAA,EAEhB,SAAA,CAAAtC,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAmB,SAAA,iBAAc,EAC9CA,EAAAA,IAAC,SAAA,CACA,UAAU,2CACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,mBACZ,MAAO,gBACP,YAAa,GACb,aAAc,EAAA,EAEf,QAASJ,EACT,SAAA,SAAA,CAAA,CAED,CAAA,CAAA,EAKH,GAAIgG,EACH,OACC/C,EAAAA,KAAC,MAAA,CACA,UAAW,6DAA6DP,CAAS,GACjF,MAAO,CAAE,MAAO,eAAA,EAGhB,SAAA,CAAAtC,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,SAAA,mBAAgB,EAC/DA,EAAAA,IAAC,KAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,4CAAA,CAE7E,EACAA,EAAAA,IAAC,SAAA,CACA,UAAU,kDACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,kBACZ,MAAO,mBAAA,EAER,QAASJ,EACT,SAAA,YAAA,CAAA,CAED,CAAA,CAAA,EAMH,GAAI1G,EAAM,SAAS,SAAW,SAAU,CACvC,MAAM6M,EAAY7M,EAAM,SAAS,IAC3B8M,IACL7I,EAAAjE,EAAM,SAAS,kBAAf,YAAAiE,EAAgC,KAAK,QACrC,sKAED,OAAO8I,GAAAA,aACNpD,EAAAA,KAAC,MAAA,CACA,MAAO,CACN,SAAU,QACV,MAAO,EACP,OAAQ,KACR,QAAS,OACT,cAAe,SACf,WAAY,MAAA,EAIb,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CACA,MAAO,CACN,QAAS,OACT,WAAY,SACZ,OAAQ,GACR,YAAa,EACb,aAAc,GACd,WAAY,OACZ,WAAY,CAAA,EAGb,SAAA6C,EAAAA,KAAC,SAAA,CACA,QAASjD,EACT,MAAO,CACN,QAAS,OACT,WAAY,SACZ,IAAK,EACL,WAAY,OACZ,OAAQ,OACR,MAAO,OACP,SAAU,GACV,WAAY,IACZ,OAAQ,UACR,QAAS,WACT,aAAc,CAAA,EAGf,SAAA,CAAAI,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACpD,SAAAA,EAAAA,IAAC,QAAK,EAAE,kBAAkB,OAAO,eAAe,YAAY,IAAI,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CAC9G,EAAM,QAAA,CAAA,CAAA,CAEP,CAAA,EAID6C,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,WAAY,SAAU,QAAA,EACrD,SAAA,CAAA,CAAC2C,GACD3C,EAAAA,KAAC,MAAA,CACA,MAAO,CACN,SAAU,WACV,MAAO,EACP,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,QAAA,EAGjB,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,EAC/BA,EAAAA,IAAC,IAAA,CAAE,MAAO,CAAE,MAAO,OAAQ,SAAU,GAAI,UAAW,IAAM,SAAA,qBAAA,CAE1D,CAAA,CAAA,CAAA,EAGFA,EAAAA,IAAC,SAAA,CACA,IAAK+F,EACL,MAAO,CACN,QAASP,EAAe,QAAU,OAClC,MAAO,OACP,OAAQ,OACR,OAAQ,MAAA,EAET,MAAOQ,EACP,OAAQ,IAAMP,EAAgB,EAAI,EAClC,MAAM,mBAAA,CAAA,CACP,CAAA,CACD,CAAA,CAAA,CAAA,EAED,SAAS,IAAA,CAEX,CAGA,GAAIvM,EAAM,SAAS,SAAW,WAC7B,OACC2J,EAAAA,KAAC,MAAA,CACA,UAAW,6DAA6DP,CAAS,GACjF,MAAO,CAAE,MAAO,eAAA,EAEhB,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CAAI,UAAU,mBAAmB,SAAA,KAAS,EAC3CA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,SAAA,mBAAgB,EAC/D6C,OAAC,KAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,2BAA6B,SAAA,CAAA,2BACnD3J,EAAM,QAAQ,4BAAA,EACxC,EACCwM,IAAsB,MACtB7C,OAAC,IAAA,CAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,CAAA,kBACxD6C,EAAkB,KAAA,EACnC,EAED7C,EAAAA,KAAC,IAAA,CACA,KAAM3J,EAAM,SAAS,IACrB,UAAU,mFACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,kBACZ,MAAO,oBACP,eAAgB,MAAA,EAEjB,OAAO,SACP,IAAI,sBACJ,SAAA,CAAA,eACaA,EAAM,OAAA,CAAA,CAAA,EAEpB8G,EAAAA,IAAC,SAAA,CACA,UAAU,uDACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,mBACZ,MAAO,eAAA,EAER,QAASJ,EACT,SAAA,QAAA,CAAA,CAED,CAAA,CAAA,EAMH,GAAI1G,EAAM,SAAS,SAAW,UAAYA,EAAM,aAAc,CAC7D,MAAMgN,EAAYC,GAAejN,EAAM,SAAS,IAAKA,EAAM,YAAY,EAEvE,OAAO+M,GAAAA,aACNpD,EAAAA,KAAC,MAAA,CACA,MAAO,CACN,SAAU,QACV,MAAO,EACP,OAAQ,KACR,QAAS,OACT,cAAe,SACf,WAAY,MAAA,EAIb,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CACA,MAAO,CACN,QAAS,OACT,WAAY,SACZ,OAAQ,GACR,YAAa,EACb,aAAc,GACd,WAAY,OACZ,WAAY,CAAA,EAGb,SAAA6C,EAAAA,KAAC,SAAA,CACA,QAASjD,EACT,MAAO,CACN,QAAS,OACT,WAAY,SACZ,IAAK,EACL,WAAY,OACZ,OAAQ,OACR,MAAO,OACP,SAAU,GACV,WAAY,IACZ,OAAQ,UACR,QAAS,WACT,aAAc,CAAA,EAGf,SAAA,CAAAI,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACpD,SAAAA,EAAAA,IAAC,QAAK,EAAE,kBAAkB,OAAO,eAAe,YAAY,IAAI,cAAc,QAAQ,eAAe,OAAA,CAAQ,CAAA,CAC9G,EAAM,QAAA,CAAA,CAAA,CAEP,CAAA,EAID6C,EAAAA,KAAC,MAAA,CAAI,MAAO,CAAE,KAAM,EAAG,SAAU,WAAY,SAAU,QAAA,EACrD,SAAA,CAAA,CAAC2C,GACD3C,EAAAA,KAAC,MAAA,CACA,MAAO,CACN,SAAU,WACV,MAAO,EACP,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,QAAA,EAGjB,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,EAC/BA,EAAAA,IAAC,IAAA,CAAE,MAAO,CAAE,MAAO,OAAQ,SAAU,GAAI,UAAW,IAAM,SAAA,qBAAA,CAE1D,CAAA,CAAA,CAAA,EAGFA,EAAAA,IAAC,SAAA,CACA,IAAKkG,EACL,MAAO,CACN,QAASV,EAAe,QAAU,OAClC,MAAO,OACP,OAAQ,OACR,OAAQ,MAAA,EAET,MAAM,sKACN,OAAQ,IAAMC,EAAgB,EAAI,EAClC,MAAM,kBAAA,CAAA,CACP,CAAA,CACD,CAAA,CAAA,CAAA,EAED,SAAS,IAAA,CAEX,CAEA,OACC5C,EAAAA,KAAC,MAAA,CACA,UAAW,iDAAiDP,CAAS,GACrE,MAAO,CAAE,MAAO,eAAA,EAEhB,SAAA,CAAAtC,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAmB,SAAA,0BAAuB,EACvDA,EAAAA,IAAC,SAAA,CACA,UAAU,2CACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,mBACZ,MAAO,gBACP,YAAa,GACb,aAAc,EAAA,EAEf,QAASJ,EACT,SAAA,SAAA,CAAA,CAED,CAAA,CAAA,CAGH,CAEA,SAASuG,GAAezF,EAAiBnJ,EAAyC,CACjF,MAAM6O,EAAM,IAAI,IAAI,qBAAsB1F,CAAO,EACjD,SAAW,CAAC2F,EAAK9L,CAAK,IAAK,OAAO,QAAQhD,CAAM,EAC3CgD,GAAS,MAAQA,IAAU,IAC9B6L,EAAI,aAAa,IAAIC,EAAK,OAAO9L,CAAK,CAAC,EAGzC,OAAO6L,EAAI,SAAA,CACZ,CChWO,SAASE,GAAe,CAAE,UAAAhE,EAAY,IAA2B,CACtE,KAAM,CAAE,YAAArD,EAAa,mBAAAC,EAAoB,SAAAQ,CAAA,EAAaO,GAAA,EAEtDxH,EAAAA,UAAU,IAAM,CACTwG,IACDA,EAAY,SAAW,YACzBS,EAAS,UAAU,EACV,CAAC,SAAU,YAAa,UAAW,UAAU,EAAE,SAAST,EAAY,MAAM,GACnFS,EAAS,OAAO,EAEpB,EAAG,CAACT,GAAA,YAAAA,EAAa,OAAQS,CAAQ,CAAC,EAElC,MAAM6G,EAAmB,IAAM,CAC7B,GAAI,CAACtH,EAAa,MAAO,2BACzB,OAAQA,EAAY,OAAA,CAClB,IAAK,UACH,MAAO,sCACT,IAAK,aACH,MAAO,iCACT,QACE,MAAO,eAAA,CAEb,EAEA,OACE4D,EAAAA,KAAC,MAAA,CAAI,UAAW,oEAAoEP,CAAS,GAC3F,SAAA,CAAAtC,EAAAA,IAAC,OAAI,UAAU,OACb,eAAC,MAAA,CAAI,UAAU,oCAAoC,CAAA,CACrD,EAEAA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,MAAO,CAAE,MAAO,eAAA,EAC5D,SAAAuG,EAAA,CAAiB,CACpB,EAECrH,GACCc,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,oBAAA,CAAkB,EAG5Ff,GACC4D,EAAAA,KAAC,MAAA,CAAI,UAAU,wBAAwB,MAAO,CAAE,WAAY,mBAAoB,aAAc,EAAG,QAAS,IACxG,SAAA,CAAA7C,MAACwG,IAAU,MAAM,WAAW,MAAOvH,EAAY,QAAS,KAAI,GAAC,QAC5DuH,GAAA,CAAU,MAAM,WAAW,MAAOvH,EAAY,QAAS,EACxDe,EAAAA,IAACwG,GAAA,CACC,MAAM,SACN,MAAO,GAAGvH,EAAY,UAAU,IAAIA,EAAY,YAAY,EAAA,CAAA,EAE9De,EAAAA,IAACwG,GAAA,CACC,MAAM,YACN,MAAO,GAAGvH,EAAY,cAAgB,KAAK,IAAIA,EAAY,cAAc,EAAA,CAAA,QAE1EuH,GAAA,CAAU,MAAM,UAAU,MAAOvH,EAAY,QAAS,EACvDe,EAAAA,IAACwG,GAAA,CACC,MAAM,aACN,MAAO,GAAGvH,EAAY,cAAc,MAAM,EAAG,EAAE,CAAC,MAAMA,EAAY,cAAc,MAAM,EAAE,CAAC,GACzF,KAAI,EAAA,CAAA,CACN,EACF,EAGF4D,EAAAA,KAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAA7C,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,mCAAA,CAExE,EACAA,EAAAA,IAAC,KAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,yEAAA,CAEzE,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,SAASwG,GAAU,CAAE,MAAAC,EAAO,MAAAlM,EAAO,KAAAmM,GAA0D,CAC3F,OACE7D,EAAAA,KAAC,MAAA,CACC,UAAU,yCACV,MAAO,CAAE,aAAc,4BAAA,EAEvB,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA8B,SAAAyG,CAAA,CAAM,EAClFzG,EAAAA,IAAC,OAAA,CACC,UAAW,2BAA2B0G,EAAO,YAAc,EAAE,GAC7D,MAAO,CAAE,MAAO,eAAA,EAEf,SAAAnM,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CCpFO,SAASoM,GAAa,CAC3B,UAAArE,EAAY,GACZ,YAAAsE,EACA,OAAAC,EACA,eAAAC,EAAiB,MACnB,EAAsB,CACpB,KAAM,CAAE,YAAA7H,EAAa,MAAArE,EAAO,SAAA+B,CAAA,EAAasD,GAAA,EACnCpD,EAASjC,EAAM,WAAa,OAE5BmM,EAAiB,IAAM,CAC3B,GAAI,EAAC9H,GAAA,MAAAA,EAAa,iBAAiB,OAAO,KAC1C,GAAI,CAAC2H,EAAa,CAChB,MAAMI,EAA2C,CAC/C,SAAU,mCACV,QAAS,sCACT,SAAU,kCACV,SAAU,8CACV,KAAM,mCACN,QAAS,oCACT,OAAQ,iCACR,UAAW,mCACX,OAAQ,iCAAA,EAGV,OADgBA,EAAiBpM,EAAM,OAAO,GAAKoM,EAAiB,UACrD,QAAQ,WAAY/H,EAAY,eAAe,CAChE,CACA,OAAO2H,EAAY,QAAQ,WAAY3H,EAAY,eAAe,CACpE,EAEMgI,EAAa,IAAM,CACnBJ,EACFA,EAAA,EAEAlK,EAAS,CAAE,KAAM,QAAS,CAE9B,EAEMuK,EAAeH,EAAA,EAErB,OACElE,EAAAA,KAAC,MAAA,CAAI,UAAW,qDAAqDP,CAAS,GAE5E,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CACC,UAAU,wCACV,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,aAAc,MAAO,WAAY,2BAAA,EAEjE,SAAAA,EAAAA,IAAC,MAAA,CAAI,QAAQ,YAAY,MAAM,KAAK,OAAO,KAAK,KAAK,QACnD,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,4DAA4D,CAAA,CACtE,CAAA,CAAA,EAGFA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,MAAO,CAAE,MAAO,eAAA,EAC5D,SAAAnD,EAAS,iBAAmB,oBAAA,CAC/B,EAEAmD,EAAAA,IAAC,KAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,2BAC7C,SAAAnD,EACG,SAAQoC,GAAA,YAAAA,EAAa,eAAgBrE,EAAM,YAAY,8BACvD,SAAQqE,GAAA,YAAAA,EAAa,iBAAkBrE,EAAM,cAAc,gCAAA,CAEjE,EAECqE,GACC4D,EAAAA,KAAC,MAAA,CAAI,UAAU,wBAAwB,MAAO,CAAE,WAAY,mBAAoB,aAAc,EAAG,QAAS,IACxG,SAAA,CAAA7C,EAAAA,IAACwG,GAAA,CACC,MAAO3J,EAAS,cAAgB,kBAChC,MAAO,GAAGoC,EAAY,YAAY,IAAIA,EAAY,cAAc,GAChE,UAAS,EAAA,CAAA,EAEXe,EAAAA,IAACwG,GAAA,CACC,MAAO3J,EAAS,gBAAkB,cAClC,MAAO,GAAGoC,EAAY,UAAU,IAAIA,EAAY,YAAY,EAAA,CAAA,QAE7DuH,GAAA,CAAU,MAAM,UAAU,MAAOvH,EAAY,QAAS,EACvDe,EAAAA,IAACwG,GAAA,CACC,MAAM,SACN,MAAO,GAAGvH,EAAY,cAAc,MAAM,EAAG,EAAE,CAAC,MAAMA,EAAY,cAAc,MAAM,EAAE,CAAC,GACzF,KAAI,EAAA,CAAA,EAELA,EAAY,iBACXe,EAAAA,IAACwG,GAAA,CACC,MAAM,cACN,MAAO,GAAGvH,EAAY,gBAAgB,MAAM,EAAG,EAAE,CAAC,MAAMA,EAAY,gBAAgB,MAAM,EAAE,CAAC,GAC7F,KAAI,EAAA,CAAA,QAGPuH,GAAA,CAAU,MAAM,WAAW,MAAOvH,EAAY,QAAS,EACxDe,MAACwG,IAAU,MAAM,WAAW,MAAOvH,EAAY,QAAS,KAAI,GAAC,EAC5DA,EAAY,aACXe,EAAAA,IAACwG,GAAA,CACC,MAAM,YACN,MAAO,IAAI,KAAKvH,EAAY,WAAW,EAAE,eAAA,CAAe,CAAA,CAC1D,EAEJ,EAGF4D,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACZ,SAAA,CAAAqE,GACClH,EAAAA,IAAC,IAAA,CACC,KAAMkH,EACN,OAAO,SACP,IAAI,sBACJ,UAAU,mFACV,MAAO,CAAE,OAAQ,GAAI,aAAc,EAAG,WAAY,mBAAoB,MAAO,gBAAiB,eAAgB,MAAA,EAC/G,SAAA,kBAAA,CAAA,EAIHlH,EAAAA,IAAC,SAAA,CACC,UAAU,kDACV,MAAO,CAAE,OAAQ,GAAI,aAAc,EAAG,WAAY,kBAAmB,MAAO,mBAAA,EAC5E,QAASiH,EAER,SAAAH,CAAA,CAAA,CACH,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,SAASN,GAAU,CAAE,MAAAC,EAAO,MAAAlM,EAAO,KAAAmM,EAAM,UAAAS,GAAoF,CAC3H,OACEtE,EAAAA,KAAC,MAAA,CACC,UAAU,yCACV,MAAO,CAAE,aAAc,4BAAA,EAEvB,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA8B,SAAAyG,CAAA,CAAM,EAClFzG,EAAAA,IAAC,OAAA,CACC,UAAW,2BAA2B0G,EAAO,YAAc,EAAE,GAC7D,MAAO,CAAE,MAAOS,EAAY,4BAA8B,eAAA,EAEzD,SAAA5M,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CCzIO,SAAS6M,GAAU,CACxB,UAAA9E,EAAY,GACZ,QAAA+E,EACA,aAAAC,EAAe,qBACjB,EAAmB,CACjB,KAAM,CAAE,MAAA1M,EAAO,YAAAqE,EAAa,SAAAtC,EAAU,SAAA+C,CAAA,EAAaO,GAAA,EAC7CpD,EAASjC,EAAM,WAAa,OAE5B2M,EAAgB,IAAM,CAC1B,GAAItI,EACF,OAAQA,EAAY,OAAA,CAClB,IAAK,SAAU,MAAO,iBACtB,IAAK,YAAa,MAAO,kBACzB,IAAK,UAAW,MAAO,gBACvB,IAAK,WAAY,MAAO,iBACxB,QAAS,MAAO,sBAAA,CAGpB,MAAO,sBACT,EAEMuI,EAAkB,IAAM,CAC5B,GAAI5M,EAAM,aAAc,OAAOA,EAAM,aACrC,GAAIqE,EACF,OAAQA,EAAY,OAAA,CAClB,IAAK,SACH,OAAOpC,EACH,sDACA,2FACN,IAAK,YACH,OAAOA,EACH,sDACA,sDACN,IAAK,UACH,OAAOA,EACH,mDACA,uDACN,IAAK,WACH,OAAOA,EACH,iFACA,qGACN,QACE,MAAO,iDAAA,CAGb,MAAO,iDACT,EAEM4K,EAAc,IAAM,CACxB9K,EAAS,CAAE,KAAM,cAAe,EAC5B0K,EACFA,EAAA,GAEA1K,EAAS,CAAE,KAAM,QAAS,EAC1B+C,EAAS,QAAQ,EAErB,EAEMgI,EAAkB,IAAM,CAC5B/K,EAAS,CAAE,KAAM,QAAS,EAC1B+C,EAAS,QAAQ,CACnB,EAEA,OACEmD,EAAAA,KAAC,MAAA,CAAI,UAAW,qDAAqDP,CAAS,GAE5E,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CACC,UAAU,wCACV,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,aAAc,MAAO,WAAY,yBAAA,EAEjE,SAAAA,EAAAA,IAAC,MAAA,CAAI,QAAQ,YAAY,MAAM,KAAK,OAAO,KAAK,KAAK,QACnD,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,gHAAgH,CAAA,CAC1H,CAAA,CAAA,EAGFA,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,MAAO,CAAE,MAAO,eAAA,EAC5D,SAAAuH,EAAA,CAAc,CACjB,EAEAvH,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,yBAAA,EAC7C,SAAAwH,EAAA,CAAgB,CACnB,EAECvI,GACCe,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAwB,MAAO,CAAE,WAAY,mBAAoB,aAAc,EAAG,QAAS,EAAA,EACxG,SAAA6C,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,UAAA,CAAQ,EACnFA,EAAAA,IAAC,OAAA,CAAK,UAAU,oCAAoC,MAAO,CAAE,MAAO,eAAA,EACjE,SAAAf,EAAY,OAAA,CACf,CAAA,CAAA,CACF,CAAA,CACF,EAGF4D,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAA7C,EAAAA,IAAC,SAAA,CACC,UAAU,kDACV,MAAO,CAAE,OAAQ,GAAI,aAAc,EAAG,WAAY,kBAAmB,MAAO,mBAAA,EAC5E,QAASyH,EACV,SAAA,WAAA,CAAA,EAGDzH,EAAAA,IAAC,SAAA,CACC,UAAU,kDACV,MAAO,CAAE,OAAQ,GAAI,aAAc,EAAG,WAAY,mBAAoB,MAAO,eAAA,EAC7E,QAAS0H,EACV,SAAA,YAAA,CAAA,CAED,EACF,EAEA7E,EAAAA,KAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAAA,OAAC,KAAE,UAAU,cAAc,MAAO,CAAE,MAAO,2BAA6B,SAAA,CAAA,qBACnD,IACnB7C,EAAAA,IAAC,IAAA,CACC,KAAM,UAAUsH,CAAY,GAC5B,UAAU,YACV,MAAO,CAAE,MAAO,iBAAA,EAEf,SAAAA,CAAA,CAAA,CACH,EACF,EACCrI,UACE,IAAA,CAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,CAAA,cAC3DA,EAAY,OAAA,CAAA,CAC1B,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CChIA,SAAS0I,GAAgBC,EAAyB,CAChD,OAAIA,EAAQ,QAAU,GAAWA,EAC1B,GAAGA,EAAQ,MAAM,EAAG,CAAC,CAAC,MAAMA,EAAQ,MAAM,EAAE,CAAC,EACtD,CAEO,SAASC,GAAY,CAAE,UAAAvF,EAAY,GAAI,iBAAAwF,EAAkB,YAAAC,GAAiC,OAC/F,KAAM,CACJ,OAAAxQ,EACA,cAAAuF,EACA,MAAAlC,EACA,eAAAiB,EACA,OAAA4C,EACA,YAAAG,EACA,YAAAxF,EACA,aAAAyF,CAAA,EACEoB,GAAA,EAEEpD,EAASjC,EAAM,WAAa,OAC5B,CAAC7C,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDoQ,EAAczQ,GAAA,YAAAA,EAAQ,SAAS,KAAM0Q,GAAMA,EAAE,KAAOpM,GAGpDqM,GAAe/K,EAAAsB,GAAA,YAAAA,EAAQ,YAAR,MAAAtB,EAAmB,aAAe,WAAWsB,EAAO,UAAU,YAAY,EAAI,KAC7F0J,EAAc,WAAWvN,EAAM,UAAU,GAAK,EAC9CwN,EAAsB,CAAC,EAAEN,GAAoBC,GAAe,CAAClL,GAAUwE,GAAazG,EAAM,cAAc,GAAKsN,GAC7GG,EAAiBD,GAAuBxN,EAAM,eAAe,cAAc,SAASA,EAAM,aAAa,aAAa,EACpH0N,EAAsBF,GAAuBD,EAAc,EAC7DzG,GAAa2G,EAAiBF,EAAcA,EAAcD,CAAY,EACtE,KAEEK,EAAgB,SAAY,CAChCvQ,EAAS,IAAI,EACb,GAAI,CACF4G,EAAA,EACA,MAAMxF,EAAA,CACR,OAASZ,EAAK,CACZ,MAAMiH,GAAUjH,aAAe,MAAQA,EAAI,QAAU,yBACrDR,EAASyH,EAAO,CAClB,CACF,EAEA,OAAI3C,EAEA+F,EAAAA,KAAC,MAAA,CAAI,UAAW,kDAAkDP,CAAS,GACzE,SAAA,CAAAtC,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,EAC/BA,EAAAA,IAAC,KAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,YAAA,CAAU,CAAA,EACzF,EAKF6C,EAAAA,KAAC,MAAA,CAAI,UAAW,yCAAyCP,CAAS,GAChE,SAAA,CAAAtC,EAAAA,IAAC,KAAA,CAAG,UAAU,iCAAiC,MAAO,CAAE,MAAO,eAAA,EAC5D,SAAAnD,EAAS,eAAiB,kBAAA,CAC7B,EAEAgG,EAAAA,KAAC,MAAA,CAAI,UAAU,wBAAwB,MAAO,CAAE,WAAY,mBAAoB,aAAc,EAAG,QAAS,EAAA,EACvG,SAAA,CAAAmF,GACCnF,EAAAA,KAAC,OAAI,UAAU,yCAAyC,MAAO,CAAE,aAAc,8BAC7E,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,UAAA,CAAQ,EACnF6C,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACb,SAAA,CAAAmF,EAAY,MACXhI,EAAAA,IAAC,MAAA,CAAI,IAAKgI,EAAY,KAAM,IAAKA,EAAY,KAAM,MAAO,GAAI,OAAQ,GAAI,MAAO,CAAE,aAAc,GAAK,EAExGhI,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO,eAAA,EAAoB,SAAAgI,EAAY,IAAA,CAAK,CAAA,CAAA,CACjG,CAAA,EACF,EAGDnL,EACCgG,EAAAA,KAAAsC,WAAA,CACE,SAAA,CAAAnF,EAAAA,IAACwG,GAAA,CAAU,MAAM,WAAW,MAAO,GAAG5L,EAAM,YAAY,IAAIA,EAAM,cAAc,GAAI,UAAS,GAAC,EAC9FoF,MAACwG,IAAU,MAAM,cAAc,MAAO,GAAG5L,EAAM,YAAY,SAAA,CAAW,CAAA,CAAA,CACxE,EAEAiI,EAAAA,KAAAsC,EAAAA,SAAA,CACE,SAAA,CAAAnF,EAAAA,IAACwG,GAAA,CAAU,MAAM,UAAU,MAAO,GAAG5L,EAAM,UAAU,IAAIA,EAAM,YAAY,GAAI,UAAS,GAAC,EACzFoF,EAAAA,IAACwG,GAAA,CACC,MAAM,cACN,MAAO8B,EAAsB,GAAGA,CAAmB,IAAI1N,EAAM,cAAc,GAAK,GAAGA,EAAM,cAAc,OAAOA,EAAM,OAAO,EAAA,CAAA,EAE7HoF,EAAAA,IAACwG,GAAA,CAAU,MAAM,SAAS,MAAOmB,GAAgB/M,EAAM,aAAa,EAAG,KAAI,EAAA,CAAC,EAC3EwN,GAAuBE,GACtBzF,EAAAA,KAAC,MAAA,CAAI,UAAU,mBAAmB,MAAO,CAAE,MAAO,sBAAuB,WAAY,MAAA,EAAU,SAAA,CAAA,2DACpCyF,EAAoB,IAAE1N,EAAM,eAAe,6BAA2BmN,EAAY,WAAA,CAAA,CAC7I,CAAA,EAEJ,QAGDvB,GAAA,CAAU,MAAM,UAAU,MAAO5L,EAAM,QAAS,EAEhDiC,GAAUjC,EAAM,eACfoF,EAAAA,IAACwG,GAAA,CAAU,MAAM,iBAAiB,MAAOmB,GAAgB/M,EAAM,aAAa,EAAG,KAAI,EAAA,CAAC,CAAA,EAExF,EAEC7C,GACCiI,EAAAA,IAAC,IAAA,CAAE,UAAU,mBAAmB,MAAO,CAAE,MAAO,SAAA,EAAc,SAAAjI,CAAA,CAAM,EAGtEiI,EAAAA,IAAC,SAAA,CACC,UAAU,yFACV,MAAO,CAAE,OAAQ,GAAI,aAAc,EAAG,WAAY,kBAAmB,MAAO,oBAAqB,QAASnB,EAAe,GAAM,CAAA,EAC/H,SAAUA,EACV,QAAS0J,EAER,WACC1F,EAAAA,KAAAsC,EAAAA,SAAA,CACE,SAAA,CAAAnF,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAA,CAAuB,EAAE,eAAA,EAE3C,EAEAnD,EAAS,iBAAmB,eAAA,CAAA,CAEhC,EACF,CAEJ,CAEA,SAAS2J,GAAU,CAAE,MAAAC,EAAO,MAAAlM,EAAO,KAAAmM,EAAM,UAAAS,GAAoF,CAC3H,OACEtE,EAAAA,KAAC,OAAI,UAAU,yCAAyC,MAAO,CAAE,aAAc,8BAC7E,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA8B,SAAAyG,CAAA,CAAM,EAClFzG,EAAAA,IAAC,OAAA,CACC,UAAW,2BAA2B0G,EAAO,YAAc,EAAE,GAC7D,MAAO,CAAE,MAAOS,EAAY,4BAA8B,eAAA,EAEzD,SAAA5M,CAAA,CAAA,CACH,EACF,CAEJ,CClJO,SAASiO,GAAM,CACpB,OAAAC,EACA,QAAAC,EACA,SAAAvM,CACF,EAIG,CACD,KAAM,CAACwM,EAASC,CAAU,EAAIhR,EAAAA,SAAS,EAAK,EACtC,CAACiR,EAAWC,CAAY,EAAIlR,EAAAA,SAAS,EAAK,EAEhDa,EAAAA,UAAU,IAAM,CACd,GAAIgQ,EACFG,EAAW,EAAI,EACf,sBAAsB,IAAM,sBAAsB,IAAME,EAAa,EAAI,CAAC,CAAC,UAClEH,EAAS,CAClBG,EAAa,EAAK,EAClB,MAAMC,EAAI,WAAW,IAAMH,EAAW,EAAK,EAAG,GAAG,EACjD,MAAO,IAAM,aAAaG,CAAC,CAC7B,CACF,EAAG,CAACN,CAAM,CAAC,EAEX,MAAMO,EAAc3Q,EAAAA,YAAY,IAAM,CACpCyQ,EAAa,EAAK,EAClB,WAAW,IAAMJ,EAAA,EAAW,GAAG,CACjC,EAAG,CAACA,CAAO,CAAC,EAWZ,OATAjQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACgQ,EAAQ,OACb,MAAMQ,EAAS7D,GAAqB,CAC9BA,EAAE,MAAQ,UAAU4D,EAAA,CAC1B,EACA,cAAO,iBAAiB,UAAWC,CAAK,EACjC,IAAM,OAAO,oBAAoB,UAAWA,CAAK,CAC1D,EAAG,CAACR,EAAQO,CAAW,CAAC,EAEnBL,EAGH3I,EAAAA,IAAC,MAAA,CACC,UAAU,wDACV,MAAO,CAAE,QAAS6I,EAAY,EAAI,CAAA,EAElC,SAAA7I,EAAAA,IAAC,MAAA,CACC,UAAU,4EACV,MAAO,CAAE,WAAY,oBAAqB,UAAW6I,EAAY,gBAAkB,kBAAA,EAElF,SAAA,OAAO1M,GAAa,WAAaA,EAAS6M,CAAW,EAAI7M,CAAA,CAAA,CAC5D,CAAA,EAZiB,IAevB,CCrDO,SAAS+M,GAAc,CAAE,KAAAC,EAAM,OAAAC,EAAS,IAAyC,CACtF,MAAMC,EAAS,aACTC,EAAMD,EAAO,QAAQF,CAAI,EAC/B,OAAIG,IAAQ,GAAWtJ,EAAAA,IAAC,QAAM,SAAAmJ,EAAK,EAEjCnJ,MAAC,QAAK,UAAU,aAAa,MAAO,CAAE,OAAAoJ,EAAQ,WAAY,GAAGA,CAAM,MACjE,SAAApJ,MAAC,QAAK,UAAU,yBAAyB,MAAO,CAAE,UAAW,eAAesJ,EAAMF,CAAM,OACrF,SAAAC,EAAO,MAAM,EAAE,EAAE,OAChBrJ,MAAC,OAAA,CAAa,UAAU,QAAQ,MAAO,CAAE,OAAAoJ,EAAQ,WAAY,GAAGA,CAAM,IAAA,EAAS,SAAAG,CAAA,EAApEA,CAAsE,CAClF,CAAA,CACH,CAAA,CACF,CAEJ,CAEO,SAASC,GAAe,CAC7B,MAAAjP,EACA,OAAA6O,EAAS,GACT,UAAA9G,EAAY,GACZ,MAAAmH,EAAQ,CAAA,CACV,EAKG,CACD,OACEzJ,MAAC,OAAA,CAAK,UAAAsC,EAAsB,MAAO,CAAE,QAAS,cAAe,GAAGmH,CAAA,EAC7D,SAAAlP,EAAM,MAAM,EAAE,EAAE,IAAI,CAACmP,EAAIC,IACxB3J,EAAAA,IAACkJ,GAAA,CAAsB,KAAMQ,EAAI,OAAAN,CAAA,EAAbO,CAA6B,CAClD,CAAA,CACH,CAEJ,CCnCO,SAASC,EAAS,CACvB,EAAAC,EACA,EAAAC,EACA,UAAAxH,EAAY,EACd,EAIG,CACD,OAAOtC,EAAAA,IAAC,MAAA,CAAI,UAAW,YAAYsC,CAAS,GAAI,MAAO,CAAE,MAAOuH,EAAG,OAAQC,CAAA,CAAE,CAAG,CAClF,CAEO,SAASC,IAAe,CAC7B,OACElH,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,WAAY,mBAAoB,aAAc,CAAA,EACpG,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,OAAO,EACzC/G,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAA7C,EAAAA,IAAC4J,EAAA,CAAS,EAAG,IAAK,EAAG,GAAI,EACzB5J,EAAAA,IAAC4J,EAAA,CAAS,EAAG,GAAI,EAAG,EAAA,CAAI,CAAA,CAAA,CAC1B,CAAA,EACF,EACA/G,EAAAA,KAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,WAAY,mBAAoB,aAAc,EAAG,UAAW,CAAA,EAClH,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,OAAO,EACzC/G,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAA7C,EAAAA,IAAC4J,EAAA,CAAS,EAAG,IAAK,EAAG,GAAI,EACzB5J,EAAAA,IAAC4J,EAAA,CAAS,EAAG,GAAI,EAAG,EAAA,CAAI,CAAA,CAAA,CAC1B,CAAA,EACF,EACA/G,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACb,SAAA,CAAA7C,EAAAA,IAAC4J,EAAA,CAAS,EAAG,IAAK,EAAG,GAAI,EACzB5J,EAAAA,IAAC4J,EAAA,CAAS,EAAG,GAAI,EAAG,EAAA,CAAI,CAAA,EAC1B,EACA/G,EAAAA,KAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,SAAS,EAC3C5J,EAAAA,IAAC4J,EAAA,CAAS,EAAE,OAAO,EAAG,EAAA,CAAI,CAAA,EAC5B,EACA5J,EAAAA,IAAC,MAAA,CAAI,UAAU,QAAA,CAAS,QACvB4J,EAAA,CAAS,EAAE,OAAO,EAAG,GAAI,UAAU,OAAO,EAC3C5J,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACb,eAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,wBAAA,EAA4B,8BAAkB,CAAA,CAC9F,CAAA,EACF,CAEJ,CC5CO,SAASgK,GAAY,CAAE,QAAA/F,GAAoC,CAChE,OACEjE,EAAAA,IAAC,SAAA,CACC,QAAAiE,EACA,UAAU,2EACV,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,gBAAiB,mBAAA,EACjD,aAAcmB,GAAMA,EAAE,cAAc,MAAM,gBAAkB,uBAC5D,aAAcA,GAAMA,EAAE,cAAc,MAAM,gBAAkB,oBAE5D,SAAApF,EAAAA,IAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,eAAC,OAAA,CAAK,EAAE,mBAAmB,OAAO,sBAAsB,YAAY,MAAM,cAAc,QAAQ,CAAA,CAClG,CAAA,CAAA,CAGN,CCZO,SAASiK,GAAY,CAC1B,MAAA1P,EACA,SAAA2P,EACA,YAAAC,EAAc,EAChB,EAIG,CACD,KAAM,CAACC,EAASC,CAAU,EAAIzS,EAAAA,SAAS,EAAK,EAC5C,OACEiL,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACb,SAAA,CAAA7C,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAAzF,EACA,SAAU6K,GAAK8E,EAAS9E,EAAE,OAAO,KAAK,EACtC,QAAS,IAAMiF,EAAW,EAAI,EAC9B,OAAQ,IAAMA,EAAW,EAAK,EAC9B,YAAAF,EACA,MAAO,CAAE,OAAQ,GAAI,aAAc,IAAK,OAAQ,aAAaC,EAAU,wBAA0B,iBAAiB,GAAI,QAAS,OAAQ,UAAW,OAAQ,MAAO,gBAAiB,QAAS,KAAK7P,EAAQ,GAAK,EAAE,YAAa,SAAU,GAAI,gBAAiB,aAAA,EAC3P,UAAU,uCAAA,CAAA,EAEXA,GACCyF,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMkK,EAAS,EAAE,EAC1B,UAAU,uGACV,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,gBAAiB,oBAAqB,aAAc,CAAA,EAEpF,SAAAlK,EAAAA,IAAC,OAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,UAAU,KAAK,OAC/C,eAAC,OAAA,CAAK,EAAE,mBAAmB,OAAO,sBAAsB,YAAY,MAAM,cAAc,QAAQ,CAAA,CAClG,CAAA,CAAA,CACF,EAEJ,CAEJ,CCdO,SAASsK,GAAkB,CACjC,QAAA5B,EACA,SAAA6B,EACA,WAAAC,EACA,aAAArP,EAAe,GACf,aAAAsP,CACD,EAA2B,CAC1B,KAAM,CAACC,EAAQC,CAAS,EAAI/S,EAAAA,SAAS,EAAE,EAGjCgT,EAAevO,EAAAA,QAAwB,IAAM,CAClD,GAAI,CAACmO,GAAcA,EAAW,SAAW,EAAG,OAAOvJ,GAGnD,MAAM4J,EAAY,IAAI,IAAI5J,GAAgB,IAAKhH,GAAM,CAACA,EAAE,KAAMA,EAAE,IAAI,CAAC,CAAC,EAEtE,OAAOuQ,EAAW,IAAKvQ,IAAO,CAC7B,KAAMA,EAAE,KACR,KAAMA,EAAE,MAAQ4Q,EAAU,IAAI5Q,EAAE,IAAI,GAAKA,EAAE,IAAA,EAC1C,CACH,EAAG,CAACuQ,CAAU,CAAC,EAETvF,EAAW5I,EAAAA,QAAQ,IAAM,CAC9B,MAAMyO,EAAMJ,EAAO,KAAA,EAAO,YAAA,EAG1B,GAAI,CAACI,EAAK,CACT,GAAIL,EAAc,CACjB,MAAMvF,EAAW0F,EAAa,KAAM3Q,GAAMA,EAAE,OAASwQ,CAAY,EACjE,GAAIvF,EAAU,CACb,MAAM6F,EAAOH,EAAa,OAAQ3Q,GAAMA,EAAE,OAASwQ,CAAY,EAC/D,MAAO,CAACvF,EAAU,GAAG6F,CAAI,CAC1B,CACD,CACA,OAAOH,CACR,CAEA,OAAOA,EAAa,OAClB3Q,GAAMA,EAAE,KAAK,cAAc,SAAS6Q,CAAG,GAAK7Q,EAAE,KAAK,YAAA,EAAc,SAAS6Q,CAAG,CAAA,CAEhF,EAAG,CAACF,EAAcF,EAAQD,CAAY,CAAC,EAEvC,OACC5H,EAAAA,KAAAsC,WAAA,CACC,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,6BACd,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CAChC,EACA1I,EAAAA,IAAC,KAAA,CACA,UAAU,gDACV,MAAO,CACN,MAAO,gBACP,SAAU,GACV,WAAY,IACZ,UAAW,EACX,aAAc,EAAA,EAEf,SAAA,sBAAA,CAAA,EAGDA,EAAAA,IAACiK,GAAA,CAAY,MAAOS,EAAQ,SAAUC,EAAW,EACjD9H,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAoC,EAAS,IAAI,CAAChL,EAAGqP,IAAQ,CAEzB,MAAM0B,EAAc/Q,EAAE,OAASA,EAAE,KAAOA,EAAE,KAAO,GAC3CgR,EAAaR,IAAiBxQ,EAAE,KACtC,cACE,MAAA,CACA,SAAA,CAAA4I,EAAAA,KAAC,SAAA,CACA,QAAS,IAAM0H,EAAStQ,EAAE,IAAI,EAC9B,UAAU,mEACV,MAAO,CAAE,MAAO,gBAAiB,IAAK,GAAI,QAAS,WAAY,OAAQ,QAAA,EAEvE,SAAA,CAAA+F,MAAC+C,IAAS,aAAc9I,EAAE,KAAM,KAAM,GAAI,QAASkB,EAAc,EACjE0H,EAAAA,KAAC,MAAA,CAAI,UAAU,2CACd,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,SAAA/F,EAAE,KAAK,EACnD+Q,GACAhL,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,2BAC5C,SAAAgL,CAAA,CACF,CAAA,EAEF,EACCC,GACAjL,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,UAAU,WACrE,SAAAA,EAAAA,IAAC,OAAA,CACA,EAAE,yBACF,OAAO,4BACP,YAAY,IACZ,cAAc,QACd,eAAe,OAAA,CAAA,CAChB,CACD,CAAA,CAAA,CAAA,EAIDsJ,EAAMrE,EAAS,OAAS,GACxBjF,EAAAA,IAAC,MAAA,CACA,MAAO,CAAE,OAAQ,EAAG,WAAY,0CAAA,CAA2C,CAAA,CAC5E,CAAA,EA/BQ/F,EAAE,IAiCZ,CAEF,CAAC,EACAgL,EAAS,SAAW,GACpBjF,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,qBAAA,CAExF,CAAA,CAAA,CAEF,CAAA,EACD,CAEF,CCjHA,SAASkL,GAAY,CAAE,IAAA/I,EAAK,IAAAC,EAAK,KAAAC,EAAM,UAAAC,EAAW,MAAAmH,GAM/C,CACF,KAAM,CAACjH,EAAQC,CAAS,EAAI7K,EAAAA,SAAS,EAAK,EACpC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAS,EAAK,EAClC8K,EAAaxK,EAAAA,OAAOiK,CAAG,EAGzBO,EAAW,UAAYP,IAC1BO,EAAW,QAAUP,EACrBM,EAAU,EAAK,EACfzK,EAAS,EAAK,GAGf,MAAM2K,EAAatK,EAAAA,YAAY,IAAMoK,EAAU,EAAI,EAAG,CAAA,CAAE,EAClDG,EAAcvK,EAAAA,YAAY,IAAML,EAAS,EAAI,EAAG,CAAA,CAAE,EAExD,OACC6K,EAAAA,KAAC,MAAA,CAAI,UAAAP,EAAsB,MAAO,CAAE,GAAGmH,EAAO,MAAOpH,EAAM,OAAQA,EAAM,SAAU,YAEjF,SAAA,CAAA,CAACG,GAAU,CAACzK,GACZiI,EAAAA,IAAC,MAAA,CACA,UAAU,8CACV,MAAO,CAAE,WAAY,wBAAA,CAAyB,CAAA,EAI/CjI,EACAiI,EAAAA,IAAC,MAAA,CACA,UAAU,uFACV,MAAO,CAAE,WAAY,yBAA0B,MAAO,qBAAA,EAErD,SAAAoC,EAAI,MAAM,EAAG,CAAC,CAAA,CAAA,EAGhBpC,EAAAA,IAAC,MAAA,CACA,IAAAmC,EACA,IAAAC,EACA,MAAOC,EACP,OAAQA,EACR,OAAQM,EACR,QAASC,EACT,UAAW,gBAAgBJ,EAAS,cAAgB,WAAW,GAC/D,MAAO,CAAE,MAAOH,EAAM,OAAQA,EAAM,WAAY,uBAAA,CAAwB,CAAA,CACzE,EAEF,CAEF,CAmBO,SAAS8I,GAAoB,CAAE,QAAAzC,EAAS,SAAA6B,EAAU,QAAAa,EAAS,aAAAjQ,EAAe,GAAI,aAAAsP,EAAc,cAAAY,GAA2C,CAC7I,KAAM,CAACX,EAAQC,CAAS,EAAI/S,EAAAA,SAAS,EAAE,EAGjC0T,EAAYjP,EAAAA,QAA4B,IAAM,CACnD,GAAI,CAAC+O,GAAWA,EAAQ,SAAW,EAAG,OAAOpJ,GAE7C,MAAMC,EAA2B,CAAA,EACjC,UAAWhI,KAAKmR,EAAS,CACxB,MAAMG,EAAWtR,EAAE,UAAY,CAAA,EAEzBuR,EAAavR,EAAE,MAAQqG,GAAarG,EAAE,IAAI,GAAKA,EAAE,KACvD,GAAIsR,EAAS,SAAW,EAEvBtJ,EAAK,KAAK,CAAE,KAAMhI,EAAE,KAAM,KAAMuR,EAAY,MAAOvR,EAAE,KAAM,QAAS,EAAA,CAAO,MAE3E,WAAWwR,KAAOF,EAAU,CAC3B,MAAMzK,EAAY2K,EAAI,MAAQA,EAAI,IAAMA,EAAI,MAAQxR,EAAE,KACtDgI,EAAK,KAAK,CACT,KAAMhI,EAAE,KACR,KAAMuR,EACN,MAAO1K,EACP,UAAW2K,EAAI,KACf,QAAS,EAAA,CACT,CACF,CAEF,CACA,OAAOxJ,CACR,EAAG,CAACmJ,CAAO,CAAC,EAGNH,EAAa5S,EAAAA,YAAY,CAACiJ,EAAcN,IACtCyJ,IAAiBnJ,GAAQ+J,IAAkBrK,EAChD,CAACyJ,EAAcY,CAAa,CAAC,EAG1BpG,EAAW5I,EAAAA,QAAQ,IAAM,OAC9B,MAAMyO,EAAMJ,EAAO,KAAA,EAAO,YAAA,EAG1B,GAAI,CAACI,EAAK,CACT,GAAIL,GAAgBY,EAAe,CAClC,MAAMnG,EAAWoG,EAAU,KAAKrR,GAAKA,EAAE,OAASwQ,GAAgBxQ,EAAE,QAAUoR,CAAa,EACzF,GAAInG,EAAU,CACb,MAAM6F,EAAOO,EAAU,OAAOrR,GAAK,EAAEA,EAAE,OAASwQ,GAAgBxQ,EAAE,QAAUoR,EAAc,EAC1F,MAAO,CAACnG,EAAU,GAAG6F,CAAI,CAC1B,CACD,CACA,OAAOO,CACR,CAEA,MAAMI,EAAQZ,EAAI,MAAM,KAAK,EACvBa,EAA2D,CAAA,EAEjE,UAAW1R,KAAKqR,EAAW,CAC1B,MAAMtK,EAAQH,GAAa5G,EAAE,KAAK,EAC5B2R,EAAY5K,EAAQA,EAAM,KAAK,cAAgB,GAC/C6K,IAAa1O,EAAA6D,GAAA,YAAAA,EAAO,YAAP,YAAA7D,EAAkB,gBAAiB,GAChD2D,EAAY7G,EAAE,MAAM,YAAA,EACpBqH,EAAOrH,EAAE,KAAK,YAAA,EACd6R,EAAO7R,EAAE,KAAK,YAAA,EACd8R,EAAS,CAACzK,EAAMwK,EAAMF,EAAWC,EAAY/K,CAAS,EAI5D,GAAI,CADa4K,EAAM,MAAO3C,GAAMgD,EAAO,KAAM3O,GAAMA,EAAE,SAAS2L,CAAC,CAAC,CAAC,EACtD,SAGf,IAAIiD,EAAQ,EACR1K,IAASwJ,EAAKkB,GAAS,IAClB1K,EAAK,WAAWoK,EAAM,CAAC,CAAC,IAAGM,GAAS,IACzC/R,EAAE,UAAS+R,GAAS,IAEvBN,EAAM,OAAS,IACdE,EAAU,SAASF,EAAM,CAAC,CAAC,GAC3BG,EAAW,SAASH,EAAM,CAAC,CAAC,GAC5B5K,EAAU,SAAS4K,EAAM,CAAC,CAAC,KAE5BM,GAAS,IAEVL,EAAO,KAAK,CAAE,KAAM1R,EAAG,MAAA+R,EAAO,CAC/B,CAEA,OAAAL,EAAO,KAAK,CAACM,EAAGC,IAAMA,EAAE,MAAQD,EAAE,KAAK,EAChCN,EAAO,IAAK/J,GAAMA,EAAE,IAAI,CAChC,EAAG,CAAC0J,EAAWZ,EAAQD,EAAcY,CAAa,CAAC,EAEnD,OACCxI,EAAAA,KAAAsC,WAAA,CACC,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,6BACd,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CAChC,EACA1I,EAAAA,IAAC,KAAA,CACA,UAAU,gDACV,MAAO,CAAE,MAAO,gBAAiB,SAAU,GAAI,WAAY,IAAK,UAAW,EAAG,aAAc,EAAA,EAC5F,SAAA,wBAAA,CAAA,EAGDA,EAAAA,IAACiK,GAAA,CAAY,MAAOS,EAAQ,SAAUC,EAAW,EACjD9H,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAoC,EAAS,IAAI,CAAChL,EAAGqP,IAAQ,CACzB,MAAMtI,EAAQH,GAAa5G,EAAE,KAAK,EAC5B2R,GAAY5K,GAAA,YAAAA,EAAO,OAAQ/G,EAAE,WAAaA,EAAE,MAE5C+Q,EAAc/Q,EAAE,OAASA,EAAE,KAAOA,EAAE,KAAO,GAC3CkS,EAAelB,EAAWhR,EAAE,KAAMA,EAAE,KAAK,EAC/C,cACE,MAAA,CACA,SAAA,CAAA4I,EAAAA,KAAC,SAAA,CACA,QAAS,IAAM0H,EAAStQ,EAAE,KAAMA,EAAE,KAAK,EACvC,UAAU,mEACV,MAAO,CAAE,IAAK,GAAI,QAAS,WAAY,OAAQ,QAAA,EAG/C,SAAA,CAAA4I,EAAAA,KAAC,MAAA,CAAI,UAAU,oBAAoB,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,EAC9D,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CACA,UAAU,wBACV,MAAO,CAAE,WAAY,UAAW,aAAc,KAAA,EAE9C,SAAAA,EAAAA,IAACkL,GAAA,CACA,IAAK1K,GAAiBvG,EAAE,KAAMkB,CAAY,EAC1C,IAAKlB,EAAE,KACP,KAAM,EAAA,CAAA,CACP,CAAA,EAED+F,EAAAA,IAAC,MAAA,CACA,UAAU,WACV,MAAO,CACN,OAAQ,EACR,MAAO,EACP,OAAQ,sCACR,aAAc,MACd,WAAY,SAAA,EAGb,SAAAA,EAAAA,IAACkL,GAAA,CACA,IAAKnK,GAAgB9G,EAAE,MAAOkB,CAAY,EAC1C,IAAKlB,EAAE,MACP,KAAM,EAAA,CAAA,CACP,CAAA,CACD,EACD,QACC,MAAA,CAAI,UAAU,2BACd,SAAA4I,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CACA,UAAU,4BACV,MAAO,CAAE,MAAO,eAAA,EAEf,SAAA/F,EAAE,IAAA,CAAA,EAEH+Q,GACAhL,EAAAA,IAAC,OAAA,CACA,UAAU,cACV,MAAO,CAAE,MAAO,yBAAA,EAEf,SAAAgL,CAAA,CAAA,CACF,CAAA,CAEF,CAAA,CACD,EACAnI,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACd,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAC5C,SAAA4L,CAAA,CACF,EACCO,GACAnM,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACpD,SAAAA,EAAAA,IAAC,OAAA,CACA,EAAE,yBACF,OAAO,4BACP,YAAY,IACZ,cAAc,QACd,eAAe,OAAA,CAAA,CAChB,CACD,CAAA,CAAA,CAEF,CAAA,CAAA,CAAA,EAGAsJ,EAAMrE,EAAS,OAAS,GACxBjF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,OAAQ,EAAG,WAAY,0CAAA,CAA2C,CAAG,CAAA,CAAA,EAxE3E,GAAG/F,EAAE,IAAI,IAAIA,EAAE,KAAK,EA0E9B,CAEF,CAAC,EACAgL,EAAS,SAAW,GACpBjF,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,qBAAA,CAExF,CAAA,CAAA,CAEF,CAAA,EACD,CAEF,CCzQO,SAASoM,GAAmB,CAClC,QAAAnO,EACA,WAAA6G,EACA,SAAAyF,EACA,QAAA7B,CACD,EAA4B,CAC3B,KAAM,CAACgC,EAAQC,CAAS,EAAI/S,EAAAA,SAAS,EAAE,EAEjCqN,EAAW5I,EAAAA,QAAQ,IAAM,CAC9B,MAAMyO,EAAMJ,EAAO,KAAA,EAAO,YAAA,EAG1B,GAAI,CAACI,EAAK,CACT,GAAIhG,EAAY,CACf,MAAMI,EAAWjH,EAAQ,KAAMC,GAAMA,EAAE,KAAO4G,CAAU,EACxD,GAAII,EAAU,CACb,MAAM6F,EAAO9M,EAAQ,OAAQC,GAAMA,EAAE,KAAO4G,CAAU,EACtD,MAAO,CAACI,EAAU,GAAG6F,CAAI,CAC1B,CACD,CACA,OAAO9M,CACR,CAEA,OAAOA,EAAQ,OACbC,GACAA,EAAE,GAAG,cAAc,SAAS4M,CAAG,GAC/B5M,EAAE,KAAK,cAAc,SAAS4M,CAAG,GAChC5M,EAAE,aAAeA,EAAE,YAAY,cAAc,SAAS4M,CAAG,CAAA,CAE7D,EAAG,CAAC7M,EAASyM,EAAQ5F,CAAU,CAAC,EAEhC,OACCjC,EAAAA,KAAAsC,WAAA,CACC,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,6BACd,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CAChC,EACA1I,EAAAA,IAAC,KAAA,CACA,UAAU,gDACV,MAAO,CAAE,MAAO,gBAAiB,SAAU,GAAI,WAAY,IAAK,UAAW,EAAG,aAAc,EAAA,EAC5F,SAAA,uBAAA,CAAA,EAGDA,EAAAA,IAACiK,GAAA,CAAY,MAAOS,EAAQ,SAAUC,EAAW,EACjD9H,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAoC,EAAS,IAAI,CAAC/G,EAAGoL,IAAQ,CACzB,MAAM2B,EAAa/M,EAAE,KAAO4G,EACtBuH,EAAY9H,GAAqBrG,EAAE,GAAIA,EAAE,IAAI,EACnD,cACE,MAAA,CACA,SAAA,CAAA2E,EAAAA,KAAC,SAAA,CACA,QAAS,IAAM0H,EAASrM,EAAE,EAAE,EAC5B,UAAW,uDAAuDA,EAAE,YAAc,cAAgB,cAAc,GAChH,MAAO,CAAE,MAAO,gBAAiB,IAAK,GAAI,QAAS,WAAY,OAAQ,QAAA,EAEvE,SAAA,CAAA8B,EAAAA,IAAC,OAAA,CACA,UAAW,6CAA6C9B,EAAE,YAAc,SAAW,EAAE,GACrF,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,EAE3B,SAAAuG,GAAcvG,EAAE,GAAIA,EAAE,KAAM,EAAE,CAAA,CAAA,EAEhC2E,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CACA,UAAU,0CACV,MAAO,CAAE,MAAO,eAAA,EAEf,SAAAqM,CAAA,CAAA,EAEDnO,EAAE,aACF8B,EAAAA,IAAC,MAAA,CACA,UAAU,gCACV,MAAO,CAAE,MAAO,yBAAA,EAEf,SAAA9B,EAAE,WAAA,CAAA,CACJ,EAEF,EACC+M,GACAjL,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,UAAU,gBACrE,SAAAA,EAAAA,IAAC,OAAA,CACA,EAAE,yBACF,OAAO,4BACP,YAAY,IACZ,cAAc,QACd,eAAe,OAAA,CAAA,CAChB,CACD,CAAA,CAAA,CAAA,EAIDsJ,EAAMrE,EAAS,OAAS,GACxBjF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,OAAQ,EAAG,WAAY,0CAAA,CAA2C,CAAG,CAAA,CAAA,EA1C3E9B,EAAE,EA4CZ,CAEF,CAAC,EACA+G,EAAS,SAAW,GACpBjF,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,0BAAA,CAExF,CAAA,CAAA,CAEF,CAAA,EACD,CAEF,CC1HO,SAASsM,GAAa,CAC3B,QAAAC,EACA,SAAArC,EACA,YAAAsC,EAAc,iBAChB,EAIG,CACD,OACExM,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMkK,EAAS,CAACqC,CAAO,EAChC,UAAU,mDACV,MAAO,CACL,MAAO,GACP,OAAQ,GACR,aAAc,GACd,gBAAiBA,EAAUC,EAAc,iBAAA,EAG3C,SAAAxM,EAAAA,IAAC,MAAA,CACC,UAAU,oFACV,MAAO,CACL,MAAO,GACP,OAAQ,GACR,UAAWuM,EAAU,mBAAqB,iBAAA,CAC5C,CAAA,CACF,CAAA,CAGN,CClBA,MAAME,GAAiB,CACrB,CAAE,MAAO,iBAAkB,KAAM,oCAAA,EACjC,CAAE,MAAO,eAAgB,KAAM,0CAAA,CACjC,EAoBO,SAASC,GAAe,CAC7B,QAAAhE,EACA,SAAAiE,EACA,iBAAAC,EACA,OAAQC,EACR,aAAcC,EACd,gBAAAC,EAAkB,GAClB,QAAAtV,EACA,YAAAuV,EACA,gBAAAC,EACA,aAAA9R,EAAe,EACjB,EAAwB,CAItB,KAAM,CAAC+R,EAAWC,CAAY,EAAIvV,EAAAA,SAAS,EAAK,EAEhD,OACEiL,EAAAA,KAAAsC,WAAA,CACE,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,0CACb,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CACjC,EACA7F,EAAAA,KAAC,MAAA,CAAI,UAAU,iDAEZ,SAAA,CAAAoK,GACCpK,EAAAA,KAAAsC,WAAA,CACE,SAAA,CAAAnF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAW,8BACvB,SAAA6C,EAAAA,KAAC,SAAA,CACC,QAASoK,EACT,UAAU,kEACV,MAAO,CAAE,MAAO,UAAW,WAAY,OAAQ,OAAQ,OAAQ,OAAQ,UAAW,QAAS,QAAA,EAE3F,SAAA,CAAApK,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAApL,GAAW,CAACyV,EACXlN,EAAAA,IAAC,MAAA,CACC,IAAK,GAAG7E,CAAY,UAAU1D,EAAQ,aAAa,OACnD,IAAKA,EACL,MAAO,GACP,OAAQ,GACR,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,aAAc,MAAO,UAAW,OAAA,EAChE,QAAS,IAAM0V,EAAa,EAAI,CAAA,CAAA,EAGlCnN,EAAAA,IAACoN,GAAA,CAAU,KAAM,EAAA,CAAI,EAEvBvK,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CACC,UAAU,gCACV,MAAO,CAAE,MAAO,eAAA,EACjB,SAAA,UAAA,CAAA,EAGAgN,GACChN,EAAAA,IAAC,OAAA,CACC,UAAU,cACV,MAAO,CAAE,MAAO,yBAAA,EAEf,SAAAgN,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,EACF,QACCjJ,GAAA,CAAA,CAAa,CAAA,CAAA,CAAA,EAElB,EACA/D,MAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,WAAY,mBAAmB,CAAG,CAAA,EAC7D,EAID+M,GACClK,EAAAA,KAAAsC,WAAA,CACE,SAAA,CAAAnF,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAWiN,EAAkB,OAAS,4BAAA,EAClD,SAAApK,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAA7C,EAAAA,IAACkE,GAAA,CAAa,KAAM,EAAA,CAAI,EACxBlE,EAAAA,IAAC,OAAA,CACC,UAAU,0BACV,MAAO,CAAE,MAAO,eAAA,EACjB,SAAA,WAAA,CAAA,CAED,EACF,QACCsM,GAAA,CAAa,QAASK,EAAU,SAAUC,EAAkB,YAAY,SAAA,CAAU,CAAA,CAAA,CACrF,CAAA,CACF,EACA5M,MAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,WAAY,mBAAmB,CAAG,CAAA,EAC7D,EA2BDyM,GAAe,IAAKY,UAClB,MAAA,CACC,SAAA,CAAAxK,EAAAA,KAAC,IAAA,CACC,KAAMwK,EAAK,KACX,OAAO,SACP,IAAI,sBACJ,UAAU,kEACV,MAAO,CAAE,MAAO,UAAW,eAAgB,MAAA,EAE3C,SAAA,CAAArN,EAAAA,IAAC,OAAA,CACC,UAAU,0BACV,MAAO,CAAE,MAAO,eAAA,EAEf,SAAAqN,EAAK,KAAA,CAAA,QAEPtJ,GAAA,CAAA,CAAa,CAAA,CAAA,CAAA,EAEhB/D,MAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,WAAY,mBAAmB,CAAG,CAAA,CAAA,EAhBnDqN,EAAK,KAiBf,CACD,CAAA,CAAA,CACH,CAAA,EACF,CAEJ,CAEA,SAASD,GAAU,CAAE,KAAA/K,EAAO,IAAyB,CACnD,OACEQ,OAAC,OAAI,MAAOR,EAAM,OAAQA,EAAM,QAAQ,YAAY,KAAK,OACvD,SAAA,CAAArC,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,OAAO,0BAA0B,YAAY,MAAM,KAAK,OAAO,EAC9FA,EAAAA,IAAC,UAAA,CAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,0BAA0B,YAAY,MAAM,KAAK,OAAO,EACvGA,EAAAA,IAAC,OAAA,CAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,0BAA0B,YAAY,MAAM,QACvF,OAAA,CAAK,EAAE,mBAAmB,OAAO,0BAA0B,YAAY,KAAA,CAAM,CAAA,EAChF,CAEJ,CCnKO,SAASsN,GAAmB,CACjC,QAAA5E,EACA,SAAA6B,EACA,aAAApP,EAAe,GACf,aAAAsP,CACF,EAA4B,CAC1B,KAAM,CAACC,EAAQC,CAAS,EAAI/S,EAAAA,SAAS,EAAE,EAEjCqN,EAAW5I,EAAAA,QAAQ,IAAM,CAC7B,MAAMyO,EAAMJ,EAAO,KAAA,EAAO,YAAA,EAG1B,GAAI,CAACI,EAAK,CACR,GAAIL,EAAc,CAChB,MAAM8C,EAAiB9C,EAAa,YAAA,EAC9BvF,EAAWlL,GAAYuT,CAAc,EAC3C,GAAIrI,EAAU,CACZ,MAAM6F,EAAOhR,GAAU,OAAQE,GAAMA,EAAE,OAASsT,CAAc,EAC9D,MAAO,CAACrI,EAAU,GAAG6F,CAAI,CAC3B,CACF,CACA,OAAOhR,EACT,CAEA,OAAOA,GAAU,OACdE,GACCA,EAAE,KAAK,YAAA,EAAc,SAAS6Q,CAAG,GACjC7Q,EAAE,KAAK,SAAS6Q,CAAG,GACnB7Q,EAAE,YAAY,YAAA,EAAc,SAAS6Q,CAAG,CAAA,CAE9C,EAAG,CAACJ,EAAQD,CAAY,CAAC,EAEzB,OACE5H,EAAAA,KAAAsC,WAAA,CACE,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,6BACb,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CACjC,EACA1I,EAAAA,IAAC,KAAA,CACC,UAAU,gDACV,MAAO,CACL,MAAO,gBACP,SAAU,GACV,WAAY,IACZ,UAAW,EACX,aAAc,EAAA,EAEjB,SAAA,qBAAA,CAAA,EAGDA,EAAAA,IAACiK,GAAA,CAAY,MAAOS,EAAQ,SAAUC,EAAW,EACjD9H,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACZ,SAAA,CAAAoC,EAAS,IAAI,CAAC,EAAGqE,IAAQ,CACxB,MAAM2B,GAAaR,GAAA,YAAAA,EAAc,iBAAkB,EAAE,KACrD,cACG,MAAA,CACC,SAAA,CAAA5H,EAAAA,KAAC,SAAA,CACC,QAAS,IAAM0H,EAAS,EAAE,IAAI,EAC9B,UAAU,mEACV,MAAO,CAAE,MAAO,gBAAiB,IAAK,GAAI,QAAS,WAAY,OAAQ,QAAA,EAEvE,SAAA,CAAAvK,MAACwN,IAAY,KAAM,EAAE,KAAM,KAAM,GAAI,QAASrS,EAAc,EAC5D0H,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,SAAA,EAAE,KAAK,EACpDA,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAmB,MAAO,CAAE,MAAO,yBAAA,EAChD,SAAA,EAAE,WAAA,CACL,CAAA,EACF,EACCiL,GACCjL,EAAAA,IAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,UAAU,WACpE,SAAAA,EAAAA,IAAC,OAAA,CACC,EAAE,yBACF,OAAO,4BACP,YAAY,IACZ,cAAc,QACd,eAAe,OAAA,CAAA,CACjB,CACF,CAAA,CAAA,CAAA,EAGHsJ,EAAMrE,EAAS,OAAS,GACvBjF,EAAAA,IAAC,MAAA,CACC,MAAO,CAAE,OAAQ,EAAG,WAAY,0CAAA,CAA2C,CAAA,CAC7E,CAAA,EA5BM,EAAE,IA8BZ,CAEJ,CAAC,EACAiF,EAAS,SAAW,GACnBjF,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,oBAAA,CAExF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAGA,SAASwN,GAAY,CAAE,KAAAlM,EAAM,KAAAe,EAAO,GAAI,QAAA3B,EAAU,IAAyD,CACzG,KAAM,CAAC3I,EAAOC,CAAQ,EAAIJ,EAAAA,SAAS,EAAK,EAExC,OAAIG,EAEAiI,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAOqC,EACP,OAAQA,EACR,aAAc,MACd,WAAY,yBACZ,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,SAAUA,EAAO,GACjB,MAAO,qBAAA,EAGR,SAAAf,EAAK,YAAA,EAAc,MAAM,EAAG,CAAC,CAAA,CAAA,EAMlCtB,EAAAA,IAAC,MAAA,CACC,IAAK,GAAGU,CAAO,UAAUY,CAAI,OAC7B,IAAKA,EACL,MAAOe,EACP,OAAQA,EACR,MAAO,CAAE,MAAOA,EAAM,OAAQA,EAAM,aAAc,MAAO,UAAW,OAAA,EACpE,QAAS,IAAMrK,EAAS,EAAI,CAAA,CAAA,CAGlC,CCpBA,SAASyV,GAAU,CAClB,UAAAnL,EAAY,GACZ,MAAAoL,EAAQ,OACR,OAAQC,EAAa,OACrB,YAAaC,EACb,QAASC,EACT,QAASC,EACT,YAAaC,EACb,aAAcC,EACd,aAAcC,EACd,aAAcC,EACd,UAAWC,EACX,mBAAoBC,EACpB,eAAgBC,EAChB,aAAcC,EACd,eAAAC,EAAiB,GACjB,aAAAC,EAAe,GACf,gBAAAzB,EAAkB,GAClB,aAAAzH,EAAe,GACf,YAAAsB,EACA,eAAAE,EAAiB,OACjB,aAAAQ,EACA,iBAAAQ,EACA,YAAAC,EACA,OAAAlB,EACD,EAAmB,gCAClB,KAAM,CACL,MAAAjM,EACA,SAAA+B,EACA,OAAApF,EACA,cAAAuF,EACA,OAAA2B,EACA,cAAAC,EACA,YAAAC,GACA,YAAAC,GACA,YAAAxF,GACA,aAAAyF,EACA,YAAAT,GACA,WAAArC,EACA,UAAAK,EACA,aAAAjB,CAAA,EACG8E,GAAA,EAGE,CAAC0M,EAAU8B,EAAW,EAAI7W,EAAAA,SAAS8V,IAAU,MAAM,EACnD,CAACgB,GAAQC,EAAS,EAAI/W,EAAAA,SAAS+V,CAAU,EACzC,CAACiB,GAAOC,CAAQ,EAAIjX,EAAAA,SAAoB,IAAI,EAC5C,CAACkX,GAAeC,EAAgB,EAAInX,EAAAA,SAAS,EAAK,EAClD,CAACoX,GAAeC,EAAgB,EAAIrX,EAAAA,SAAS,EAAK,EAClD,CAACsX,EAAeC,EAAgB,EAAIvX,EAAAA,SAAS,EAAK,EAClD,CAACwX,GAAkBC,EAAmB,EAAIzX,EAAAA,SAAS,EAAK,EACxD,CAAC0X,GAAmBC,EAAoB,EAAI3X,EAAAA,SAAyB,IAAI,EACzE,CAACC,GAASC,EAAU,EAAIF,EAAAA,SAAS,EAAI,EACrC,CAAC4X,GAAWC,EAAY,EAAI7X,EAAAA,SAAS,EAAK,EAC1C,CAAC8X,GAAmBC,CAAoB,EAAI/X,EAAAA,SAAS,EAAK,EAE1DgY,EAAW1X,EAAAA,OAAyB,IAAI,EACxC2X,EAAwB3X,EAAAA,OAAA,EACxB4X,EAAa5X,EAAAA,OAAO0C,EAAM,QAAQ,EAGxCnC,EAAAA,UAAU,IAAM,CACfgW,GAAYf,IAAU,MAAM,CAC7B,EAAG,CAACA,CAAK,CAAC,EAGVjV,EAAAA,UAAU,IAAM,CACf,MAAMsQ,EAAI,WAAW,IAAMjR,GAAW,EAAK,EAAGgF,EAAgB,EAAI,GAAG,EACrE,MAAO,IAAM,aAAaiM,CAAC,CAC5B,EAAG,CAACjM,CAAa,CAAC,EAGlBrE,EAAAA,UAAU,IAAM,CACf,GAAIqX,EAAW,UAAYlV,EAAM,UAAY,CAAC/C,GAAS,CACtDiY,EAAW,QAAUlV,EAAM,SAC3B6U,GAAa,EAAI,EACjBV,GAAiB,EAAK,EACtBE,GAAiB,EAAK,EACtB,MAAMlG,EAAI,WAAW,IAAM0G,GAAa,EAAK,EAAG,GAAG,EACnD,MAAO,IAAM,aAAa1G,CAAC,CAC5B,CACA+G,EAAW,QAAUlV,EAAM,QAC5B,EAAG,CAACA,EAAM,SAAU/C,EAAO,CAAC,EAE5B,MAAMkY,EAAMnV,EAAM,SACZoV,EAAQD,IAAQ,MAGhBE,EAAarV,EAAM,gBAAkB,MACrCsV,EAAWtV,EAAM,cAAgB,MACjCuV,GAAcH,EAAQpV,EAAM,WAAaA,EAAM,aAC/CwV,EAAe5O,GAAY2O,EAAW,EAEtCE,IAAYlT,GAAAsB,GAAA,YAAAA,EAAQ,YAAR,MAAAtB,GAAmB,aAClC,WAAWsB,EAAO,UAAU,YAAY,EACxC,KAGG6R,GAAcpY,EAAAA,OAA8D,IAAI,EAClFmY,IAAaJ,GAAcC,IAC9BI,GAAY,QAAU,CAAE,KAAMD,GAAW,OAAQJ,EAAY,KAAMC,CAAA,GAGpE,MAAMK,GAAgBlU,EAAAA,QAAQ,IAAM,CACnC,GAAIoC,GAAA,MAAAA,EAAQ,UAAW,CACtB,MAAM+R,EAAMR,EAAQvR,EAAO,UAAU,aAAeA,EAAO,UAAU,WACrE,GAAI+R,EAAK,OAAOA,CACjB,CACA,MAAO,GACR,EAAG,CAAC/R,EAAQuR,CAAK,CAAC,EAKZS,GAAe,CAAC,EAAE3I,GAAoBC,GAAeiI,GAAS3O,GAAa4O,CAAU,GAAKI,IAC1FK,GAAYD,IAAgBR,EAAW,YAAA,EAAc,SAASC,EAAS,aAAa,EACpFS,GAAeF,IAAgBL,EAAe,EACjD1O,GAAagP,GAAYN,EAAeA,EAAeC,EAAS,EAChE,KACGO,GAAuBH,IAAgBE,GAAeA,GAAeJ,GAErEM,GAAcxU,EAAAA,QAAQ,IAAM,YACjC,MAAMyU,EAAIT,MAAalT,EAAAmT,GAAY,UAAZ,YAAAnT,EAAqB,MACtC4T,EAAKV,GAAYJ,GAAanS,EAAAwS,GAAY,UAAZ,YAAAxS,EAAqB,OACnDkT,EAAKX,GAAYH,GAAWlS,GAAAsS,GAAY,UAAZ,YAAAtS,GAAqB,KACvD,MAAI,CAAC8S,GAAK,CAACC,GAAM,CAACC,EAAW,GACtB,KAAKD,CAAE,MAAMD,EAAE,QAAQ,CAAC,CAAC,IAAIE,CAAE,EACvC,EAAG,CAACf,EAAYC,EAAUG,EAAS,CAAC,EAGpC5X,EAAAA,UAAU,IAAM,CACf,MAAMwY,EAAOrW,EAAM,cAAc,KAAA,EAC3BsW,EAAUtW,EAAM,QAGtB,GAAI,CAACqW,GAAQA,EAAK,OAAS,GAAI,CAC9B1B,GAAqB,IAAI,EACzB5S,EAAS,CAAE,KAAM,mBAAoB,QAAS,GAAI,EAClD,MACD,CAEA0S,GAAoB,EAAI,EACxBE,GAAqB,IAAI,EAEzB,MAAM4B,EAAkB,IAAI,gBAE5B,oBAAatB,EAAsB,OAAO,EAC1CA,EAAsB,QAAU,WAAW,SAAY,YACtD,GAAI,CAOH,MAAMnY,GAAO,MAND,MAAM,MAAM,GAAG0E,EAAU,MAAM,2BAA4B,CACtE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CAAE,QAAS6U,EAAM,GAAIC,EAAU,CAAE,QAAAA,GAAY,CAAA,EAAK,EACvE,OAAQC,EAAgB,MAAA,CACxB,GACsB,KAAA,EACjB5Y,KAAS4E,EAAAzF,GAAK,OAAL,YAAAyF,EAAW,aAAczF,GAAK,MAAQA,GACrD,GAAIa,GAAO,QACVgX,GAAqB,EAAI,EACzB5S,EAAS,CAAE,KAAM,mBAAoB,QAAS,GAAI,MAC5C,CACN4S,GAAqB,EAAK,EAC1B,MAAM6B,KAAMtT,EAAAvF,GAAO,SAAP,YAAAuF,EAAgB,OAAME,GAAAzF,GAAO,UAAP,YAAAyF,GAAgB,gBAAiB,yBACnErB,EAAS,CAAE,KAAM,mBAAoB,QAASyU,GAAK,CACpD,CACD,OAAS5Y,GAAK,CAEb,GAAIA,cAAe,cAAgBA,GAAI,OAAS,aAAc,OAC9D+W,GAAqB,IAAI,CAC1B,QAAA,CACM4B,EAAgB,OAAO,SAC3B9B,GAAoB,EAAK,CAE3B,CACD,EAAG,GAAG,EAEC,IAAM,CACZ,aAAaQ,EAAsB,OAAO,EAC1CsB,EAAgB,MAAA,CACjB,CACD,EAAG,CAACvW,EAAM,cAAeA,EAAM,QAASwB,EAAU,MAAM,CAAC,EAGzD,MAAMiV,GAAgB,CAAClB,IAAeC,IAAiB,EACjDkB,GAAiBlB,EAAe,IAAMJ,EAAQI,EAAetO,GAAkBsO,EAAerO,IAC9FwP,GAAiB,CAAC,CAACnT,IAAekT,IAAmBxC,IAAiBuC,GACtEG,GAAgBpB,EAAe,GAAK,CAAChS,IAAe,CAACkT,GACrDG,GAAgB7W,EAAM,cAAc,KAAA,EAAO,QAAU,IAAM0U,KAAsB,IAAS,CAACF,GAC3FsC,GAAcF,IAAiBC,IAAiB,CAAC,CAAC7W,EAAM,gBAAkB,CAAC,CAACA,EAAM,QAElF+W,GAAsBvM,GAA2C,CACtE,IAAI0F,EAAM1F,EAAE,OAAO,MAAM,QAAQ,YAAa,EAAE,EAEhD,MAAM5K,EAAcwV,EAAQ,EAAI,EAC1BvV,EAAWqQ,EAAI,QAAQ,GAAG,EAC5BrQ,IAAa,IAAMqQ,EAAI,OAASrQ,EAAW,EAAID,IAClDsQ,EAAMA,EAAI,MAAM,EAAGrQ,EAAWD,EAAc,CAAC,GAG7CmC,EADGqT,EACM,CAAE,KAAM,kBAAmB,OAAQlF,GAEnC,CAAE,KAAM,oBAAqB,OAAQA,EAFG,CAInD,EAEM8G,GAAmBC,GAA2B,CAC/CA,IAAW9B,GACfpT,EAAS,CAAE,KAAM,gBAAiB,SAAUkV,EAAQ,CACrD,EAEMC,GAAmBzZ,EAAAA,YACvBiJ,GAAiB,CACjB3E,EAAS,CAAE,KAAM,oBAAqB,SAAU2E,EAAM,CACvD,EACA,CAAC3E,CAAQ,CAAA,EAGJoV,GAAqB1Z,EAAAA,YAC1B,CAACiJ,EAAcN,IAAkB,CAChCrE,EAAS,CAAE,KAAM,sBAAuB,SAAU2E,EAAM,EACxD3E,EAAS,CAAE,KAAM,mBAAoB,MAAAqE,CAAA,CAAO,CAC7C,EACA,CAACrE,CAAQ,CAAA,EAGJqV,GAA4B3Z,EAAAA,YAChCqM,GAAqB,CACrB/H,EAAS,CAAE,KAAM,qBAAsB,SAAA+H,CAAA,CAAU,CAClD,EACA,CAAC/H,CAAQ,CAAA,EAGJsV,GAAsB5Z,EAAAA,YAC1BiJ,GAAiB,CACjB3E,EAAS,CAAE,KAAM,cAAe,QAAS2E,EAAM,EAC/CuN,EAAS,IAAI,CACd,EACA,CAAClS,CAAQ,CAAA,EAGJuV,GAAsB7Z,EAAAA,YAAY,IAAM,CAE7CwW,EAAS,IAAI,EACb,WAAW,IAAMA,EAAS,SAAS,EAAG,GAAG,CAC1C,EAAG,CAAA,CAAE,EAEC7B,GAAcpS,EAAM,SAAUkD,GAAA9D,GAAYY,EAAM,QAAQ,YAAA,CAAa,IAAvC,YAAAkD,GAA0C,KAAO,OAE/EqU,GAAiB,IAAM,CACvBT,KACL/B,EAAqB,EAAI,EACzB/Q,GAAA,EACD,EAGAnG,EAAAA,UAAU,IAAM,OACf,GAAI,GAACiX,IAAqBhR,IAE1B,GAAID,GAAA,MAAAA,EAAQ,UACXkR,EAAqB,EAAK,EAC1BhT,EAAS,CAAE,KAAM,eAAgB,MAAO8B,EAAO,UAAW,EAC1DrF,GAAA,EAAc,MAAM,IAAM,CAE1B,CAAC,UACSuF,GACVgR,EAAqB,EAAK,EAC1BhT,EAAS,CAAE,KAAM,YAAa,QAASgC,GAAY,SAAW,sBAAuB,UAC3EF,GAAU,CAACA,EAAO,UAAW,CAEvCkR,EAAqB,EAAK,EAC1B,MAAMyC,GAAWjV,EAAAsB,EAAe,sBAAf,YAAAtB,EACd,IAAK8K,GAAWA,EAAE,QACnB,OAAO,SACHxI,EAAU2S,GAAA,MAAAA,EAAS,OACtB,2BAA2BA,EAAQ,KAAK,IAAI,CAAC,GAC7C,+DACHzV,EAAS,CAAE,KAAM,YAAa,QAAA8C,CAAA,CAAS,CACxC,EACD,EAAG,CAACiQ,GAAmBjR,EAAQC,EAAeC,GAAahC,EAAUvD,EAAW,CAAC,EAGjF,MAAMiZ,GAAa1F,EAAW,aAAe,cACvC2F,GAAapR,GAAM,KAAMU,GAAYA,EAAE,KAAO8M,EAAM,GAAKxN,GAAM,CAAC,EAChEqR,GAASD,GAAW,SAAW,KAE/BE,GAAkB5E,EAAkB/L,GAAW+L,CAAe,EAAI,GAGlE6E,GAAmBC,GAAwB,CAChD,MAAMzY,EAAIyY,EAAI,QAAQ,IAAK,EAAE,EACvB5B,EAAI,SAAS7W,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAClCgO,EAAI,SAAShO,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAClCiS,EAAI,SAASjS,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EAExC,OADmB,KAAQ6W,EAAI,KAAQ7I,EAAI,KAAQiE,GAAK,IACrC,GAAM,UAAY,SACtC,EAEMyG,GAAsCH,GACzC,CAAE,aAAc5E,EAAkB,aAAcA,EAAkB,eAAgB6E,GAAgB7E,CAAgB,CAAA,EAClH2E,GACC,CACA,aAAc5F,EAAW,UAAY,UACrC,aAAcA,EAAW,UAAY,UACrC,eAAgBA,EAAW,UAAY,SAAA,EAEvC,CACA,aAAc2F,GAAW,OACzB,aAAcA,GAAW,OACzB,eAAgBG,GAAgBH,GAAW,MAAO,CAAA,EAIhDM,EAAyC,CAAA,EAC3C3E,GAAoBpM,GAAWoM,CAAgB,IAClD2E,EAAe,aAAa,EAAI3E,EAChC2E,EAAe,cAAc,EAAI3E,GAE9BC,GAAoBrM,GAAWqM,CAAgB,IAClD0E,EAAe,aAAa,EAAI1E,EAChC0E,EAAe,cAAc,EAAI1E,GAE9BC,GAAiBtM,GAAWsM,CAAa,IAC5CyE,EAAe,UAAU,EAAIzE,GAE1BC,GAA0BvM,GAAWuM,CAAsB,IAC9DwE,EAAe,oBAAoB,EAAIxE,GAEpCC,GAAsBxM,GAAWwM,CAAkB,IACtDuE,EAAe,gBAAgB,EAAIvE,EACnCuE,EAAe,mBAAmB,EAAIvE,GAEnCC,GAAoBzM,GAAWyM,CAAgB,IAClDsE,EAAe,aAAa,EAAItE,GAGjC,MAAMuE,GAA0C,CAAA,EAC5ChF,GAAehM,GAAWgM,CAAW,EACxCgF,GAAgB,gBAAkBhF,EAElCgF,GAAgB,gBAAkB,cAE/B/E,IAAgBA,EAAY,WAAW,UAAU,GAAKA,EAAY,WAAW,aAAa,KAC7F+E,GAAgB,gBAAkB,OAAO/E,CAAW,IACpD+E,GAAgB,eAAiB,QACjCA,GAAgB,mBAAqB,UAItC,MAAMC,GAAgBnG,EAAW,UAAY,UAEvCoG,GAAsC,CAAA,EACxChF,GAAmBlM,GAAWkM,CAAe,IAChDgF,GAAY,OAAS,aAAahF,CAAe,IAE9CC,IACH+E,GAAY,aAAe/E,GAI5B,MAAMgF,GACLpY,EAAM,OAAS,WAAaoF,EAAAA,IAACqF,IAAa,aAAAC,CAAA,CAA4B,EACtE1K,EAAM,OAAS,aAAeoF,EAAAA,IAACsG,GAAA,EAAe,EAC9C1L,EAAM,OAAS,WAAaoF,EAAAA,IAAC2G,GAAA,CAAa,YAAAC,EAA0B,eAAAE,EAAgC,OAAAD,GAAgB,EACpHjM,EAAM,OAAS,cAAWwM,GAAA,CAAU,aAAAE,CAAA,CAA4B,EAChE1M,EAAM,OAAS,UAAYoF,EAAAA,IAAC6H,IAAY,iBAAkB4I,GAAc,YAAA1I,EAA0B,EAClG,KAED,GAAIiL,GACH,OACChT,EAAAA,IAAC,MAAA,CACA,UAAW,GAAGqS,EAAU,qHAAqH/P,CAAS,GACtJ,MAAO,CACN,WAAY,6EACZ,GAAGuQ,GACH,GAAGF,GACH,GAAGC,EACH,GAAGG,EAAA,EAGH,SAAAC,EAAA,CAAA,EAKJ,MAAMlS,GAAYlG,EAAM,QAClBqY,GAAYnS,GAAYD,GAAaC,EAAS,EAAI,KAClDoS,IAAeD,IAAA,YAAAA,GAAW,aAAaA,IAAA,YAAAA,GAAW,OAAQnS,GAEhE,OACC+B,EAAAA,KAAC,MAAA,CACA,UAAW,GAAGwP,EAAU,yHAAyH/P,CAAS,GAC1J,MAAO,CACN,WAAY,6EACZ,GAAGuQ,GACH,GAAGF,GACH,GAAGC,EACH,GAAGG,EAAA,EAIH,SAAA,CAAAvE,GACAxO,EAAAA,IAAC,MAAA,CAAI,UAAW,2CAA2CuO,EAAiB,OAAS,MAAM,GAC1F,SAAAvO,EAAAA,IAACgE,IAAS,QAAS,IAAM6K,EAAS,UAAU,EAAG,EAChD,EAIAN,EACA1L,EAAAA,KAAC,MAAA,CAAI,UAAU,uCACd,SAAA,CAAAA,OAAC,OAAI,UAAU,OAAO,MAAO,CAAE,MAAO,KACrC,SAAA,CAAA7C,EAAAA,IAAC,SAAA,CACA,QAAS,IAAM4R,GAAgB,KAAK,EACpC,UAAU,mFACV,MAAO,CAAE,MAAO7B,IAAQ,MAAQ,gBAAkB,yBAAA,EAClD,SAAA,KAAA,CAAA,EAGD/P,EAAAA,IAAC,SAAA,CACA,QAAS,IAAM4R,GAAgB,MAAM,EACrC,UAAU,mFACV,MAAO,CAAE,MAAO7B,IAAQ,OAAS,gBAAkB,yBAAA,EACnD,SAAA,MAAA,CAAA,CAED,EACD,EACAlN,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,MAAO,CAAE,MAAO,IAAK,OAAQ,CAAA,EACtD,SAAA,CAAA7C,MAAC,OAAI,UAAU,mBAAmB,MAAO,CAAE,WAAY,oBAAsB,EAC7EA,EAAAA,IAAC,MAAA,CACA,UAAU,gEACV,MAAO,CACN,MAAO,MACP,KAAM+P,IAAQ,MAAQ,KAAO,MAC7B,WAAY,iBAAA,CACb,CAAA,CACD,CAAA,CACD,CAAA,CAAA,CACD,EACG,KAEHlY,IAAW2X,IAAa1S,EACxBkD,EAAAA,IAAC+J,KAAa,EAEdlH,EAAAA,KAAC,MAAA,CAAc,UAAU,wDAExB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACA,UAAU,gCACV,MAAO,CACN,WAAY,mBACZ,aAAc,EACd,OACCiM,IAAiByC,GAAiB,oBAAsB,wBACzD,UAAW,GAAA,EAGZ,SAAA,CAAAvR,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,WAAA,CAEjF,EACA6C,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAA7C,EAAAA,IAAC,QAAA,CACA,IAAK4P,EACL,KAAK,OACL,MAAOO,GACP,SAAUwB,GACV,OAAQ,IAAM5C,GAAiB,EAAI,EACnC,YAAaiB,EAAQ,MAAQ,OAC7B,UAAU,8CACV,MAAO,CAAE,MAAO,gBAAiB,SAAU,GAAI,WAAY,IAAK,WAAY,OAAQ,QAAS,EAAG,OAAQ,OAAQ,aAAc,EAAG,gBAAiB,cAAe,OAAQ,OAAQ,MAAO,CAAA,EACxL,UAAU,UACV,SAAU,CAAC,GAAChS,GAAAjC,GAAA,YAAAA,EAAY,eAAZ,MAAAiC,GAA0B,OAAA,CAAA,EAEtCgS,EACAnN,EAAAA,KAAC,SAAA,CACA,QAAS,IAAMgM,EAAS,MAAM,EAC9B,UAAU,uDACV,MAAO,CACN,WAAY,mBACZ,aAAc,EACd,OAAQ,GACR,YAAa,GACb,aAAc,EAAA,EAEf,SAAU,CAAC,GAACsE,GAAApX,GAAA,YAAAA,EAAY,iBAAZ,MAAAoX,GAA4B,QAExC,SAAA,CAAAnT,MAAC+C,IAAS,aAAcmN,EAAU,KAAM,GAAI,QAAS/U,EAAc,EACnE6E,EAAAA,IAAC,QAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO8S,EAAA,EACxD,SAAA5C,CAAA,CACF,QACCpM,GAAA,CAAA,CAAY,CAAA,CAAA,CAAA,EAGdjB,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACd,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACA,QAAS,IAAMgM,EAAS,QAAQ,EAChC,UAAU,8CACV,MAAO,CACN,WAAY,mBACZ,aAAc,EACd,OAAQ,GACR,YAAa,GACb,aAAc,EAAA,EAEf,SAAU,CAAC,GAACuE,GAAArX,GAAA,YAAAA,EAAY,sBAAZ,MAAAqX,GAAiC,QAE7C,SAAA,CAAApT,MAAC8C,IAAW,OAAQmN,EAAY,KAAM,GAAI,QAAS9U,EAAc,EACjE6E,EAAAA,IAAC,QAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO8S,EAAA,EACxD,SAAA7C,CAAA,CACF,QACCnM,GAAA,CAAA,CAAY,CAAA,CAAA,CAAA,EAEbhD,IACA+B,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAe,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,WAAY,SAAA,EACzE,SAAAA,EAAAA,IAAC,MAAA,CACA,IAAKe,GAAgBD,GAAW3F,CAAY,EAC5C,IAAK2F,GACL,MAAO,GACP,OAAQ,GACR,UAAU,eACV,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,CAAG,CAAA,EAEjC,EACAd,EAAAA,IAAC,QAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAC5C,SAAAkT,EAAA,CACF,CAAA,CAAA,CACD,CAAA,CAAA,CAEF,CAAA,CAAA,CAEF,CAAA,CAAA,CAAA,EAEApE,IAAiByC,IACjBvR,EAAAA,IAAC,MAAA,CAAI,UAAU,8BAA8B,MAAO,CAAE,MAAO,SAAA,EAC3D,SAAA5B,KACIiT,GACD,+BACArB,EACC,qBAAqBlO,EAAe,IAAIoO,CAAQ,GAChD,qBAAqBnO,EAAiB,IAAIkO,CAAU,GAAA,CAC1D,EAIDpN,EAAAA,KAAC,MAAA,CACA,UAAU,gCACV,MAAO,CACN,WAAY,mBACZ,oBAAqB,EACrB,qBAAsB,EACtB,uBAAwB,EACxB,wBAAyB,EACzB,UAAW,EACX,UAAW,GAAA,EAGZ,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,SAAA,CAEjF,EACA6C,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAnE,GAAiB,CAACgR,GAClB1P,EAAAA,IAAC4J,EAAA,CAAS,EAAG,IAAK,EAAG,GAAI,EAEzB5J,EAAAA,IAACwJ,GAAA,CACA,MAAO4G,EAAe,EAAIQ,GAAuB,IACjD,OAAQ,GACR,UAAU,gBACV,MAAO,CAAE,MAAOR,EAAe,EAAI,gBAAkB,sBAAuB,SAAU,EAAA,CAAG,CAAA,EAG1FJ,EACAnN,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACd,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACA,QAAS,IAAMgM,EAAS,QAAQ,EAChC,UAAU,8CACV,MAAO,CACN,WAAY,mBACZ,aAAc,EACd,OAAQ,GACR,YAAa,GACb,aAAc,EAAA,EAEf,SAAU,CAAC,GAACwE,GAAAtX,GAAA,YAAAA,EAAY,sBAAZ,MAAAsX,GAAiC,QAE7C,SAAA,CAAArT,MAAC8C,IAAW,OAAQmN,EAAY,KAAM,GAAI,QAAS9U,EAAc,EACjE6E,EAAAA,IAAC,QAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO8S,EAAA,EACxD,SAAA7C,CAAA,CACF,QACCnM,GAAA,CAAA,CAAY,CAAA,CAAA,CAAA,EAEbhD,IACA+B,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAe,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,WAAY,SAAA,EACzE,SAAAA,EAAAA,IAAC,MAAA,CACA,IAAKe,GAAgBD,GAAW3F,CAAY,EAC5C,IAAK2F,GACL,MAAO,GACP,OAAQ,GACR,UAAU,eACV,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,CAAG,CAAA,EAEjC,EACAd,EAAAA,IAAC,QAAK,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAC5C,SAAAkT,EAAA,CACF,CAAA,CAAA,CACD,CAAA,CAAA,CAEF,EAEArQ,EAAAA,KAAC,SAAA,CACA,QAAS,IAAMgM,EAAS,MAAM,EAC9B,UAAU,uDACV,MAAO,CACN,WAAY,mBACZ,aAAc,EACd,OAAQ,GACR,YAAa,GACb,aAAc,EAAA,EAEf,SAAU,CAAC,GAACyE,GAAAvX,GAAA,YAAAA,EAAY,iBAAZ,MAAAuX,GAA4B,QAExC,SAAA,CAAAtT,MAAC+C,IAAS,aAAcmN,EAAU,KAAM,GAAI,QAAS/U,EAAc,EACnE6E,EAAAA,IAAC,QAAK,UAAU,0BAA0B,MAAO,CAAE,MAAO8S,EAAA,EACxD,SAAA5C,CAAA,CACF,QACCpM,GAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CACd,CAAA,CAEF,CAAA,CAAA,CAAA,EAIA2M,IAAgBL,EAAe,IAAK3R,GAAA,YAAAA,EAAQ,YAC5CoE,EAAAA,KAAC,MAAA,CACA,UAAU,sDACV,MAAO,CAAE,WAAY,mBAAoB,SAAU,GAAI,MAAO,0BAA2B,WAAY,MAAA,EAErG,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OAAO,MAAO,CAAE,WAAY,EAAG,UAAW,GAC9F,SAAA,CAAA7C,EAAAA,IAAC,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,OAAO,eAAe,YAAY,KAAA,CAAM,EACpEA,EAAAA,IAAC,QAAK,EAAE,oBAAoB,OAAO,eAAe,YAAY,MAAM,cAAc,OAAA,CAAQ,CAAA,EAC3F,SACC,OAAA,CAAK,SAAA,CAAA,2BACoBuQ,GAAc,IAAEN,EAAW,oBAAkBvO,GAAa0O,CAAY,EAAE,IAAEF,EAAS,6BAA2BnI,EAAY,UAAA,CAAA,CACpJ,CAAA,CAAA,CAAA,EAKF/H,EAAAA,IAAC,MAAA,CACA,UAAU,2EACV,MAAO,CACN,WAAY,mBACZ,IAAKuT,GAAAhc,GAAA,YAAAA,EAAQ,iBAAR,MAAAgc,GAAwB,OAAqE,CAAA,EAA5D,CAAE,uBAAwB,EAAG,wBAAyB,EAAO,EAGpG,SAAAvT,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAOsO,EAAmB,mBAAqB,yBAAA,EACpF,SAAAuC,IAAe,GAAA,CACjB,CAAA,CAAA,GAIAtZ,GAAA,YAAAA,EAAQ,iBAAkBA,EAAO,eAAe,OAAS,GACzDyI,EAAAA,IAAC,MAAA,CAAI,UAAU,WACd,SAAAA,EAAAA,IAAC6E,GAAA,CACA,QAAStN,EAAO,eAChB,WAAYqD,EAAM,gBAClB,YAAa,IAAMiU,EAAS,SAAS,EACrC,aAAcjU,EAAM,YAAA,CAAA,EAEtB,EAIDiI,EAAAA,KAAC,MAAA,CAAI,UAAU,OACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,yBAAA,EAClD,SAAAgQ,EAAQ,2BAA6B,wBAAA,CACvC,EACAhQ,EAAAA,IAAC,QAAA,CACA,KAAK,OACL,MAAOpF,EAAM,cACb,SAAWwK,GAAMzI,EAAS,CAAE,KAAM,qBAAsB,QAASyI,EAAE,OAAO,MAAO,EACjF,QAAS,IAAM+J,GAAiB,EAAI,EACpC,OAAQ,IAAM,CAAEA,GAAiB,EAAK,EAAGF,GAAiB,EAAI,CAAG,EACjE,YAAae,EAAQ,+BAAiC,6BACtD,WAAY,GACZ,aAAa,MACb,UAAU,mEACV,MAAO,CACN,OACCpV,EAAM,aAAgBoU,IAAiB,CAACyC,GACrC,oBACAvC,EACC,kCACA,4BACL,QAAS,OACT,UAAW,OACX,aAAc,IACd,OAAQ,GACR,QAAS,SACT,MAAO,gBACP,SAAU,GACV,gBAAiB,aAAA,EAElB,SAAU,CAAC,GAACsE,GAAAzX,GAAA,YAAAA,EAAY,qBAAZ,MAAAyX,GAAgC,OAAA,CAAA,EAE5C5Y,EAAM,YACNoF,MAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,WAClD,SAAApF,EAAM,WAAA,CACR,EACGoU,IAAiB,CAACyC,IAAiB,CAACrC,GACvCpP,MAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,WAAa,SAAA,8BAAA,CAEjE,EACGoP,IAAoBxU,EAAM,cAAc,KAAA,EAAO,QAAU,GAC5DoF,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,MAAO,CAAE,MAAO,qBAAA,EAAyB,SAAA,uBAAA,CAE7E,EACG,IAAA,EACL,EAEAA,MAAC,OAAI,UAAU,SAAS,MAAO,CAAE,UAAW,IAAM,EAGlDA,EAAAA,IAAC,SAAA,CACA,SAAU,CAAC0R,IAAe7S,GAAgB6Q,GAC1C,QAASyC,GACT,UAAU,kDACV,MAAO,CACN,OAAQ,GACR,aAAc,EACd,WAAY,kBACZ,MAAO,oBACP,QAAST,IAAe,CAAC7S,GAAgB,CAAC6Q,GAAoB,EAAI,GAClE,OACCgC,IAAe,CAAC7S,GAAgB,CAAC6Q,GAAoB,UAAY,aAAA,EAGlE,SAAAA,GACE,wBACA7Q,EACC,gBACAmR,EACC,OAAOC,CAAU,GACjB,QAAQA,CAAU,EAAA,CAAA,EAIxBjQ,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACd,eAAC,OAAA,CAAK,UAAU,cAAc,MAAO,CAAE,MAAO,wBAAA,EAA4B,8BAE1E,CAAA,CACD,CAAA,CAAA,EAnTS+P,CAoTV,EAID/P,EAAAA,IAACwI,GAAA,CAAM,OAAQoG,KAAU,OAAQ,QAAS,IAAMC,EAAS,IAAI,EAC3D,SAAC4E,GAAA,OACDzT,OAAAA,EAAAA,IAACsK,GAAA,CACA,QAASmJ,EACT,SAAWC,GAAM,CAChB5B,GAAiB4B,CAAC,EAClBD,EAAA,CACD,EACA,YAAYtW,EAAA5F,GAAA,YAAAA,EAAQ,QAAR,YAAA4F,EAAe,IAAKC,IAAO,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,QAC/D,aAAAjC,EACA,aAAcP,EAAM,YAAA,CAAA,GAGvB,EACAoF,EAAAA,IAACwI,GAAA,CAAM,OAAQoG,KAAU,SAAU,QAAS,IAAMC,EAAS,IAAI,EAC7D,SAAC4E,GAAA,OACDzT,OAAAA,EAAAA,IAACmL,GAAA,CACA,QAASsI,EACT,SAAU,CAACnS,EAAMN,IAAU,CAC1B+Q,GAAmBzQ,EAAMN,CAAK,EAC9ByS,EAAA,CACD,EACA,SAAStW,EAAA5F,GAAA,YAAAA,EAAQ,UAAR,YAAA4F,EAAiB,IAAKlD,GAAA,OAAO,OACrC,KAAMA,EAAE,KACR,KAAMA,EAAE,KACR,UAAUkD,EAAAlD,EAAE,WAAF,YAAAkD,EAAY,IAAKY,IAAO,CAAE,KAAMA,EAAE,GAAI,KAAMA,EAAE,OAAO,IAEhE,aAAA5C,EACA,aAAcP,EAAM,eACpB,cAAeA,EAAM,OAAA,CAAA,GAGxB,EACAoF,EAAAA,IAACwI,GAAA,CAAM,OAAQoG,KAAU,UAAW,QAAS,IAAMC,EAAS,IAAI,EAC9D,SAAC4E,GAAA,OACDzT,OAAAA,EAAAA,IAACoM,GAAA,CACA,UAASjP,EAAA5F,GAAA,YAAAA,EAAQ,iBAAR,YAAA4F,EAAwB,OAAQe,GAAMA,EAAE,eAAe,SAAStD,EAAM,YAAY,KAAM,CAAA,EACjG,WAAYA,EAAM,gBAClB,SAAW7B,GAAO,CACjBiZ,GAA0BjZ,CAAE,EAC5B0a,EAAA,CACD,EACA,QAASA,CAAA,CAAA,GAGZ,EACAzT,EAAAA,IAACwI,GAAA,CAAM,OAAQoG,KAAU,WAAY,QAAS,IAAMC,EAAS,IAAI,EAC/D,SAAC4E,GACDzT,EAAAA,IAAC0M,GAAA,CACA,QAAS+G,EACT,SAAA9G,EACA,iBAAkB8B,GAClB,OAAAC,GACA,aAAe3V,GAAO,CACrB4V,GAAU5V,CAAE,CACb,EACA,gBAAAgU,EACA,QAASnS,EAAM,QACf,YAAAoS,GACA,gBAAiBkF,GACjB,aAAA/W,CAAA,CAAA,EAGH,EACA6E,EAAAA,IAACwI,GAAA,CAAM,OAAQoG,KAAU,UAAW,QAAS,IAAMC,EAAS,IAAI,EAC9D,SAAC4E,GACDzT,EAAAA,IAACsN,GAAA,CACA,QAASmG,EACT,SAAWnS,GAAS,CACnB2Q,GAAoB3Q,CAAI,EACxBmS,EAAA,CACD,EACA,aAAAtY,EACA,aAAcP,EAAM,OAAA,CAAA,CACrB,CAEF,CAAA,CAAA,CAAA,CAGH,CAMO,SAAS+Y,GAAS,CACxB,UAAA1Y,EACA,OAAAC,EACA,aAAAC,EACA,SAAAC,EACA,WAAAC,EACA,QAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,eAAAc,EACA,kBAAAZ,EACA,oBAAAC,EACA,qBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAoG,EACA,MAAAoL,EACA,OAAAgB,EACA,YAAAlC,EACA,QAAAoH,EACA,QAAAC,GACA,YAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,mBAAAC,EACA,eAAAC,GACA,aAAAC,GACA,eAAA9F,GACA,aAAAC,EACA,gBAAAzB,GACA,aAAAzH,EACA,YAAAsB,EACA,eAAAE,EACA,aAAAQ,EACA,iBAAAQ,GACA,YAAAC,GACA,OAAAlB,EACD,EAAkB,CACjB,OACC7G,EAAAA,IAAChF,GAAA,CACA,UAAAC,EACA,OAAAC,EACA,aAAAC,EACA,SAAAC,EACA,WAAAC,EACA,QAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,eAAAc,EACA,kBAAAZ,EACA,oBAAAC,EACA,qBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,WAAAC,EACA,QAAAC,EAEA,SAAA8D,EAAAA,IAACyN,GAAA,CACA,UAAAnL,EACA,MAAAoL,EACA,OAAAgB,EACA,YAAAlC,EACA,QAAAoH,EACA,QAAAC,GACA,YAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,mBAAAC,EACA,eAAAC,GACA,aAAAC,GACA,eAAA9F,GACA,aAAAC,EACA,gBAAAzB,GACA,aAAAzH,EACA,YAAAsB,EACA,eAAAE,EACA,aAAAQ,EACA,iBAAAQ,GACA,YAAAC,GACA,OAAAlB,EAAA,CAAA,CACD,CAAA,CAGH,CCnhCO,SAASyN,GAAa,CAC3B,iBAAkBC,EAClB,oBAAqBC,EACrB,GAAGC,CACL,EAAsB,CACpB,OAAOzU,MAAC2T,GAAA,CAAU,GAAGc,CAAA,CAAO,CAC9B,CCpBO,SAASC,GAAW,CACzB,KAAAC,EACA,OAAAC,EACA,QAAA3Q,EACA,SAAA0I,EACA,OAAAkI,CACF,EAMG,CACD,MAAMtC,EAASoC,EAAK,SAAW,KACzBtS,EAAO,GACb,OACEQ,EAAAA,KAAC,SAAA,CACC,QAAAoB,EACA,UAAU,oBACV,MAAO,CAAE,MAAO5B,EAAM,OAAQA,EAAM,QAASwS,EAAS,GAAM,EAAG,WAAY,cAAA,EAE1E,SAAA,CAAAtC,SACE,MAAA,CAAI,MAAOlQ,EAAM,OAAQA,EAAM,QAAQ,YACtC,SAAA,CAAArC,EAAAA,IAAC,WAAA,CAAS,GAAG,YAAY,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,EAAE,EACpEA,EAAAA,IAAC,WAAA,CAAS,GAAG,aAAa,eAAC,OAAA,CAAK,EAAE,KAAK,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,EAAE,EACtEA,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,UAAU,SAAS,iBAAA,CAAkB,EACzEA,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,UAAU,SAAS,kBAAA,CAAmB,EAC1EA,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,OAAQ2M,EAAW,yBAA2B,kBAAmB,YAAY,GAAA,CAAI,CAAA,CAAA,CAC9H,QAEC,MAAA,CAAI,MAAOtK,EAAM,OAAQA,EAAM,QAAQ,YACtC,SAAArC,EAAAA,IAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAM2U,EAAK,OAAS,CAAA,CACrD,EAEDC,GAAU,CAACC,GACV7U,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CAAE,UAAW,gDAAA,CAAiD,CAAA,CACvE,CAAA,CAAA,CAIR,CCvBA,SAAS8U,GAAS,CAAE,MAAAC,GAA2B,CAC9C,OAAIA,EAAM,WAER/U,MAAC,OAAI,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,YAAA,CAE1E,EAGE+U,EAAM,cAER/U,MAAC,OAAI,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,aAAA,CAE1E,EAGE+U,EAAM,MAAQA,EAAM,MAAQ,EAE9BlS,EAAAA,KAAC,OAAI,UAAU,cAAc,MAAO,CAAE,MAAO,2BAA6B,SAAA,CAAA,IACvEkS,EAAM,IAAA,EACT,EAGK,IACR,CAEA,SAASC,GAAa,CAAE,MAAAD,GAA2B,CAClD,OAAIA,EAAM,YAER/U,EAAAA,IAAC,MAAA,CACA,IAAK+U,EAAM,YACX,IAAKA,EAAM,YACX,MAAO,GACP,OAAQ,GACR,UAAU,wBACV,MAAO,CAAE,MAAO,GAAI,OAAQ,EAAA,CAAG,CAAA,EAI3B/U,EAAAA,IAACgD,GAAA,CAAgB,KAAM,EAAA,CAAI,CACnC,CAEA,SAASiS,IAAmB,CAC3B,OACCjV,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAC,EAAG,EAAG,CAAC,EAAE,IAAK2J,GACf9G,EAAAA,KAAC,MAAA,CAEA,UAAU,mCACV,MAAO,CACN,aAAc,EACd,OAAQ,GACR,YAAa,GACb,aAAc,GACd,WAAY,kBAAA,EAGb,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,wBAAwB,EAC1D/G,EAAAA,KAAC,MAAA,CAAI,UAAU,SACd,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,SAAS,EAC3C5J,EAAAA,IAAC4J,EAAA,CAAS,EAAG,GAAI,EAAG,EAAA,CAAI,CAAA,EACzB,EACA/G,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAA7C,MAAC4J,GAAS,EAAG,GAAI,EAAG,GAAI,UAAU,SAAS,EAC3C5J,EAAAA,IAAC4J,EAAA,CAAS,EAAG,GAAI,EAAG,EAAA,CAAI,CAAA,CAAA,CACzB,CAAA,CAAA,EAlBKD,CAAA,CAoBN,EACF,CAEF,CAEO,SAASuL,GAAgB,CAC/B,QAAAxM,EACA,SAAA6B,EACA,OAAA9L,EACA,cAAAC,EACA,eAAAyW,CACD,EAAyB,CACxB,KAAM,CAACzK,EAAQC,CAAS,EAAI/S,EAAAA,SAAS,EAAE,EAEjCwd,EAAiB/Y,EAAAA,QAAQ,IAAM,CACpC,GAAI,EAACoC,GAAA,MAAAA,EAAQ,QAAQ,MAAO,CAAA,EAC5B,MAAMqM,EAAMJ,EAAO,KAAA,EAAO,YAAA,EAC1B,OAAKI,EACErM,EAAO,OAAO,OAAQ4W,GAAMA,EAAE,YAAY,YAAA,EAAc,SAASvK,CAAG,CAAC,EAD3DrM,EAAO,MAEzB,EAAG,CAACA,EAAQiM,CAAM,CAAC,EAEnB,OACC7H,EAAAA,KAAAsC,WAAA,CACC,SAAA,CAAAnF,EAAAA,IAAC,OAAI,UAAU,6BACd,eAACgK,GAAA,CAAY,QAAStB,EAAS,CAAA,CAChC,EACA1I,EAAAA,IAAC,KAAA,CACA,UAAU,gDACV,MAAO,CAAE,MAAO,gBAAiB,SAAU,GAAI,WAAY,IAAK,UAAW,EAAG,aAAc,EAAA,EAC5F,SAAA,aAAA,CAAA,EAGDA,EAAAA,IAACiK,GAAA,CAAY,MAAOS,EAAQ,SAAUC,EAAW,EACjD9H,EAAAA,KAAC,MAAA,CAAI,UAAU,sDACb,SAAA,CAAAnE,EACAsB,EAAAA,IAACiV,GAAA,CAAA,CAAiB,EACfG,EAAe,SAAW,EAC7BpV,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,MAAO,CAAE,MAAO,qBAAA,EAC7D,SAAAvB,GAAUA,EAAO,OAAO,SAAW,EACjC,uCACA,oBAAA,CACJ,EAEA2W,EAAe,IAAI,CAACL,EAAOpL,IAAM,CAChC,MAAM2L,EAAS3L,IAAM,EACf4G,EAAgB,WAAWwE,EAAM,YAAY,EAC7CQ,EACLhF,GAAiB,EAAIA,EAAc,QAAQ,CAAC,EAAIA,EAAc,YAAY,CAAC,EAE5E,OACC1N,EAAAA,KAAC,SAAA,CAEA,QAAS,IAAM0H,EAASwK,CAAK,EAC7B,UAAU,qDACV,MAAO,CACN,aAAcO,EAAS,IAAM,EAC7B,OAAQA,EAAS,GAAK,GACtB,YAAa,GACb,aAAc,GACd,OAAQA,EAAS,4BAA8B,wBAC/C,WAAYA,EAAS,cAAgB,kBAAA,EAGtC,SAAA,CAAAtV,MAACgV,IAAa,MAAAD,EAAc,EAC5BlS,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA0B,MAAO,CAAE,MAAO,eAAA,EACvD,SAAA+U,EAAM,WAAA,CACR,EACA/U,MAAC8U,IAAS,MAAAC,CAAA,CAAc,CAAA,EACzB,EACAlS,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAA7C,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,MAAO,CAAE,MAAO,yBAAA,EAA6B,SAAA,SAAA,CAE1E,EACA6C,OAAC,OAAI,UAAU,0BAA0B,MAAO,CAAE,MAAO,iBACvD,SAAA,CAAAsS,EAAe,IAAEI,CAAA,CAAA,CACnB,CAAA,CAAA,CACD,CAAA,CAAA,EA1BKR,EAAM,SAAA,CA6Bd,CAAC,EAID,CAACrW,IAAiBD,GAAA,YAAAA,EAAQ,sBAAuBA,EAAO,oBAAoB,OAAS,GACrFuB,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAvB,EAAO,oBAAoB,IAAKwJ,GAChCpF,EAAAA,KAAC,MAAA,CAEA,UAAU,qDACV,MAAO,CAAE,MAAO,qBAAA,EAEhB,SAAA,CAAA7C,EAAAA,IAAC,OAAA,CAAM,WAAE,WAAA,CAAY,EACrBA,EAAAA,IAAC,OAAA,CAAM,SAAAiI,EAAE,MAAA,CAAO,CAAA,CAAA,EALXA,EAAE,SAAA,CAOR,CAAA,CACF,CAAA,CAAA,CAEF,CAAA,EACD,CAEF"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/hooks/useRamp.ts","../src/data/countries.ts","../src/utils/provider-filters.ts","../src/context/RampContext.tsx","../src/data/cryptoData.ts","../src/components/ui/icons.tsx","../src/components/PaymentMethodSelector.tsx","../src/components/CheckoutStep.tsx","../src/components/ProcessingStep.tsx","../src/components/CompleteStep.tsx","../src/components/ErrorStep.tsx","../src/components/ConfirmStep.tsx","../src/components/ui/Modal.tsx","../src/components/ui/AnimatedNumber.tsx","../src/components/ui/Skeleton.tsx","../src/components/ui/CloseButton.tsx","../src/components/ui/SearchInput.tsx","../src/components/modals/FiatCurrencyModal.tsx","../src/components/modals/CryptoCurrencyModal.tsx","../src/components/modals/PaymentMethodModal.tsx","../src/components/ui/ToggleSwitch.tsx","../src/components/modals/SettingsScreen.tsx","../src/components/modals/CountryPickerModal.tsx","../src/components/RampForm.tsx","../src/components/CheckoutForm.tsx","../src/components/ui/SkinSwatch.tsx","../src/components/modals/ChooseRampModal.tsx"],"sourcesContent":["/**\n * React hooks for NowRamp Onramp API\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n RampApi,\n type RampApiConfig,\n type OnrampSupported,\n type QuotesResponse,\n type GetQuotesParams,\n type GetSupportedParams,\n type CheckoutIntent,\n type CreateCheckoutIntentParams,\n type Transaction,\n type FlowType,\n} from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseRampConfigResult {\n config: OnrampSupported | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseQuotesResult {\n quotes: QuotesResponse | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCheckoutIntentResult {\n order: CheckoutIntent | null;\n loading: boolean;\n error: Error | null;\n createOrder: (params: CreateCheckoutIntentParams) => Promise<CheckoutIntent>;\n reset: () => void;\n}\n\nexport interface UseTransactionResult {\n status: Transaction | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\n/**\n * Hook to fetch onramp supported configuration\n * Returns gateways, currencies, and payment methods\n */\nexport function useRampConfig(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n orderType?: FlowType,\n country?: string\n): UseRampConfigResult {\n const [data, setData] = useState<OnrampSupported | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n // Memoize API instance\n if (!apiRef.current || apiRef.current !== config) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n }\n\n const fetchConfig = useCallback(async () => {\n if (!config.projectId) {\n setError(new Error('projectId is required'));\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const supportedParams: GetSupportedParams = {};\n if (orderType) supportedParams.orderType = orderType;\n if (country) supportedParams.country = country;\n const result = await apiRef.current!.getSupported(supportedParams);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch config'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, orderType, country]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n return { config: data, loading, error, refetch: fetchConfig };\n}\n\n/**\n * Hook to fetch quotes from all gateways\n * Auto-refreshes when params change\n */\nexport function useQuotes(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n params: GetQuotesParams | null\n): UseQuotesResult {\n const [data, setData] = useState<QuotesResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const fetchIdRef = useRef(0);\n\n useEffect(() => {\n // Bump fetch ID on every param change to invalidate in-flight requests\n const id = ++fetchIdRef.current;\n\n if (!params || !config.projectId) {\n setData(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n apiRef.current!.getQuotes(params).then(\n (result) => {\n if (fetchIdRef.current === id) {\n setData(result);\n setLoading(false);\n }\n },\n (err) => {\n if (fetchIdRef.current === id) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n setData(null);\n setLoading(false);\n }\n }\n );\n }, [config.projectId, params?.fiatCurrency, params?.fiatAmount, params?.cryptoAmount, params?.cryptoCurrency, params?.network, params?.paymentMethodId, params?.country, params?.orderType]);\n\n const refetch = useCallback(async () => {\n if (!params || !config.projectId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await apiRef.current!.getQuotes(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, params]);\n\n return { quotes: data, loading, error, refetch };\n}\n\n/**\n * Hook to create a checkout intent\n */\nexport function useCheckoutIntent(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>\n): UseCheckoutIntentResult {\n const [order, setOrder] = useState<CheckoutIntent | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const createOrder = useCallback(async (params: CreateCheckoutIntentParams): Promise<CheckoutIntent> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.createCheckoutIntent(params);\n setOrder(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create checkout intent');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setOrder(null);\n setError(null);\n }, []);\n\n return { order, loading, error, createOrder, reset };\n}\n\n/**\n * Hook to poll transaction status\n */\nexport function useTransaction(\n config: Pick<RampApiConfig, 'apiUrl'>,\n transactionId: string | null,\n options?: { pollInterval?: number; initialDelay?: number }\n): UseTransactionResult {\n const [status, setStatus] = useState<Transaction | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n if (!apiRef.current) {\n apiRef.current = new RampApi({ apiKey: '', projectId: '', ...config });\n }\n\n const fetchStatus = useCallback(async () => {\n if (!transactionId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.getTransaction(transactionId);\n setStatus(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch status'));\n } finally {\n setLoading(false);\n }\n }, [transactionId]);\n\n // Initial fetch (with optional delay to let checkout iframe load first)\n useEffect(() => {\n if (!transactionId) return;\n\n const delay = options?.initialDelay ?? 0;\n if (delay > 0) {\n const timer = setTimeout(fetchStatus, delay);\n return () => clearTimeout(timer);\n }\n\n fetchStatus();\n }, [fetchStatus, transactionId, options?.initialDelay]);\n\n // Polling — only start after the initial (possibly delayed) fetch has\n // returned a status. Without the `!status` guard the setInterval would\n // bypass initialDelay entirely, firing its first callback at pollInterval\n // (e.g. 5 s) even though we asked for a 15 s delay.\n useEffect(() => {\n if (!transactionId || !options?.pollInterval) return;\n\n // Wait for the initial fetch to populate status before polling\n if (!status) return;\n\n // Stop polling if order is in terminal state\n const terminalStatuses = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n if (terminalStatuses.includes(status.status)) {\n return;\n }\n\n const interval = setInterval(fetchStatus, options.pollInterval);\n return () => clearInterval(interval);\n }, [transactionId, options?.pollInterval, status?.status, fetchStatus]);\n\n return { status, loading, error, refetch: fetchStatus };\n}\n","/**\n * Country list with default fiat currency mapping\n * Used for geo-based fiat auto-selection\n */\n\nexport interface Country {\n /** ISO 3166-1 alpha-2 country code (lowercase) */\n code: string;\n /** Display name */\n name: string;\n /** Default fiat currency code for this country */\n defaultFiat: string;\n}\n\nexport const COUNTRIES: Country[] = [\n { code: 'ad', name: 'Andorra', defaultFiat: 'EUR' },\n { code: 'ae', name: 'United Arab Emirates', defaultFiat: 'AED' },\n { code: 'af', name: 'Afghanistan', defaultFiat: 'USD' },\n { code: 'ag', name: 'Antigua and Barbuda', defaultFiat: 'USD' },\n { code: 'al', name: 'Albania', defaultFiat: 'ALL' },\n { code: 'am', name: 'Armenia', defaultFiat: 'USD' },\n { code: 'ao', name: 'Angola', defaultFiat: 'USD' },\n { code: 'ar', name: 'Argentina', defaultFiat: 'ARS' },\n { code: 'at', name: 'Austria', defaultFiat: 'EUR' },\n { code: 'au', name: 'Australia', defaultFiat: 'AUD' },\n { code: 'az', name: 'Azerbaijan', defaultFiat: 'USD' },\n { code: 'ba', name: 'Bosnia and Herzegovina', defaultFiat: 'EUR' },\n { code: 'bb', name: 'Barbados', defaultFiat: 'USD' },\n { code: 'bd', name: 'Bangladesh', defaultFiat: 'USD' },\n { code: 'be', name: 'Belgium', defaultFiat: 'EUR' },\n { code: 'bf', name: 'Burkina Faso', defaultFiat: 'USD' },\n { code: 'bg', name: 'Bulgaria', defaultFiat: 'EUR' },\n { code: 'bh', name: 'Bahrain', defaultFiat: 'USD' },\n { code: 'bi', name: 'Burundi', defaultFiat: 'USD' },\n { code: 'bj', name: 'Benin', defaultFiat: 'USD' },\n { code: 'bn', name: 'Brunei', defaultFiat: 'USD' },\n { code: 'bo', name: 'Bolivia', defaultFiat: 'USD' },\n { code: 'br', name: 'Brazil', defaultFiat: 'BRL' },\n { code: 'bs', name: 'Bahamas', defaultFiat: 'USD' },\n { code: 'bt', name: 'Bhutan', defaultFiat: 'USD' },\n { code: 'bw', name: 'Botswana', defaultFiat: 'USD' },\n { code: 'by', name: 'Belarus', defaultFiat: 'USD' },\n { code: 'bz', name: 'Belize', defaultFiat: 'USD' },\n { code: 'ca', name: 'Canada', defaultFiat: 'CAD' },\n { code: 'cd', name: 'DR Congo', defaultFiat: 'USD' },\n { code: 'cf', name: 'Central African Republic', defaultFiat: 'USD' },\n { code: 'ch', name: 'Switzerland', defaultFiat: 'CHF' },\n { code: 'ci', name: \"Cote d'Ivoire\", defaultFiat: 'USD' },\n { code: 'cl', name: 'Chile', defaultFiat: 'CLP' },\n { code: 'cm', name: 'Cameroon', defaultFiat: 'USD' },\n { code: 'cn', name: 'China', defaultFiat: 'USD' },\n { code: 'co', name: 'Colombia', defaultFiat: 'USD' },\n { code: 'cr', name: 'Costa Rica', defaultFiat: 'USD' },\n { code: 'cu', name: 'Cuba', defaultFiat: 'USD' },\n { code: 'cv', name: 'Cape Verde', defaultFiat: 'USD' },\n { code: 'cy', name: 'Cyprus', defaultFiat: 'EUR' },\n { code: 'cz', name: 'Czech Republic', defaultFiat: 'CZK' },\n { code: 'de', name: 'Germany', defaultFiat: 'EUR' },\n { code: 'dj', name: 'Djibouti', defaultFiat: 'USD' },\n { code: 'dk', name: 'Denmark', defaultFiat: 'DKK' },\n { code: 'dm', name: 'Dominica', defaultFiat: 'USD' },\n { code: 'do', name: 'Dominican Republic', defaultFiat: 'USD' },\n { code: 'dz', name: 'Algeria', defaultFiat: 'USD' },\n { code: 'ec', name: 'Ecuador', defaultFiat: 'USD' },\n { code: 'ee', name: 'Estonia', defaultFiat: 'EUR' },\n { code: 'eg', name: 'Egypt', defaultFiat: 'USD' },\n { code: 'er', name: 'Eritrea', defaultFiat: 'USD' },\n { code: 'es', name: 'Spain', defaultFiat: 'EUR' },\n { code: 'et', name: 'Ethiopia', defaultFiat: 'USD' },\n { code: 'fi', name: 'Finland', defaultFiat: 'EUR' },\n { code: 'fj', name: 'Fiji', defaultFiat: 'USD' },\n { code: 'fr', name: 'France', defaultFiat: 'EUR' },\n { code: 'ga', name: 'Gabon', defaultFiat: 'USD' },\n { code: 'gb', name: 'United Kingdom', defaultFiat: 'GBP' },\n { code: 'gd', name: 'Grenada', defaultFiat: 'USD' },\n { code: 'ge', name: 'Georgia', defaultFiat: 'USD' },\n { code: 'gh', name: 'Ghana', defaultFiat: 'USD' },\n { code: 'gm', name: 'Gambia', defaultFiat: 'USD' },\n { code: 'gn', name: 'Guinea', defaultFiat: 'USD' },\n { code: 'gq', name: 'Equatorial Guinea', defaultFiat: 'USD' },\n { code: 'gr', name: 'Greece', defaultFiat: 'EUR' },\n { code: 'gt', name: 'Guatemala', defaultFiat: 'USD' },\n { code: 'gw', name: 'Guinea-Bissau', defaultFiat: 'USD' },\n { code: 'gy', name: 'Guyana', defaultFiat: 'USD' },\n { code: 'hk', name: 'Hong Kong', defaultFiat: 'HKD' },\n { code: 'hn', name: 'Honduras', defaultFiat: 'USD' },\n { code: 'hr', name: 'Croatia', defaultFiat: 'EUR' },\n { code: 'ht', name: 'Haiti', defaultFiat: 'USD' },\n { code: 'hu', name: 'Hungary', defaultFiat: 'EUR' },\n { code: 'id', name: 'Indonesia', defaultFiat: 'IDR' },\n { code: 'ie', name: 'Ireland', defaultFiat: 'EUR' },\n { code: 'il', name: 'Israel', defaultFiat: 'USD' },\n { code: 'in', name: 'India', defaultFiat: 'INR' },\n { code: 'iq', name: 'Iraq', defaultFiat: 'USD' },\n { code: 'ir', name: 'Iran', defaultFiat: 'USD' },\n { code: 'is', name: 'Iceland', defaultFiat: 'EUR' },\n { code: 'it', name: 'Italy', defaultFiat: 'EUR' },\n { code: 'jm', name: 'Jamaica', defaultFiat: 'USD' },\n { code: 'jo', name: 'Jordan', defaultFiat: 'USD' },\n { code: 'jp', name: 'Japan', defaultFiat: 'JPY' },\n { code: 'ke', name: 'Kenya', defaultFiat: 'USD' },\n { code: 'kg', name: 'Kyrgyzstan', defaultFiat: 'USD' },\n { code: 'kh', name: 'Cambodia', defaultFiat: 'USD' },\n { code: 'ki', name: 'Kiribati', defaultFiat: 'USD' },\n { code: 'km', name: 'Comoros', defaultFiat: 'USD' },\n { code: 'kn', name: 'Saint Kitts and Nevis', defaultFiat: 'USD' },\n { code: 'kr', name: 'South Korea', defaultFiat: 'KRW' },\n { code: 'kw', name: 'Kuwait', defaultFiat: 'USD' },\n { code: 'kz', name: 'Kazakhstan', defaultFiat: 'USD' },\n { code: 'la', name: 'Laos', defaultFiat: 'USD' },\n { code: 'lb', name: 'Lebanon', defaultFiat: 'USD' },\n { code: 'lc', name: 'Saint Lucia', defaultFiat: 'USD' },\n { code: 'li', name: 'Liechtenstein', defaultFiat: 'CHF' },\n { code: 'lk', name: 'Sri Lanka', defaultFiat: 'USD' },\n { code: 'lr', name: 'Liberia', defaultFiat: 'USD' },\n { code: 'ls', name: 'Lesotho', defaultFiat: 'ZAR' },\n { code: 'lt', name: 'Lithuania', defaultFiat: 'EUR' },\n { code: 'lu', name: 'Luxembourg', defaultFiat: 'EUR' },\n { code: 'lv', name: 'Latvia', defaultFiat: 'EUR' },\n { code: 'ly', name: 'Libya', defaultFiat: 'USD' },\n { code: 'ma', name: 'Morocco', defaultFiat: 'USD' },\n { code: 'mc', name: 'Monaco', defaultFiat: 'EUR' },\n { code: 'md', name: 'Moldova', defaultFiat: 'EUR' },\n { code: 'me', name: 'Montenegro', defaultFiat: 'EUR' },\n { code: 'mg', name: 'Madagascar', defaultFiat: 'USD' },\n { code: 'mk', name: 'North Macedonia', defaultFiat: 'EUR' },\n { code: 'ml', name: 'Mali', defaultFiat: 'USD' },\n { code: 'mm', name: 'Myanmar', defaultFiat: 'USD' },\n { code: 'mn', name: 'Mongolia', defaultFiat: 'USD' },\n { code: 'mr', name: 'Mauritania', defaultFiat: 'USD' },\n { code: 'mt', name: 'Malta', defaultFiat: 'EUR' },\n { code: 'mu', name: 'Mauritius', defaultFiat: 'USD' },\n { code: 'mv', name: 'Maldives', defaultFiat: 'USD' },\n { code: 'mw', name: 'Malawi', defaultFiat: 'USD' },\n { code: 'mx', name: 'Mexico', defaultFiat: 'MXN' },\n { code: 'my', name: 'Malaysia', defaultFiat: 'USD' },\n { code: 'mz', name: 'Mozambique', defaultFiat: 'USD' },\n { code: 'na', name: 'Namibia', defaultFiat: 'ZAR' },\n { code: 'ne', name: 'Niger', defaultFiat: 'USD' },\n { code: 'ng', name: 'Nigeria', defaultFiat: 'NGN' },\n { code: 'ni', name: 'Nicaragua', defaultFiat: 'USD' },\n { code: 'nl', name: 'Netherlands', defaultFiat: 'EUR' },\n { code: 'no', name: 'Norway', defaultFiat: 'NOK' },\n { code: 'np', name: 'Nepal', defaultFiat: 'USD' },\n { code: 'nr', name: 'Nauru', defaultFiat: 'AUD' },\n { code: 'nz', name: 'New Zealand', defaultFiat: 'NZD' },\n { code: 'om', name: 'Oman', defaultFiat: 'USD' },\n { code: 'pa', name: 'Panama', defaultFiat: 'USD' },\n { code: 'pe', name: 'Peru', defaultFiat: 'USD' },\n { code: 'pg', name: 'Papua New Guinea', defaultFiat: 'USD' },\n { code: 'ph', name: 'Philippines', defaultFiat: 'PHP' },\n { code: 'pk', name: 'Pakistan', defaultFiat: 'USD' },\n { code: 'pl', name: 'Poland', defaultFiat: 'PLN' },\n { code: 'pt', name: 'Portugal', defaultFiat: 'EUR' },\n { code: 'pw', name: 'Palau', defaultFiat: 'USD' },\n { code: 'py', name: 'Paraguay', defaultFiat: 'USD' },\n { code: 'qa', name: 'Qatar', defaultFiat: 'QAR' },\n { code: 'ro', name: 'Romania', defaultFiat: 'EUR' },\n { code: 'rs', name: 'Serbia', defaultFiat: 'EUR' },\n { code: 'ru', name: 'Russia', defaultFiat: 'USD' },\n { code: 'rw', name: 'Rwanda', defaultFiat: 'USD' },\n { code: 'sa', name: 'Saudi Arabia', defaultFiat: 'SAR' },\n { code: 'sb', name: 'Solomon Islands', defaultFiat: 'USD' },\n { code: 'sc', name: 'Seychelles', defaultFiat: 'USD' },\n { code: 'sd', name: 'Sudan', defaultFiat: 'USD' },\n { code: 'se', name: 'Sweden', defaultFiat: 'SEK' },\n { code: 'sg', name: 'Singapore', defaultFiat: 'SGD' },\n { code: 'si', name: 'Slovenia', defaultFiat: 'EUR' },\n { code: 'sk', name: 'Slovakia', defaultFiat: 'EUR' },\n { code: 'sl', name: 'Sierra Leone', defaultFiat: 'USD' },\n { code: 'sm', name: 'San Marino', defaultFiat: 'EUR' },\n { code: 'sn', name: 'Senegal', defaultFiat: 'USD' },\n { code: 'so', name: 'Somalia', defaultFiat: 'USD' },\n { code: 'sr', name: 'Suriname', defaultFiat: 'USD' },\n { code: 'ss', name: 'South Sudan', defaultFiat: 'USD' },\n { code: 'sv', name: 'El Salvador', defaultFiat: 'USD' },\n { code: 'sy', name: 'Syria', defaultFiat: 'USD' },\n { code: 'sz', name: 'Eswatini', defaultFiat: 'ZAR' },\n { code: 'td', name: 'Chad', defaultFiat: 'USD' },\n { code: 'tg', name: 'Togo', defaultFiat: 'USD' },\n { code: 'th', name: 'Thailand', defaultFiat: 'THB' },\n { code: 'tj', name: 'Tajikistan', defaultFiat: 'USD' },\n { code: 'tl', name: 'Timor-Leste', defaultFiat: 'USD' },\n { code: 'tm', name: 'Turkmenistan', defaultFiat: 'USD' },\n { code: 'tn', name: 'Tunisia', defaultFiat: 'USD' },\n { code: 'to', name: 'Tonga', defaultFiat: 'USD' },\n { code: 'tr', name: 'Turkey', defaultFiat: 'TRY' },\n { code: 'tt', name: 'Trinidad and Tobago', defaultFiat: 'USD' },\n { code: 'tv', name: 'Tuvalu', defaultFiat: 'AUD' },\n { code: 'tw', name: 'Taiwan', defaultFiat: 'TWD' },\n { code: 'tz', name: 'Tanzania', defaultFiat: 'USD' },\n { code: 'ua', name: 'Ukraine', defaultFiat: 'USD' },\n { code: 'ug', name: 'Uganda', defaultFiat: 'USD' },\n { code: 'us', name: 'United States', defaultFiat: 'USD' },\n { code: 'uy', name: 'Uruguay', defaultFiat: 'USD' },\n { code: 'uz', name: 'Uzbekistan', defaultFiat: 'USD' },\n { code: 'va', name: 'Vatican City', defaultFiat: 'EUR' },\n { code: 'vc', name: 'Saint Vincent and the Grenadines', defaultFiat: 'USD' },\n { code: 've', name: 'Venezuela', defaultFiat: 'USD' },\n { code: 'vn', name: 'Vietnam', defaultFiat: 'VND' },\n { code: 'vu', name: 'Vanuatu', defaultFiat: 'USD' },\n { code: 'ws', name: 'Samoa', defaultFiat: 'USD' },\n { code: 'ye', name: 'Yemen', defaultFiat: 'USD' },\n { code: 'za', name: 'South Africa', defaultFiat: 'ZAR' },\n { code: 'zm', name: 'Zambia', defaultFiat: 'USD' },\n { code: 'zw', name: 'Zimbabwe', defaultFiat: 'USD' },\n];\n\n/** Precomputed lookup by country code */\nexport const COUNTRY_MAP: Record<string, Country> = Object.fromEntries(\n COUNTRIES.map((c) => [c.code, c])\n);\n\n/**\n * Resolve the default fiat currency for a country.\n * Validates against available fiats, falls back to USD then first available.\n */\nexport function getDefaultFiatForCountry(\n countryCode: string | undefined | null,\n supportedFiats?: string[]\n): string {\n if (!countryCode) return 'USD';\n\n const country = COUNTRY_MAP[countryCode.toLowerCase()];\n const preferredFiat = country?.defaultFiat || 'USD';\n\n // If no supported fiats list, return the preferred fiat directly\n if (!supportedFiats || supportedFiats.length === 0) return preferredFiat;\n\n // Check if the country's default fiat is supported\n if (supportedFiats.includes(preferredFiat)) return preferredFiat;\n\n // Fall back to USD if supported\n if (supportedFiats.includes('USD')) return 'USD';\n\n // Last resort: first available fiat\n return supportedFiats[0] || 'USD';\n}\n","/**\n * Provider-aware cascading filters for currency/network/payment method selection.\n *\n * Pure functions with no React deps — testable independently.\n * Uses the `providers` arrays from the backend's AggregatedConfig to ensure\n * only provider-supported combinations are selectable in the form.\n */\n\nimport type {\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n} from '@nowramp/sdk';\n\n/**\n * Build-time compat flag. When true (default), undefined providers arrays\n * are treated as wildcards (match everything). Set to false and rebuild\n * once all providers are fully annotated to enable strict filtering.\n */\nexport const PROVIDERS_WILDCARD_COMPAT = true;\n\n/**\n * Returns true if two providers arrays share at least one common provider.\n *\n * Semantics:\n * undefined → wildcard when compat is true, else no match\n * [] → \"no providers support this\", always returns false\n */\nexport function providersOverlap(\n a?: string[],\n b?: string[],\n compat = PROVIDERS_WILDCARD_COMPAT,\n): boolean {\n if (a === undefined || b === undefined) return compat;\n if (a.length === 0 || b.length === 0) return false;\n return a.some((p) => b.includes(p));\n}\n\n/** Filter fiats by provider overlap with selected network. */\nexport function filterAvailableFiats(\n fiats: SupportedFiat[],\n networkProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedFiat[] {\n return fiats.filter((f) => providersOverlap(f.providers, networkProviders, compat));\n}\n\n/**\n * Filter cryptos: keep only networks with provider overlap against fiat providers.\n * Drop cryptos with zero remaining networks.\n */\nexport function filterAvailableCryptos(\n cryptos: SupportedCrypto[],\n fiatProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedCrypto[] {\n const result: SupportedCrypto[] = [];\n for (const crypto of cryptos) {\n const filteredNetworks = crypto.networks.filter((n) =>\n providersOverlap(n.providers, fiatProviders, compat),\n );\n if (filteredNetworks.length > 0) {\n result.push(\n filteredNetworks.length === crypto.networks.length\n ? crypto\n : { ...crypto, networks: filteredNetworks },\n );\n }\n }\n return result;\n}\n\n/** Filter payment methods by provider overlap with network AND supportedFiats. */\nexport function filterAvailablePaymentMethods(\n methods: SupportedPaymentMethod[],\n networkProviders: string[] | undefined,\n fiatCurrency: string,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedPaymentMethod[] {\n if (!fiatCurrency) return [];\n return methods.filter(\n (m) =>\n m.supportedFiats.includes(fiatCurrency) &&\n providersOverlap(m.providers, networkProviders, compat),\n );\n}\n\n// =============================================================================\n// Reconciliation\n// =============================================================================\n\nexport interface ReconciledSelections {\n cryptoCurrency?: string;\n network?: string;\n fiatCurrency?: string;\n paymentMethodId?: string;\n}\n\nexport interface LockFlags {\n cryptoLocked?: boolean;\n networkLocked?: boolean;\n fiatLocked?: boolean;\n}\n\n/**\n * Pure reconciliation: given current selections, filtered lists, and lock flags,\n * returns a plain object with corrected values (or null if no change needed).\n */\nexport function reconcileSelections(\n state: {\n cryptoCurrency: string;\n network: string;\n fiatCurrency: string;\n paymentMethodId: string;\n },\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n locks: LockFlags,\n): ReconciledSelections | null {\n const result: ReconciledSelections = {};\n let changed = false;\n\n // --- Crypto + Network ---\n if (!locks.cryptoLocked && !locks.networkLocked) {\n // Both unlocked: validate crypto+network pair, correct both if invalid\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid && filtered.availableCryptos.length > 0) {\n const first = filtered.availableCryptos[0];\n const net =\n first.networks.find((n) => n.isDefault) || first.networks[0];\n if (first.code !== state.cryptoCurrency) {\n result.cryptoCurrency = first.code;\n changed = true;\n }\n if (net && net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n } else if (!locks.cryptoLocked && locks.networkLocked) {\n // Network locked, crypto unlocked: pick a crypto that supports the locked network\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid) {\n const compatible = filtered.availableCryptos.find((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (compatible && compatible.code !== state.cryptoCurrency) {\n result.cryptoCurrency = compatible.code;\n changed = true;\n }\n }\n } else if (locks.cryptoLocked && !locks.networkLocked) {\n // Crypto locked, network unlocked: correct network against locked crypto's available networks\n const lockedCrypto = filtered.availableCryptos.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (lockedCrypto) {\n const networkValid = lockedCrypto.networks.some(\n (n) => n.id === state.network,\n );\n if (!networkValid && lockedCrypto.networks.length > 0) {\n const net =\n lockedCrypto.networks.find((n) => n.isDefault) ||\n lockedCrypto.networks[0];\n if (net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n }\n }\n // Both locked: no corrections possible\n\n // --- Fiat (prefer USD, else first available) ---\n if (!locks.fiatLocked) {\n const fiatValid =\n state.fiatCurrency &&\n filtered.availableFiats.some((f) => f.code === state.fiatCurrency);\n if (!fiatValid && filtered.availableFiats.length > 0) {\n const usd = filtered.availableFiats.find((f) => f.code === 'USD');\n const target = usd || filtered.availableFiats[0];\n if (target.code !== state.fiatCurrency) {\n result.fiatCurrency = target.code;\n changed = true;\n }\n }\n }\n\n // --- Payment Method (prefer card/debit, else first) ---\n const methodValid =\n state.paymentMethodId &&\n filtered.availablePaymentMethods.some(\n (m) => m.id === state.paymentMethodId,\n );\n if (!methodValid && filtered.availablePaymentMethods.length > 0) {\n const card = filtered.availablePaymentMethods.find(\n (m) => m.id.includes('card') || m.id.includes('debit'),\n );\n const target = card || filtered.availablePaymentMethods[0];\n if (target.id !== state.paymentMethodId) {\n result.paymentMethodId = target.id;\n changed = true;\n }\n }\n\n return changed ? result : null;\n}\n\n// =============================================================================\n// Selection Unsupported Check\n// =============================================================================\n\n/**\n * Returns true when a locked selection has no provider support in the current flow.\n * Drives CTA disable + message in the form.\n */\nexport function isSelectionUnsupported(\n config: { cryptos?: SupportedCrypto[]; fiats?: SupportedFiat[] },\n state: { cryptoCurrency: string; network: string; fiatCurrency: string },\n locks: LockFlags,\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n): boolean {\n // A. Locked crypto+network\n if (locks.cryptoLocked) {\n const crypto = config.cryptos?.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (!crypto) return true;\n const network = crypto.networks?.find((n) => n.id === state.network);\n if (!network) return true;\n if (network.providers !== undefined && network.providers.length === 0)\n return true;\n // Has explicit providers but no fiats or payment methods overlap\n if (\n network.providers !== undefined &&\n (filtered.availableFiats.length === 0 ||\n filtered.availablePaymentMethods.length === 0)\n )\n return true;\n }\n\n // B. Locked network only (not crypto-locked)\n if (locks.networkLocked && !locks.cryptoLocked) {\n const hasNetworkSupport = filtered.availableCryptos.some((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (!hasNetworkSupport) return true;\n }\n\n // C. Locked fiat\n if (locks.fiatLocked) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return true;\n if (fiat.providers !== undefined && fiat.providers.length === 0)\n return true;\n if (\n fiat.providers !== undefined &&\n filtered.availableCryptos.length === 0\n )\n return true;\n }\n\n return false;\n}\n","/**\n * Ramp Context Provider\n * Provides configuration and state management for the ramp form\n */\n\nimport React, { createContext, useContext, useReducer, useCallback, useMemo, useRef } from 'react';\nimport type {\n RampApiConfig,\n OnrampSupported,\n QuotesResponse,\n Quote,\n CheckoutIntent,\n Transaction,\n FieldLocksConfig,\n FlowType,\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n} from '@nowramp/sdk';\nimport {\n useRampConfig,\n useQuotes,\n useCheckoutIntent,\n useTransaction,\n} from '../hooks/useRamp';\nimport { getDefaultFiatForCountry } from '../data/countries';\nimport {\n filterAvailableFiats,\n filterAvailableCryptos,\n filterAvailablePaymentMethods,\n reconcileSelections,\n isSelectionUnsupported,\n} from '../utils/provider-filters';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RampStep =\n | 'confirm' // Confirm pre-filled order (session mode)\n | 'amount' // Select currency and amount\n | 'quotes' // View and compare quotes\n | 'wallet' // Enter wallet address\n | 'checkout' // Provider checkout (iframe/redirect)\n | 'processing' // Waiting for completion\n | 'complete' // Success\n | 'error'; // Error state\n\nexport interface RampFormState {\n step: RampStep;\n flowType: FlowType;\n fiatCurrency: string;\n fiatAmount: string;\n cryptoCurrency: string;\n cryptoAmount: string;\n network: string;\n paymentMethodId: string;\n walletAddress: string;\n walletError: string | null;\n selectedProvider: string | null;\n selectedQuote: Quote | null;\n customerId: string;\n email: string;\n country: string;\n /** How country was set: 'auto' (GeoIP), 'manual' (user pick), or '' (not set) */\n countrySource: 'auto' | 'manual' | '';\n errorMessage: string | null;\n}\n\n/** @internal exported for unit testing */\nexport type RampAction =\n | { type: 'SET_STEP'; step: RampStep }\n | { type: 'SET_FLOW_TYPE'; flowType: FlowType; fieldLocks?: FieldLocksConfig | null }\n | { type: 'SET_FIAT_CURRENCY'; currency: string }\n | { type: 'SET_FIAT_AMOUNT'; amount: string }\n | { type: 'SET_CRYPTO_CURRENCY'; currency: string }\n | { type: 'SET_CRYPTO_AMOUNT'; amount: string }\n | { type: 'SET_NETWORK'; network: string }\n | { type: 'SET_CRYPTO_CHAIN'; chain: string }\n | { type: 'SET_PAYMENT_METHOD'; methodId: string }\n | { type: 'SET_WALLET_ADDRESS'; address: string }\n | { type: 'SET_WALLET_ERROR'; message: string }\n | { type: 'SELECT_QUOTE'; quote: Quote }\n | { type: 'SET_CUSTOMER_ID'; customerId: string }\n | { type: 'SET_EMAIL'; email: string }\n | { type: 'SET_COUNTRY'; country: string }\n | { type: 'SET_COUNTRY_AUTO'; country: string }\n | { type: 'SET_ERROR'; message: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'RESET' };\n\nexport interface RampContextValue {\n // Configuration\n apiConfig: Pick<RampApiConfig, 'apiUrl' | 'projectId'>;\n /** Base URL for static assets (crypto icons, flags). Empty string = root-relative. */\n assetBaseUrl: string;\n config: OnrampSupported | null;\n configLoading: boolean;\n configError: Error | null;\n\n // Form state\n state: RampFormState;\n dispatch: React.Dispatch<RampAction>;\n\n // Quotes\n quotes: QuotesResponse | null;\n quotesLoading: boolean;\n quotesError: Error | null;\n fetchQuotes: () => void;\n\n // Order\n order: CheckoutIntent | null;\n orderLoading: boolean;\n orderError: Error | null;\n createOrder: () => Promise<void>;\n\n // Order status\n orderStatus: Transaction | null;\n orderStatusLoading: boolean;\n\n // Session-aware props\n fieldLocks: FieldLocksConfig | null;\n defaultGateway: string | null;\n\n // Filtered lists (provider-aware cascading filters)\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n selectionUnsupported: boolean;\n\n // Validation\n amountError: string | null;\n\n // Navigation helpers\n goToStep: (step: RampStep) => void;\n goBack: () => void;\n canProceed: boolean;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Strip trailing zeros and limit decimal places (cleans backend values like \"33.00000000\") */\nfunction normalizeAmount(value: string, maxDecimals: number): string {\n if (!value) return value;\n const dotIndex = value.indexOf('.');\n if (dotIndex === -1) return value;\n let result = value;\n if (result.length - dotIndex - 1 > maxDecimals) {\n result = result.slice(0, dotIndex + maxDecimals + 1);\n }\n result = result.replace(/0+$/, '').replace(/\\.$/, '');\n return result;\n}\n\n// =============================================================================\n// Initial State & Reducer\n// =============================================================================\n\n/** @internal exported for unit testing */\nexport const initialState: RampFormState = {\n step: 'amount',\n flowType: 'buy',\n fiatCurrency: 'USD',\n fiatAmount: '',\n cryptoCurrency: '',\n cryptoAmount: '',\n network: '',\n paymentMethodId: '',\n walletAddress: '',\n walletError: null,\n selectedProvider: null,\n selectedQuote: null,\n customerId: '',\n email: '',\n country: '',\n countrySource: '',\n errorMessage: null,\n};\n\n/** @internal exported for unit testing */\nexport function rampReducer(state: RampFormState, action: RampAction): RampFormState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, step: action.step, errorMessage: null };\n case 'SET_FLOW_TYPE':\n return {\n ...state,\n flowType: action.flowType,\n fiatAmount: '',\n cryptoAmount: '',\n fiatCurrency: action.fieldLocks?.sourceCurrency?.locked ? state.fiatCurrency : '',\n cryptoCurrency: action.fieldLocks?.destinationCurrency?.locked ? state.cryptoCurrency : '',\n network: (action.fieldLocks?.network?.locked || action.fieldLocks?.destinationCurrency?.locked)\n ? state.network : '',\n paymentMethodId: '',\n selectedQuote: null,\n selectedProvider: null,\n errorMessage: null,\n };\n case 'SET_FIAT_CURRENCY':\n return { ...state, fiatCurrency: action.currency };\n case 'SET_FIAT_AMOUNT':\n return { ...state, fiatAmount: action.amount };\n case 'SET_CRYPTO_CURRENCY':\n return { ...state, cryptoCurrency: action.currency, network: '' };\n case 'SET_CRYPTO_AMOUNT':\n return { ...state, cryptoAmount: action.amount };\n case 'SET_NETWORK':\n return { ...state, network: action.network };\n case 'SET_CRYPTO_CHAIN':\n return { ...state, network: action.chain };\n case 'SET_PAYMENT_METHOD':\n return { ...state, paymentMethodId: action.methodId };\n case 'SET_WALLET_ADDRESS':\n return { ...state, walletAddress: action.address, walletError: null };\n case 'SET_WALLET_ERROR':\n return { ...state, walletError: action.message };\n case 'SELECT_QUOTE':\n return {\n ...state,\n selectedQuote: action.quote,\n selectedProvider: action.quote.gatewayId,\n };\n case 'SET_CUSTOMER_ID':\n return { ...state, customerId: action.customerId };\n case 'SET_EMAIL':\n return { ...state, email: action.email };\n case 'SET_COUNTRY':\n return { ...state, country: action.country, countrySource: 'manual' };\n case 'SET_COUNTRY_AUTO':\n return { ...state, country: action.country, countrySource: 'auto' };\n case 'SET_ERROR':\n return { ...state, step: 'error', errorMessage: action.message };\n case 'CLEAR_ERROR':\n return { ...state, errorMessage: null };\n case 'RESET':\n return initialState;\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst RampContext = createContext<RampContextValue | null>(null);\n\nexport interface RampProviderProps {\n /** Project ID (required) */\n projectId: string;\n /** API base URL (optional) */\n apiUrl?: string;\n /** Base URL for static assets (crypto icons, flags). Use CDN URL for standalone/IIFE deployments. */\n assetBaseUrl?: string;\n /** Flow type: 'buy' (onramp) or 'sell' (offramp) */\n flowType?: FlowType;\n /** External customer ID */\n customerId?: string;\n /** Brand identifier for metadata tracking (e.g., sub-brand name) */\n brandId?: string;\n /** Initial fiat currency */\n defaultFiatCurrency?: string;\n /** Initial crypto currency */\n defaultCryptoCurrency?: string;\n /** Initial network */\n defaultNetwork?: string;\n /** Initial fiat amount */\n defaultFiatAmount?: string;\n /** Initial crypto amount (used for sell/offramp) */\n defaultCryptoAmount?: string;\n /** Initial wallet address */\n defaultWalletAddress?: string;\n /** Default gateway ID to pre-select. Falls back to project config if not set. */\n defaultGateway?: string;\n /** Default country code (ISO alpha-2). If set, skips GeoIP auto-detection. */\n defaultCountry?: string;\n /** Field locks from session */\n fieldLocks?: FieldLocksConfig;\n /** Poll interval for order status (ms) */\n statusPollInterval?: number;\n /** Callback when order completes */\n onComplete?: (status: Transaction) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n children: React.ReactNode;\n}\n\nexport function RampProvider({\n projectId,\n apiUrl = 'https://api.nowramp.com',\n assetBaseUrl = '',\n flowType = 'buy',\n customerId = '',\n brandId,\n defaultFiatCurrency = 'USD',\n defaultCryptoCurrency = 'BTC',\n defaultNetwork: defaultNetworkProp = '',\n defaultFiatAmount = '',\n defaultCryptoAmount = '',\n defaultWalletAddress = '',\n defaultGateway,\n defaultCountry,\n fieldLocks,\n statusPollInterval = 5000,\n onComplete,\n onError,\n children,\n}: RampProviderProps) {\n const apiConfig = useMemo(() => ({ apiUrl, projectId }), [apiUrl, projectId]);\n\n // If no network specified but crypto is, use lowercase ticker as default (matches Banxa network IDs)\n const defaultNetwork = defaultNetworkProp || (defaultCryptoCurrency ? defaultCryptoCurrency.toLowerCase() : '');\n\n // Determine initial step: if all fields are pre-set with a gateway, go to confirm\n // For sell: wallet is optional, so don't require it\n const initialIsSell = flowType === 'sell';\n const hasAmount = initialIsSell ? !!defaultCryptoAmount : !!defaultFiatAmount;\n const hasAllFields = initialIsSell\n ? !!(hasAmount && defaultCryptoCurrency && defaultNetwork)\n : !!(hasAmount && defaultCryptoCurrency && defaultNetwork && defaultWalletAddress);\n const initialStep: RampStep = (hasAllFields && defaultGateway) ? 'confirm' : 'amount';\n\n // Initialize state with defaults\n // Use '250' as default fiat amount for buy if none provided\n const effectiveFiatAmount = defaultFiatAmount || (flowType === 'buy' ? '250' : '');\n const [state, dispatch] = useReducer(rampReducer, {\n ...initialState,\n step: initialStep,\n flowType,\n fiatCurrency: defaultFiatCurrency,\n cryptoCurrency: defaultCryptoCurrency,\n network: defaultNetwork,\n fiatAmount: normalizeAmount(effectiveFiatAmount, 2),\n cryptoAmount: normalizeAmount(defaultCryptoAmount, 6),\n walletAddress: defaultWalletAddress,\n customerId,\n // If defaultCountry is provided, set it immediately with 'manual' source to skip auto-detection\n ...(defaultCountry ? { country: defaultCountry.toLowerCase(), countrySource: 'manual' as const } : {}),\n });\n\n const isSell = state.flowType === 'sell';\n\n // Fetch supported config (pass orderType for sell to get sell-specific currencies/limits)\n // Pass country so backend filters results by region\n const {\n config,\n loading: configLoading,\n error: configError,\n } = useRampConfig(apiConfig, state.flowType, state.country || undefined);\n\n // GeoIP auto-detection: when config loads with detectedCountry and no country is set yet\n const geoAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoAppliedRef.current) return;\n if (!config?.detectedCountry) return;\n // Skip if country already set (defaultCountry prop or manual selection)\n if (state.country) return;\n\n geoAppliedRef.current = true;\n const detected = config.detectedCountry.toLowerCase();\n dispatch({ type: 'SET_COUNTRY_AUTO', country: detected });\n\n // Auto-set fiat currency based on detected country\n const supportedFiats = config.fiats?.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(detected, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [config, state.country, state.fiatCurrency]);\n\n // When defaultCountry is set and config loads, auto-set fiat for that country\n const defaultCountryAppliedRef = useRef(false);\n React.useEffect(() => {\n if (defaultCountryAppliedRef.current) return;\n if (!defaultCountry || !config?.fiats?.length) return;\n\n defaultCountryAppliedRef.current = true;\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(defaultCountry, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [defaultCountry, config, state.fiatCurrency]);\n\n // Reset geo-fallback guard when user manually changes country, so the\n // fallback can re-evaluate for the new geo-detected currency\n // Manual country change: auto-update fiat currency when user picks a new country\n const prevCountryRef = useRef(state.country);\n React.useEffect(() => {\n if (state.country === prevCountryRef.current) return;\n prevCountryRef.current = state.country;\n if (state.countrySource === 'manual') {\n geoFallbackAppliedRef.current = false;\n }\n\n // Only auto-switch fiat for manual selections (not initial auto-detection, which is handled above)\n if (state.countrySource !== 'manual') return;\n if (!config?.fiats?.length) return;\n\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(state.country, supportedFiats);\n if (fiat !== state.fiatCurrency) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [state.country, state.countrySource, config, state.fiatCurrency]);\n\n // When fiat currency changes, ensure the amount meets the new currency's minimum\n // This handles cases like geo-detection switching from USD (250 is fine) to TRY (250 is below min)\n const prevFiatRef = useRef(state.fiatCurrency);\n React.useEffect(() => {\n if (state.fiatCurrency === prevFiatRef.current) return;\n prevFiatRef.current = state.fiatCurrency;\n\n if (isSell || !config?.fiats?.length || !state.fiatAmount) return;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat?.minAmount) return;\n\n const currentAmount = parseFloat(state.fiatAmount);\n const minAmount = parseFloat(fiat.minAmount);\n if (!isNaN(currentAmount) && !isNaN(minAmount) && currentAmount < minAmount) {\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: String(Math.ceil(minAmount)) });\n }\n }, [state.fiatCurrency, state.fiatAmount, config, isSell]);\n\n // --- Cascading provider-aware filters ---\n const { availableFiats, availableCryptos, availablePaymentMethods } = useMemo(() => {\n if (!config) {\n return { availableFiats: [] as SupportedFiat[], availableCryptos: [] as SupportedCrypto[], availablePaymentMethods: [] as SupportedPaymentMethod[] };\n }\n\n // Resolve selected network's providers\n let networkProviders: string[] | undefined;\n if (state.cryptoCurrency && state.network) {\n const crypto = config.cryptos?.find((c) => c.code === state.cryptoCurrency);\n const network = crypto?.networks?.find((n) => n.id === state.network);\n if (!crypto || !network) {\n networkProviders = [];\n } else {\n networkProviders = network.providers;\n }\n }\n\n // Resolve selected fiat's providers\n let fiatProviders: string[] | undefined;\n if (state.fiatCurrency) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) {\n fiatProviders = [];\n } else {\n fiatProviders = fiat.providers;\n }\n }\n\n return {\n availableFiats: filterAvailableFiats(config.fiats ?? [], networkProviders),\n availableCryptos: filterAvailableCryptos(config.cryptos ?? [], fiatProviders),\n availablePaymentMethods: filterAvailablePaymentMethods(\n config.paymentMethods ?? [], networkProviders, state.fiatCurrency\n ),\n };\n }, [config, state.cryptoCurrency, state.network, state.fiatCurrency]);\n\n // Derived flag: locked selection has no provider support\n const selectionUnsupported = useMemo(() => {\n if (configLoading || !config) return false;\n return isSelectionUnsupported(\n config,\n { cryptoCurrency: state.cryptoCurrency, network: state.network, fiatCurrency: state.fiatCurrency },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n },\n { availableFiats, availableCryptos, availablePaymentMethods }\n );\n }, [configLoading, config, fieldLocks, state.cryptoCurrency, state.network,\n state.fiatCurrency, availableFiats, availableCryptos, availablePaymentMethods]);\n\n // Reconcile selections when filtered lists change\n React.useEffect(() => {\n if (configLoading) return;\n if (availableFiats.length === 0 && availableCryptos.length === 0) return;\n\n const corrections = reconcileSelections(\n {\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n fiatCurrency: state.fiatCurrency,\n paymentMethodId: state.paymentMethodId,\n },\n { availableFiats, availableCryptos, availablePaymentMethods },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n }\n );\n\n if (!corrections) return;\n\n if (corrections.cryptoCurrency !== undefined) {\n dispatch({ type: 'SET_CRYPTO_CURRENCY', currency: corrections.cryptoCurrency });\n }\n if (corrections.network !== undefined) {\n dispatch({ type: 'SET_NETWORK', network: corrections.network });\n }\n if (corrections.fiatCurrency !== undefined) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: corrections.fiatCurrency });\n }\n if (corrections.paymentMethodId !== undefined) {\n dispatch({ type: 'SET_PAYMENT_METHOD', methodId: corrections.paymentMethodId });\n }\n }, [configLoading, availableFiats, availableCryptos, availablePaymentMethods,\n state.cryptoCurrency, state.network, state.fiatCurrency, state.paymentMethodId,\n fieldLocks, dispatch]);\n\n // Amount validation against min/max limits\n // Computed before quoteParams so invalid amounts never trigger a fetch\n // For sell, user enters crypto amount — skip fiat-based validation (backend validates)\n const amountError = useMemo(() => {\n if (isSell) {\n // For sell, basic presence check only — backend validates crypto amount limits\n if (!state.cryptoAmount) return null;\n const amount = parseFloat(state.cryptoAmount);\n if (isNaN(amount) || amount <= 0) return 'Enter a valid amount';\n return null;\n }\n\n if (!config || !state.fiatAmount) return null;\n\n const amount = parseFloat(state.fiatAmount);\n if (isNaN(amount)) return null;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return null;\n\n const min = parseFloat(fiat.minAmount);\n const max = parseFloat(fiat.maxAmount);\n\n if (!isNaN(min) && amount < min) {\n return `Minimum amount is ${fiat.minAmount} ${state.fiatCurrency}`;\n }\n if (!isNaN(max) && amount > max) {\n return `Maximum amount is ${fiat.maxAmount} ${state.fiatCurrency}`;\n }\n return null;\n }, [config, state.fiatAmount, state.fiatCurrency, state.cryptoAmount, isSell]);\n\n // Fetch quotes when form is filled, config loaded, and amount is valid\n // Wait for geo-detection to resolve before fetching (prevents wasted initial fetch\n // that gets cancelled when fiat currency changes from USD to the detected currency)\n const quoteParams = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n if (!config || !hasAmount || !state.fiatCurrency || !state.cryptoCurrency || !state.network) {\n return null;\n }\n if (amountError) {\n return null;\n }\n // If backend detected a country but geo-detection effect hasn't applied yet, wait\n if (config.detectedCountry && state.countrySource === '' && !defaultCountry) {\n return null;\n }\n return {\n fiatCurrency: state.fiatCurrency,\n ...(isSell ? { cryptoAmount: state.cryptoAmount } : { fiatAmount: state.fiatAmount }),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n paymentMethodId: state.paymentMethodId || undefined,\n country: state.country || undefined,\n orderType: state.flowType,\n };\n }, [config, state.fiatCurrency, state.fiatAmount, state.cryptoAmount, state.cryptoCurrency, state.network, state.paymentMethodId, state.country, state.countrySource, amountError, isSell, state.flowType, defaultCountry]);\n\n const {\n quotes,\n loading: quotesLoading,\n error: quotesError,\n refetch: fetchQuotes,\n } = useQuotes(apiConfig, quoteParams);\n\n // Fallback: if geo-detected fiat returns no quotes for the default crypto, fall back to USD\n // This handles cases where a local currency (e.g. NGN) has no provider pairs with BTC\n // Only triggers when quotes loaded successfully with zero results — never on API errors\n const geoFallbackAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoFallbackAppliedRef.current) return;\n // Only apply for auto-detected currencies, not manual selections\n if (state.countrySource !== 'auto') return;\n // Wait until quotes have actually loaded (not loading, not null params)\n if (quotesLoading || !quoteParams) return;\n // Skip fallback on API errors — only fall back when the response succeeded\n // but contained no quotes (i.e. quotes object exists with no bestQuote)\n if (quotesError || !quotes) return;\n // If we got quotes, no fallback needed\n if (quotes.bestQuote) return;\n // If the fiat is already USD, nothing to fall back to\n if (state.fiatCurrency === 'USD') return;\n\n geoFallbackAppliedRef.current = true;\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: 'USD' });\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: '250' });\n }, [quotes, quotesLoading, quotesError, quoteParams, state.countrySource, state.fiatCurrency]);\n\n // Order creation\n const {\n order,\n loading: orderLoading,\n error: orderError,\n createOrder: createOrderApi,\n } = useCheckoutIntent(apiConfig);\n\n // Order status polling — delay the initial fetch to give the checkout\n // iframe time to load before we start polling. Without this, the first\n // poll can return a 'processing' status from the provider and the\n // CheckoutStep immediately transitions to ProcessingStep before the\n // user even sees the iframe (race condition with iframe-based providers\n // like Banxa that move to 'processing' quickly).\n const CHECKOUT_POLL_INITIAL_DELAY = 15_000; // 15 seconds\n\n const {\n status: orderStatus,\n loading: orderStatusLoading,\n } = useTransaction(\n { apiUrl },\n order?.orderId ?? null,\n { pollInterval: statusPollInterval, initialDelay: CHECKOUT_POLL_INITIAL_DELAY }\n );\n\n // Handle order completion\n React.useEffect(() => {\n if (orderStatus?.status === 'completed' && onComplete) {\n onComplete(orderStatus);\n }\n }, [orderStatus?.status, onComplete]);\n\n // Handle errors — only propagate config and order errors as fatal.\n // Quote errors are non-fatal (validation rejections, transient failures)\n // and are already surfaced via quotesError in the UI.\n React.useEffect(() => {\n const error = configError || orderError;\n if (error && onError) {\n onError(error);\n }\n }, [configError, orderError, onError]);\n\n // Resolve effective default gateway: explicit prop > project config\n const effectiveDefaultGateway = defaultGateway || config?.defaultGateway || null;\n\n // Use refs to avoid stale closures — async data loads mean callbacks may\n // capture earlier null values even with useCallback deps.\n const gatewayRef = useRef(effectiveDefaultGateway);\n gatewayRef.current = effectiveDefaultGateway;\n\n const quotesRef = useRef(quotes);\n quotesRef.current = quotes;\n\n const brandIdRef = useRef(brandId);\n brandIdRef.current = brandId;\n\n // Create order handler\n const createOrder = useCallback(async () => {\n const gateway = state.selectedQuote?.gatewayId || quotesRef.current?.bestQuote?.gatewayId || gatewayRef.current;\n if (!gateway || !state.walletAddress) {\n const missing = [!gateway && 'gateway', !state.walletAddress && 'walletAddress'].filter(Boolean).join(', ');\n dispatch({ type: 'SET_ERROR', message: `Missing required fields: ${missing}` });\n return;\n }\n\n try {\n await createOrderApi({\n gateway,\n customerId: state.customerId || undefined,\n fiatCurrency: state.fiatCurrency,\n ...(isSell\n ? { cryptoAmount: state.cryptoAmount }\n : { fiatAmount: state.fiatAmount }\n ),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n walletAddress: state.walletAddress,\n paymentMethodId: state.paymentMethodId || undefined,\n email: state.email || undefined,\n orderType: state.flowType,\n ...(brandIdRef.current ? { metadata: { brand: brandIdRef.current } } : {}),\n });\n\n // Move to checkout step\n dispatch({ type: 'SET_STEP', step: 'checkout' });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n // Wallet address validation errors stay inline instead of going to error screen\n if (/wallet|address/i.test(message)) {\n dispatch({ type: 'SET_WALLET_ERROR', message: message.replace(/^Failed to create checkout intent:\\s*/i, '') });\n } else {\n dispatch({ type: 'SET_ERROR', message });\n }\n }\n }, [state, createOrderApi, isSell]);\n\n // Navigation helpers\n const goToStep = useCallback((step: RampStep) => {\n dispatch({ type: 'SET_STEP', step });\n }, []);\n\n const goBack = useCallback(() => {\n const stepOrder: RampStep[] = ['confirm', 'amount', 'quotes', 'wallet', 'checkout', 'processing', 'complete'];\n const currentIndex = stepOrder.indexOf(state.step);\n if (currentIndex > 0) {\n dispatch({ type: 'SET_STEP', step: stepOrder[currentIndex - 1] });\n }\n }, [state.step, isSell]);\n\n // Check if user can proceed to next step\n const canProceed = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n switch (state.step) {\n case 'confirm':\n return !!(hasAmount && state.cryptoCurrency && state.network && state.walletAddress && !amountError);\n case 'amount':\n return !!(hasAmount && state.cryptoCurrency && state.network && !amountError);\n case 'quotes':\n return !!state.selectedQuote;\n case 'wallet':\n return !!state.walletAddress;\n default:\n return false;\n }\n }, [state, amountError, isSell]);\n\n const value: RampContextValue = {\n apiConfig,\n assetBaseUrl,\n config,\n configLoading,\n configError,\n state,\n dispatch,\n quotes,\n quotesLoading,\n quotesError,\n fetchQuotes,\n order,\n orderLoading,\n orderError,\n createOrder,\n orderStatus,\n orderStatusLoading,\n fieldLocks: fieldLocks || null,\n defaultGateway: effectiveDefaultGateway,\n availableFiats,\n availableCryptos,\n availablePaymentMethods,\n selectionUnsupported,\n amountError,\n goToStep,\n goBack,\n canProceed,\n };\n\n return (\n <RampContext.Provider value={value}>\n {children}\n </RampContext.Provider>\n );\n}\n\n/**\n * Hook to access ramp context\n */\nexport function useRamp(): RampContextValue {\n const context = useContext(RampContext);\n if (!context) {\n throw new Error('useRamp must be used within a RampProvider');\n }\n return context;\n}\n","/**\n * Complete Banxa-supported cryptocurrencies and blockchains data.\n * TypeScript conversion of the crypto data module.\n * Icons are stored locally in /crypto-icons/{ticker}.svg\n */\n\n// ── TypeScript interfaces ──\n\nexport interface BlockchainInfo {\n name: string;\n shortName?: string;\n icon: string;\n}\n\nexport interface CryptoCurrency {\n code: string;\n name: string;\n chains: string[];\n popular: boolean;\n}\n\nexport interface FiatCurrency {\n code: string;\n name: string;\n}\n\nexport interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport interface CryptoChainCombo {\n code: string;\n name: string;\n chain: string;\n /** Display name from provider (e.g. \"Ethereum Mainnet\") */\n chainName?: string;\n popular: boolean;\n}\n\n// ── Blockchain / Network definitions ──\n// Maps blockchain codes to display names and their icon ticker\n\nexport const BLOCKCHAINS: Record<string, BlockchainInfo> = {\n // Canonical IDs (returned by the API — lowercase full names)\n // These cover cases where the canonical ID differs from the legacy uppercase key\n ethereum: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n bitcoin: { name: 'Bitcoin', icon: 'btc' },\n solana: { name: 'Solana', icon: 'sol' },\n polygon: { name: 'Polygon', icon: 'pol' },\n arbitrum: { name: 'Arbitrum', icon: 'arb' },\n avalanche: { name: 'Avalanche C-Chain', shortName: 'Avalanche', icon: 'avax' },\n litecoin: { name: 'Litecoin', icon: 'ltc' },\n tezos: { name: 'Tezos', icon: 'xtz' },\n sei: { name: 'SEI', icon: 'sei' },\n imx: { name: 'Immutable X', shortName: 'Immutable', icon: 'imx' },\n galachain: { name: 'Gala', icon: 'gala' },\n zksync2: { name: 'zkSync Era', shortName: 'zkSync', icon: 'zksync' },\n zks: { name: 'zkSpace', icon: 'zks' },\n 'flow-evm': { name: 'Flow (EVM)', shortName: 'Flow', icon: 'flow' },\n vara: { name: 'Vara', icon: 'vara' },\n venom: { name: 'Venom', icon: 'venom' },\n hsk: { name: 'HashKey Chain', shortName: 'HashKey', icon: 'hsk' },\n mck: { name: 'MCK', icon: 'mck' },\n peer: { name: 'Peer', icon: 'peer' },\n // Testnets (fallback display names)\n goerli: { name: 'Goerli Testnet', shortName: 'Goerli', icon: 'eth' },\n hbartestnet: { name: 'Hedera Testnet', shortName: 'Hedera', icon: 'hbar' },\n arbitrumrinkeby: { name: 'Arbitrum Testnet', shortName: 'Arbitrum', icon: 'arb' },\n dydxtestnet: { name: 'dYdX Testnet', shortName: 'dYdX', icon: 'stark' },\n 'zksync-rinkeby': { name: 'zkSync Testnet', shortName: 'zkSync', icon: 'zksync' },\n\n // Legacy uppercase keys (used by local crypto data and older integrations)\n ETH: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n BSC: { name: 'Binance Smart Chain (BEP20)', shortName: 'Binance', icon: 'bnb' },\n BTC: { name: 'Bitcoin', icon: 'btc' },\n SOL: { name: 'Solana', icon: 'sol' },\n MATIC: { name: 'Polygon', icon: 'pol' },\n ARB: { name: 'Arbitrum', icon: 'arb' },\n BASE: { name: 'Base', icon: 'base' },\n OPTIMISM: { name: 'Optimism', icon: 'op' },\n AVAX_C: { name: 'Avalanche C-Chain', shortName: 'Avalanche C', icon: 'avax' },\n AVAX_X: { name: 'Avalanche X-Chain', shortName: 'Avalanche X', icon: 'avax' },\n ADA: { name: 'Cardano', icon: 'ada' },\n DOT: { name: 'Polkadot', icon: 'dot' },\n TRON: { name: 'Tron (TRC20)', shortName: 'Tron', icon: 'trx' },\n XRP: { name: 'Ripple', icon: 'xrp' },\n XLM: { name: 'Stellar', icon: 'xlm' },\n ALGO: { name: 'Algorand', icon: 'algo' },\n ATOM: { name: 'Cosmos', icon: 'atom' },\n NEAR: { name: 'NEAR Protocol', shortName: 'NEAR', icon: 'near' },\n SUI: { name: 'Sui', icon: 'sui' },\n APT: { name: 'Aptos', icon: 'apt' },\n TON: { name: 'Ton', icon: 'ton' },\n FIL: { name: 'Filecoin', icon: 'fil' },\n FLOW: { name: 'Flow', icon: 'flow' },\n HBAR: { name: 'Hedera Hashgraph', shortName: 'Hedera', icon: 'hbar' },\n INJ: { name: 'Injective', icon: 'inj' },\n SEI_EVM: { name: 'SEI (EVM)', shortName: 'SEI', icon: 'sei' },\n ZKSYNC: { name: 'zkSync', icon: 'zksync' },\n LINEA: { name: 'Linea', icon: 'linea' },\n STARK: { name: 'StarkNet', icon: 'strk' },\n LN: { name: 'Lightning', icon: 'btc' },\n CELO: { name: 'Celo', icon: 'celo' },\n CRO: { name: 'Cronos', icon: 'cro' },\n FTM: { name: 'Fantom', icon: 'ftm' },\n GLMR: { name: 'Moonbeam', icon: 'glmr' },\n MOVR: { name: 'Moonriver', icon: 'movr' },\n KSM: { name: 'Kusama', icon: 'ksm' },\n EOS: { name: 'EOS', icon: 'eos' },\n ETC: { name: 'Ethereum Classic', shortName: 'ETH Classic', icon: 'etc' },\n LTC: { name: 'Litecoin', icon: 'ltc' },\n BCH: { name: 'Bitcoin Cash', shortName: 'BTC Cash', icon: 'bch' },\n DOGE: { name: 'Dogecoin', icon: 'doge' },\n BNB: { name: 'Binance Chain (BEP2)', shortName: 'Binance', icon: 'bnb' },\n ONE: { name: 'Harmony', icon: 'one' },\n KLAY: { name: 'Kaia', icon: 'kaia' },\n RON: { name: 'Ronin', icon: 'ron' },\n LRC: { name: 'Loopring', icon: 'lrc' },\n ICP: { name: 'Internet Computer', shortName: 'ICP', icon: 'icp' },\n EGLD: { name: 'MultiversX', icon: 'egld' },\n FLUX: { name: 'Flux', icon: 'flux' },\n KDA: { name: 'Kadena', icon: 'kda' },\n WAVES: { name: 'Waves', icon: 'waves' },\n XTZ: { name: 'Tezos', icon: 'xtz' },\n ACA: { name: 'Acala', icon: 'aca' },\n ALEO: { name: 'Aleo', icon: 'aleo' },\n ALPH: { name: 'Alephium', icon: 'alph' },\n APE: { name: 'ApeChain', icon: 'ape' },\n ASTR: { name: 'Astar', icon: 'astr' },\n AZERO: { name: 'Aleph Zero', icon: 'azero' },\n AZERO_EVM: { name: 'Aleph Zero EVM', shortName: 'Aleph Zero', icon: 'azero' },\n BAJU: { name: 'Bajun Network', shortName: 'Bajun', icon: 'baju' },\n BNCPOLKA: { name: 'Bifrost Polkadot', shortName: 'Bifrost', icon: 'bnc' },\n BNC: { name: 'Bifrost Kusama', shortName: 'Bifrost', icon: 'bnc' },\n BOBA: { name: 'Boba Network', shortName: 'Boba', icon: 'boba' },\n BSX: { name: 'Basilisk', icon: 'bsx' },\n CHZ: { name: 'Chiliz', icon: 'chz' },\n VIC: { name: 'Viction', icon: 'vic' },\n CCD: { name: 'Concordium', icon: 'ccd' },\n COREUM: { name: 'Coreum', icon: 'coreum' },\n DINGO: { name: 'Dingocoin', icon: 'dingo' },\n HDX: { name: 'Hydration', icon: 'hdx' },\n PLMC: { name: 'Polimec', icon: 'plmc' },\n MNT: { name: 'Mantle', icon: 'mnt' },\n ERG: { name: 'Ergo', icon: 'erg' },\n ECLIPSE: { name: 'Eclipse', icon: 'eclipse' },\n FUEL: { name: 'Fuel Ignition', shortName: 'Fuel', icon: 'fuel' },\n INK: { name: 'Ink', icon: 'ink' },\n SOPHON: { name: 'Sophon', icon: 'sophon' },\n UNICHAIN: { name: 'Unichain', icon: 'unichain' },\n WLD: { name: 'Worldchain', icon: 'wld' },\n ETHERLINK: { name: 'Etherlink', icon: 'etherlink' },\n MOB: { name: 'MobileCoin', icon: 'mob' },\n GALA: { name: 'Gala', icon: 'gala' },\n GUNZ: { name: 'Gunz', icon: 'gun' },\n HNT: { name: 'Helium', icon: 'hnt' },\n BITKUB: { name: 'BitKub', icon: 'kub' },\n IMMUTABLE_ZKEVM: { name: 'Immutable-zkEVM', shortName: 'Immutable', icon: 'imx' },\n INIT: { name: 'Initia', icon: 'init' },\n INTR: { name: 'Interlay', icon: 'intr' },\n KINESIS: { name: 'Kinesis', icon: 'kag' },\n KAR: { name: 'Karura', icon: 'kar' },\n KCC: { name: 'KuCoin Community Chain', shortName: 'KuCoin', icon: 'kcs' },\n KILT: { name: 'KILT Spiritnet', shortName: 'KILT', icon: 'kilt' },\n KINT: { name: 'Kintsugi', icon: 'kint' },\n KMD: { name: 'Komodo', icon: 'kmd' },\n LSK: { name: 'Lisk', icon: 'lsk' },\n METIS: { name: 'Metis Andromeda', shortName: 'Metis', icon: 'metis' },\n MYTH: { name: 'Myth', icon: 'myth' },\n OAS: { name: 'Oasys', icon: 'oas' },\n PEAQ_EVM: { name: 'Peaq (EVM)', shortName: 'Peaq', icon: 'peaq' },\n PEN: { name: 'Pendulum', icon: 'pen' },\n PI: { name: 'Pi', icon: 'pi' },\n POLYX: { name: 'Polymesh', icon: 'polyx' },\n Q: { name: 'QuantumCoin', icon: 'q' },\n QRL: { name: 'Quantum Resistant Ledger', shortName: 'QRL', icon: 'qrl' },\n QUBIC: { name: 'Qubic', icon: 'qubic' },\n RBX: { name: 'ReserveBlock', icon: 'rbx' },\n ROLLUX: { name: 'Rollux', icon: 'rollux' },\n THORCHAIN: { name: 'Thorchain', icon: 'rune' },\n S: { name: 'Sonic', icon: 's' },\n SONIC: { name: 'Sonic', icon: 's' },\n TERNOA: { name: 'Ternoa', icon: 'caps' },\n SX: { name: 'SX Network', icon: 'sol' },\n WAX: { name: 'WAX', icon: 'waxp' },\n XCH: { name: 'Chia Chain', icon: 'xch' },\n XPRT: { name: 'Persistence', icon: 'xprt' },\n ZETACHAIN: { name: 'ZetaChain', icon: 'zeta' },\n ZTG: { name: 'Zeitgeist', icon: 'ztg' },\n PLS: { name: 'Pulsechain', icon: 'pulsechain' },\n MEZO: { name: 'Mezo', icon: 'mezo' },\n BSV: { name: 'Bitcoin SV', shortName: 'BTC SV', icon: 'btc' },\n MONAD: { name: 'Monad', icon: 'mon' },\n SUPRA: { name: 'Supra', icon: 'supra' },\n SOMI: { name: 'Somnia', icon: 'somi' },\n VERIFIEDX: { name: 'VerifiedX', icon: 'vfx' },\n MOVE: { name: 'Movement', icon: 'move' },\n FLR: { name: 'Flare', icon: 'flr' },\n ASSETHUB: { name: 'Asset Hub Polkadot', shortName: 'Asset Hub', icon: 'dot' },\n BOB: { name: 'BOB', icon: 'btc' },\n GLUE: { name: 'Glue', icon: 'eth' },\n DYDX: { name: 'StarkEx', icon: 'stark' },\n OKC: { name: 'OKX Chain', icon: 'eth' },\n UNI_CHAIN: { name: 'UNI', icon: 'uni' },\n ZEC: { name: 'ZCash', icon: 'zec' },\n};\n\n// ── Full Banxa-supported cryptocurrencies ──\n// Each entry: { code, name, chains[], popular }\n// chains[] lists the blockchain codes this crypto is available on\n\nexport const CRYPTO_CURRENCIES: CryptoCurrency[] = [\n // --- Popular / Top coins ---\n { code: 'BTC', name: 'Bitcoin', chains: ['BTC', 'LN'], popular: true },\n { code: 'ETH', name: 'Ethereum', chains: ['ETH', 'ARB', 'BASE', 'BSC', 'OPTIMISM', 'LINEA', 'ZKSYNC', 'LRC', 'STARK', 'APE', 'ECLIPSE', 'FUEL', 'INK', 'SOPHON', 'UNICHAIN', 'WLD'], popular: true },\n { code: 'USDC', name: 'USD Coin', chains: ['ETH', 'SOL', 'ARB', 'BASE', 'BSC', 'MATIC', 'OPTIMISM', 'AVAX_C', 'ALGO', 'APT', 'CELO', 'FLOW', 'HBAR', 'LINEA', 'LRC', 'ZKSYNC', 'STARK', 'SUI', 'XLM', 'ECLIPSE', 'HDX', 'INK', 'LSK', 'METIS', 'MONAD', 'SEI_EVM', 'SONIC', 'SOPHON', 'SX', 'UNICHAIN', 'APE', 'BNCPOLKA', 'GLMR', 'PEAQ_EVM', 'PLMC', 'RON', 'UNI_CHAIN', 'WLD', 'BITKUB', 'BOB', 'DYDX', 'ETHERLINK', 'GLUE', 'ASSETHUB'], popular: true },\n { code: 'USDT', name: 'Tether', chains: ['ETH', 'BSC', 'TRON', 'ARB', 'MATIC', 'AVAX_C', 'SOL', 'OPTIMISM', 'ZKSYNC', 'STARK', 'APT', 'CELO', 'KLAY', 'LRC', 'LSK', 'ECLIPSE', 'ETHERLINK', 'OKC', 'PEAQ_EVM', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC', 'VIC', 'ASSETHUB'], popular: true },\n { code: 'SOL', name: 'Solana', chains: ['SOL'], popular: true },\n { code: 'XRP', name: 'Ripple', chains: ['XRP'], popular: true },\n { code: 'ADA', name: 'Cardano', chains: ['ADA'], popular: true },\n { code: 'DOGE', name: 'Dogecoin', chains: ['DOGE'], popular: true },\n { code: 'DOT', name: 'Polkadot', chains: ['DOT', 'BSC', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC'], popular: true },\n { code: 'AVAX', name: 'Avalanche', chains: ['AVAX_C', 'AVAX_X', 'BSC'], popular: true },\n { code: 'LINK', name: 'ChainLink', chains: ['ETH', 'BSC'], popular: true },\n { code: 'LTC', name: 'Litecoin', chains: ['LTC'], popular: true },\n\n // --- Major altcoins ---\n { code: 'AAVE', name: 'Aave', chains: ['ETH', 'BSC'], popular: false },\n { code: 'ACA', name: 'Acala', chains: ['ACA'], popular: false },\n { code: 'ALEO', name: 'Aleo', chains: ['ALEO'], popular: false },\n { code: 'ALGO', name: 'Algorand', chains: ['ALGO'], popular: false },\n { code: 'ALPH', name: 'Alephium', chains: ['ALPH'], popular: false },\n { code: 'APE', name: 'ApeCoin', chains: ['APE', 'ETH'], popular: false },\n { code: 'APT', name: 'Aptos', chains: ['APT'], popular: false },\n { code: 'ARB', name: 'Arbitrum', chains: ['ARB'], popular: false },\n { code: 'ASTR', name: 'Astar', chains: ['ASTR'], popular: false },\n { code: 'ATOM', name: 'Cosmos', chains: ['ATOM'], popular: false },\n { code: 'AUDD', name: 'Novatti Australian Digital Dollar', chains: ['ETH'], popular: false },\n { code: 'AVT', name: 'Aventus', chains: ['ETH'], popular: false },\n { code: 'AXS', name: 'Axie Infinity', chains: ['ETH', 'RON'], popular: false },\n { code: 'AZERO', name: 'Aleph Zero', chains: ['AZERO', 'AZERO_EVM'], popular: false },\n { code: 'BAJU', name: 'Bajun Network', chains: ['BAJU'], popular: false },\n { code: 'BARSIK', name: \"Hasbulla's Cat\", chains: ['SOL'], popular: false },\n { code: 'BAT', name: 'Basic Attention Token', chains: ['ETH', 'BSC'], popular: false },\n { code: 'BCH', name: 'Bitcoin Cash', chains: ['BCH'], popular: false },\n { code: 'BNB', name: 'Binance Coin', chains: ['BNB', 'BSC'], popular: false },\n { code: 'BNC', name: 'Bifrost Native Coin', chains: ['BNC', 'BNCPOLKA'], popular: false },\n { code: 'BOBA', name: 'Boba Network', chains: ['BOBA', 'ETH'], popular: false },\n { code: 'BORA', name: 'Bora', chains: ['KLAY'], popular: false },\n { code: 'BRETT', name: 'Brett', chains: ['BASE'], popular: false },\n { code: 'BSX', name: 'Basilisk', chains: ['BSX'], popular: false },\n { code: 'BZR', name: 'Bazaars', chains: ['ETH'], popular: false },\n { code: 'CAGA', name: 'Crypto Asset Governance Alliance', chains: ['ETH'], popular: false },\n { code: 'CAKE', name: 'PancakeSwap', chains: ['BSC'], popular: false },\n { code: 'CAPS', name: 'Caps', chains: ['TERNOA'], popular: false },\n { code: 'CELO', name: 'Celo', chains: ['CELO'], popular: false },\n { code: 'CHZ', name: 'Chiliz', chains: ['CHZ', 'BNB', 'ETH'], popular: false },\n { code: 'C98', name: 'Coin98', chains: ['VIC'], popular: false },\n { code: 'CCD', name: 'Concordium', chains: ['CCD'], popular: false },\n { code: 'COMP', name: 'Compound', chains: ['ETH', 'BSC'], popular: false },\n { code: 'COREUM', name: 'Coreum', chains: ['COREUM', 'XRP'], popular: false },\n { code: 'CRO', name: 'Cronos', chains: ['CRO'], popular: false },\n { code: 'CUSD', name: 'Celo Dollar', chains: ['CELO'], popular: false },\n { code: 'CVC', name: 'Civic', chains: ['ETH'], popular: false },\n { code: 'DAI', name: 'Dai', chains: ['ETH', 'BASE', 'MATIC'], popular: false },\n { code: 'DINGO', name: 'Dingocoin', chains: ['DINGO'], popular: false },\n { code: 'EGLD', name: 'MultiversX', chains: ['EGLD'], popular: false },\n { code: 'EMBER', name: 'Ember Sword', chains: ['MNT'], popular: false },\n { code: 'EOS', name: 'EOS', chains: ['EOS'], popular: false },\n { code: 'ERG', name: 'Ergo', chains: ['ERG'], popular: false },\n { code: 'ETC', name: 'Ethereum Classic', chains: ['ETC', 'BSC'], popular: false },\n { code: 'EUR', name: 'EURC', chains: ['BASE'], popular: false },\n { code: 'EUROC', name: 'Euro Coin', chains: ['ETH'], popular: false },\n { code: 'EURQ', name: 'Quantoz EURQ', chains: ['ETH'], popular: false },\n { code: 'EURR', name: 'StablR EUR', chains: ['ETH'], popular: false },\n { code: 'EUSD', name: 'Electronic USD', chains: ['MOB'], popular: false },\n { code: 'EXIT', name: 'EXIT - Designer Token', chains: ['BSC'], popular: false },\n { code: 'FDUSD', name: 'First Digital USD', chains: ['SUI'], popular: false },\n { code: 'FIL', name: 'Filecoin', chains: ['FIL', 'BSC'], popular: false },\n { code: 'FLOW', name: 'Flow', chains: ['FLOW'], popular: false },\n { code: 'FLR', name: 'Flare', chains: ['FLR'], popular: false },\n { code: 'FLUX', name: 'Flux', chains: ['FLUX'], popular: false },\n { code: 'FTM', name: 'Fantom', chains: ['FTM', 'ETH', 'BSC'], popular: false },\n { code: 'GALA', name: 'Gala', chains: ['GALA'], popular: false },\n { code: 'GLMR', name: 'Moonbeam', chains: ['GLMR'], popular: false },\n { code: 'GMX', name: 'GMX', chains: ['ARB'], popular: false },\n { code: 'GNUS', name: 'Genius AI', chains: ['ETH'], popular: false },\n { code: 'GRT', name: 'The Graph', chains: ['ETH', 'ARB'], popular: false },\n { code: 'GUN', name: 'Gunz', chains: ['GUNZ'], popular: false },\n { code: 'HBAR', name: 'Hedera', chains: ['HBAR'], popular: false },\n { code: 'HDX', name: 'HydraDX', chains: ['HDX'], popular: false },\n { code: 'HNT', name: 'Helium', chains: ['HNT'], popular: false },\n { code: 'HTP', name: 'HowToPay', chains: ['BSC'], popular: false },\n { code: 'HVLO', name: 'Hivello', chains: ['SOL'], popular: false },\n { code: 'ICP', name: 'Internet Computer', chains: ['ICP'], popular: false },\n { code: 'IMX', name: 'Immutable X', chains: ['ETH'], popular: false },\n { code: 'INIT', name: 'Initia', chains: ['INIT'], popular: false },\n { code: 'INJ', name: 'Injective', chains: ['INJ'], popular: false },\n { code: 'INTR', name: 'Interlay', chains: ['INTR'], popular: false },\n { code: 'JAM', name: 'Jam Tune.FM', chains: ['HBAR'], popular: false },\n { code: 'KAG', name: 'Silver', chains: ['KINESIS'], popular: false },\n { code: 'KAIA', name: 'Kaia', chains: ['KLAY'], popular: false },\n { code: 'KAR', name: 'Karura', chains: ['KAR'], popular: false },\n { code: 'KAU', name: 'Gold', chains: ['KINESIS'], popular: false },\n { code: 'KCS', name: 'KuCoin Token', chains: ['ETH', 'KCC'], popular: false },\n { code: 'KDA', name: 'Kadena', chains: ['KDA'], popular: false },\n { code: 'KILT', name: 'KILT', chains: ['KILT'], popular: false },\n { code: 'KINT', name: 'Kintsugi', chains: ['KINT'], popular: false },\n { code: 'KLV', name: 'Klever', chains: ['TRON'], popular: false },\n { code: 'KMD', name: 'Komodo', chains: ['KMD'], popular: false },\n { code: 'KSM', name: 'Kusama', chains: ['KSM'], popular: false },\n { code: 'KUB', name: 'Bitkub Coin', chains: ['BITKUB'], popular: false },\n { code: 'LOOKS', name: 'LooksRare', chains: ['ETH'], popular: false },\n { code: 'LRC', name: 'Loopring', chains: ['ETH', 'LRC'], popular: false },\n { code: 'LSK', name: 'Lisk', chains: ['LSK'], popular: false },\n { code: 'MANA', name: 'Decentraland', chains: ['ETH'], popular: false },\n { code: 'MBX', name: 'Marblex', chains: ['IMMUTABLE_ZKEVM', 'KLAY'], popular: false },\n { code: 'MELANIA', name: 'Melania', chains: ['SOL'], popular: false },\n { code: 'METAMASKUSD', name: 'Metamask USD', chains: ['ETH', 'LINEA'], popular: false },\n { code: 'METIS', name: 'Metis', chains: ['METIS'], popular: false },\n { code: 'MEZOUSD', name: 'MUSD', chains: ['ETH', 'MEZO'], popular: false },\n { code: 'MKR', name: 'Maker', chains: ['ETH', 'BSC'], popular: false },\n { code: 'MNEE', name: 'MNEE', chains: ['BSV', 'ETH'], popular: false },\n { code: 'MNT', name: 'Mantle', chains: ['ETH', 'MNT'], popular: false },\n { code: 'MOB', name: 'MobileCoin', chains: ['MOB'], popular: false },\n { code: 'MON', name: 'Monad', chains: ['MONAD'], popular: false },\n { code: 'MOVE', name: 'Movement', chains: ['MOVE'], popular: false },\n { code: 'MOVR', name: 'Moonriver', chains: ['MOVR'], popular: false },\n { code: 'MYTH', name: 'Myth', chains: ['MYTH'], popular: false },\n { code: 'NEAR', name: 'NEAR Protocol', chains: ['NEAR', 'BSC'], popular: false },\n { code: 'NEIRO', name: 'NEIRO Ethereum', chains: ['ETH'], popular: false },\n { code: 'OAS', name: 'Oasys', chains: ['OAS'], popular: false },\n { code: 'OMG', name: 'OmiseGo', chains: ['ETH'], popular: false },\n { code: 'OMUSD', name: 'Open Money USD', chains: ['ETH'], popular: false },\n { code: 'ONE', name: 'Harmony', chains: ['ONE', 'BNB', 'ETH'], popular: false },\n { code: 'OP', name: 'Optimism', chains: ['OPTIMISM'], popular: false },\n { code: 'ORDER', name: 'Orderly Network', chains: ['ETH'], popular: false },\n { code: 'PEAQ', name: 'Peaq', chains: ['PEAQ_EVM'], popular: false },\n { code: 'PEN', name: 'Pendulum', chains: ['PEN'], popular: false },\n { code: 'PERC', name: 'Perion', chains: ['ETH'], popular: false },\n { code: 'PI', name: 'Pi', chains: ['PI'], popular: false },\n { code: 'PLMC', name: 'Polimec', chains: ['PLMC'], popular: false },\n { code: 'POL', name: 'Polygon', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'POLYX', name: 'Polymesh', chains: ['POLYX'], popular: false },\n { code: 'PROPC', name: 'Propchain', chains: ['ETH'], popular: false },\n { code: 'PSTAKE', name: 'pSTAKE Finance', chains: ['ETH'], popular: false },\n { code: 'Q', name: 'QuantumCoin', chains: ['Q'], popular: false },\n { code: 'QRDO', name: 'Qredo', chains: ['ETH'], popular: false },\n { code: 'QRL', name: 'Quantum Resistant Ledger', chains: ['QRL'], popular: false },\n { code: 'QUBIC', name: 'QUBIC', chains: ['QUBIC'], popular: false },\n { code: 'RBX', name: 'ReserveBlock', chains: ['RBX'], popular: false },\n { code: 'REVU', name: 'Revuto', chains: ['ADA'], popular: false },\n { code: 'RITE', name: 'Ritestream', chains: ['BSC'], popular: false },\n { code: 'RLUSD', name: 'Ripple USD', chains: ['ETH'], popular: false },\n { code: 'RON', name: 'Ronin', chains: ['RON'], popular: false },\n { code: 'RUNE', name: 'THORChain', chains: ['THORCHAIN'], popular: false },\n { code: 'S', name: 'Sonic', chains: ['S'], popular: false },\n { code: 'SAND', name: 'The Sandbox', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SEI', name: 'SEI', chains: ['SEI_EVM'], popular: false },\n { code: 'SNX', name: 'Synthetix', chains: ['ETH'], popular: false },\n { code: 'SOIL', name: 'Sun Minimeal', chains: ['PLS'], popular: false },\n { code: 'SOLO', name: 'Sologenic', chains: ['XRP'], popular: false },\n { code: 'SOMI', name: 'Somnia', chains: ['SOMI'], popular: false },\n { code: 'STRK', name: 'Starknet', chains: ['STARK'], popular: false },\n { code: 'SUI', name: 'Sui', chains: ['SUI'], popular: false },\n { code: 'SUPR', name: 'SuperDapp', chains: ['ROLLUX'], popular: false },\n { code: 'SUPRA', name: 'Supra', chains: ['SUPRA'], popular: false },\n { code: 'SUSHI', name: 'SushiSwap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SYS', name: 'Syscoin', chains: ['ROLLUX'], popular: false },\n { code: 'TBTC', name: 'tBTC', chains: ['SUI', 'STARK'], popular: false },\n { code: 'TON', name: 'Toncoin', chains: ['TON'], popular: false },\n { code: 'TRUMP', name: 'TRUMP', chains: ['SOL'], popular: false },\n { code: 'TRX', name: 'Tron', chains: ['TRON', 'BSC'], popular: false },\n { code: 'TWT', name: 'Trust Wallet Token', chains: ['BSC'], popular: false },\n { code: 'UNI', name: 'Uniswap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'URANIUM', name: 'Uranium', chains: ['ETHERLINK'], popular: false },\n { code: 'USD0', name: 'Usual USD', chains: ['ETH'], popular: false },\n { code: 'USD1', name: 'World Liberty Financial USD', chains: ['SOL'], popular: false },\n { code: 'USDE', name: 'Ethena USDe', chains: ['ETH'], popular: false },\n { code: 'USDP', name: 'Pax Dollar', chains: ['ETH'], popular: false },\n { code: 'USDQ', name: 'Quantoz USDQ', chains: ['ETH'], popular: false },\n { code: 'USDR', name: 'StablR USD', chains: ['ETH'], popular: false },\n { code: 'USDT0', name: 'USDT0', chains: ['INK'], popular: false },\n { code: 'VFX', name: 'VerifiedX', chains: ['VERIFIEDX'], popular: false },\n { code: 'VERSE', name: 'Verse', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'VIC', name: 'Viction', chains: ['VIC'], popular: false },\n { code: 'WAL', name: 'Walrus', chains: ['SUI'], popular: false },\n { code: 'WAVES', name: 'Waves', chains: ['WAVES'], popular: false },\n { code: 'WAXP', name: 'WAX', chains: ['WAX'], popular: false },\n { code: 'WBTC', name: 'Wrapped Bitcoin', chains: ['ETH', 'STARK'], popular: false },\n { code: 'WETH', name: 'Wrapped Ether', chains: ['ETHERLINK'], popular: false },\n { code: 'WLD', name: 'Worldcoin', chains: ['WLD'], popular: false },\n { code: 'WLFI', name: 'World Liberty Financial', chains: ['ETH'], popular: false },\n { code: 'WOLF', name: 'LandWolf', chains: ['ETH'], popular: false },\n { code: 'WOMBAT', name: 'Wombat', chains: ['MATIC'], popular: false },\n { code: 'XCH', name: 'Chia', chains: ['XCH'], popular: false },\n { code: 'XLM', name: 'Stellar Lumens', chains: ['XLM', 'BSC'], popular: false },\n { code: 'XPRT', name: 'Persistence', chains: ['XPRT'], popular: false },\n { code: 'XTZ', name: 'Tezos', chains: ['XTZ', 'ETHERLINK'], popular: false },\n { code: 'YFI', name: 'yearn.finance', chains: ['ETH'], popular: false },\n { code: 'ZBU', name: 'Zeebu', chains: ['BSC'], popular: false },\n { code: 'ZEC', name: 'ZCash', chains: ['ZEC'], popular: false },\n { code: 'ZCHF', name: 'Frankencoin', chains: ['ETH'], popular: false },\n { code: 'ZETA', name: 'Zeta', chains: ['ETH', 'ZETACHAIN'], popular: false },\n { code: 'ZTG', name: 'Zeitgeist', chains: ['ZTG'], popular: false },\n];\n\n// ── Crypto code -> name lookup (for API data that only has codes) ──\nexport const CRYPTO_NAMES: Record<string, string> = Object.fromEntries(\n CRYPTO_CURRENCIES.map(c => [c.code, c.name])\n);\n\n// ── Fiat currency code -> ISO country code for flag lookup ──\n\nexport const FIAT_TO_COUNTRY: Record<string, string> = {\n AED: 'ae',\n ALL: 'al',\n ARS: 'ar',\n AUD: 'au',\n BRL: 'br',\n CAD: 'ca',\n CHF: 'ch',\n CLP: 'cl',\n CZK: 'cz',\n DKK: 'dk',\n EUR: 'eu',\n GBP: 'gb',\n HKD: 'hk',\n IDR: 'id',\n INR: 'in',\n JPY: 'jp',\n KRW: 'kr',\n MXN: 'mx',\n NGN: 'ng',\n NOK: 'no',\n NZD: 'nz',\n PHP: 'ph',\n PLN: 'pl',\n QAR: 'qa',\n SAR: 'sa',\n SEK: 'se',\n SGD: 'sg',\n THB: 'th',\n TRY: 'tr',\n TWD: 'tw',\n USD: 'us',\n VND: 'vn',\n ZAR: 'za',\n};\n\n// ── Icon URL helpers ──\n\n/**\n * Get the icon URL for a crypto ticker.\n * Icons are stored as SVGs in /crypto-icons/{ticker}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getCryptoIconUrl(ticker: string, baseUrl = ''): string {\n return `${baseUrl}/crypto-icons/${ticker.toLowerCase()}.svg`;\n}\n\n/**\n * Get the flag URL for a fiat currency code.\n * Flags are stored as SVGs in /flags/{country_code}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getFiatFlagUrl(currencyCode: string, baseUrl = ''): string {\n const country = FIAT_TO_COUNTRY[currencyCode] || 'us';\n return `${baseUrl}/flags/${country}.svg`;\n}\n\n/**\n * Get the icon URL for a blockchain/chain.\n * Uses the chain's native token icon.\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\n/** Lookup a chain in BLOCKCHAINS, handling canonical ids, legacy codes, and separator differences */\nexport function getChainInfo(chainCode: string): BlockchainInfo | undefined {\n return BLOCKCHAINS[chainCode]\n || BLOCKCHAINS[chainCode.toLowerCase()]\n || BLOCKCHAINS[chainCode.toUpperCase()]\n || BLOCKCHAINS[chainCode.toUpperCase().replace(/-/g, '_')]\n || BLOCKCHAINS[chainCode.toLowerCase().replace(/-/g, '_')];\n}\n\nexport function getChainIconUrl(chainCode: string, baseUrl = ''): string {\n const chain = getChainInfo(chainCode);\n if (chain) return `${baseUrl}/crypto-icons/${chain.icon}.svg`;\n return `${baseUrl}/crypto-icons/${chainCode.toLowerCase()}.svg`;\n}\n\n// ── Fiat currencies ──\n\nexport const FIAT_CURRENCIES: FiatCurrency[] = [\n { code: 'ALL', name: 'Albania Lek' },\n { code: 'ARS', name: 'Argentina Peso' },\n { code: 'AUD', name: 'Australian Dollar' },\n { code: 'BRL', name: 'Brazilian Real' },\n { code: 'CAD', name: 'Canadian Dollar' },\n { code: 'EUR', name: 'Euro' },\n { code: 'GBP', name: 'British Pound' },\n { code: 'JPY', name: 'Japanese Yen' },\n { code: 'USD', name: 'US Dollar' },\n { code: 'CHF', name: 'Swiss Franc' },\n { code: 'MXN', name: 'Mexican Peso' },\n { code: 'INR', name: 'Indian Rupee' },\n];\n\n// ── Skin presets ──\n\nexport const SKINS: Skin[] = [\n { id: 'blue', name: 'Blue', accent: '#0077FF' },\n { id: 'violet', name: 'Violet', accent: '#7C3AED' },\n { id: 'green', name: 'Green', accent: '#10B981' },\n { id: 'orange', name: 'Orange', accent: '#F59E0B' },\n { id: 'rose', name: 'Rose', accent: '#F43F5E' },\n { id: 'mono', name: 'Mono', accent: null },\n];\n\n// ── Mock rates ──\n\nexport const MOCK_RATES: Record<string, Record<string, number>> = {\n USDC: { USD: 0.9962, EUR: 1.0814, GBP: 1.2573, JPY: 0.00667, CAD: 0.7198, AUD: 0.6384, BRL: 0.1726, CHF: 1.1306, MXN: 0.0487, INR: 0.01187, ARS: 0.000855, ALL: 0.01058 },\n USDT: { USD: 0.9958, EUR: 1.0810, GBP: 1.2568, JPY: 0.00666, CAD: 0.7194, AUD: 0.6380, BRL: 0.1724, CHF: 1.1301, MXN: 0.0486, INR: 0.01186, ARS: 0.000854, ALL: 0.01057 },\n BTC: { USD: 0.0000104, EUR: 0.00001129, GBP: 0.00001313, JPY: 0.0000000696, CAD: 0.00000751, AUD: 0.00000666, BRL: 0.0000018, CHF: 0.0000118, MXN: 0.000000508, INR: 0.000000124, ARS: 0.00000000892, ALL: 0.00000011 },\n ETH: { USD: 0.000316, EUR: 0.000343, GBP: 0.000399, JPY: 0.00000211, CAD: 0.000228, AUD: 0.000202, BRL: 0.0000547, CHF: 0.000358, MXN: 0.0000154, INR: 0.00000376, ARS: 0.000000271, ALL: 0.00000335 },\n SOL: { USD: 0.00424, EUR: 0.004607, GBP: 0.005356, JPY: 0.0000284, CAD: 0.003063, AUD: 0.002716, BRL: 0.000734, CHF: 0.004812, MXN: 0.000207, INR: 0.0000505, ARS: 0.00000364, ALL: 0.000045 },\n XRP: { USD: 0.4081, EUR: 0.4432, GBP: 0.5153, JPY: 0.00273, CAD: 0.2948, AUD: 0.2614, BRL: 0.0707, CHF: 0.4630, MXN: 0.01992, INR: 0.00486, ARS: 0.000350, ALL: 0.00433 },\n DOGE: { USD: 3.896, EUR: 4.232, GBP: 4.920, JPY: 0.02607, CAD: 2.815, AUD: 2.496, BRL: 0.6750, CHF: 4.421, MXN: 0.1902, INR: 0.04641, ARS: 0.003345, ALL: 0.04134 },\n ADA: { USD: 1.333, EUR: 1.448, GBP: 1.683, JPY: 0.00892, CAD: 0.963, AUD: 0.854, BRL: 0.2309, CHF: 1.512, MXN: 0.0651, INR: 0.01588, ARS: 0.001145, ALL: 0.01414 },\n};\n\n// ── Stablecoin detection ──\n\nconst STABLECOINS = new Set([\n 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'FDUSD', 'PYUSD',\n 'USDP', 'USDE', 'USDQ', 'USDR', 'USDT0', 'RLUSD',\n 'CUSD', 'EUSD', 'OMUSD', 'MEZOUSD', 'METAMASKUSD',\n 'USD0', 'USD1', 'AUDD', 'EUROC', 'EURQ', 'EURR', 'ZCHF',\n]);\n\n/** Check if a crypto code is a known stablecoin */\nexport function isStablecoin(code: string): boolean {\n return STABLECOINS.has(code.toUpperCase());\n}\n\n// ── Helper functions ──\n\nexport function getMockRate(crypto: string, fiat: string): number {\n return MOCK_RATES[crypto]?.[fiat] ?? MOCK_RATES['USDC']?.[fiat] ?? 1;\n}\n\nexport function parseAmount(str: string): number {\n return parseFloat(str.replace(/,/g, '')) || 0;\n}\n\nexport function formatOutput(num: number): string {\n if (num === 0) return '0';\n if (num >= 1000) return num.toLocaleString('en-US', { maximumFractionDigits: 2 });\n if (num >= 1) return num.toFixed(2);\n if (num >= 0.01) return num.toFixed(4);\n const s = num.toPrecision(4);\n return parseFloat(s).toString();\n}\n\nexport const isValidHex = (str: string): boolean => /^#([0-9A-Fa-f]{3}){1,2}$/.test(str);\n\n// ── Validation constants ──\n\nexport const MIN_FIAT_AMOUNT = 10;\nexport const MIN_CRYPTO_AMOUNT = 0.0001;\n\n// ── Pre-built flat list of every crypto+chain combination ──\n\nexport const CRYPTO_CHAIN_COMBOS: CryptoChainCombo[] = (() => {\n const list: CryptoChainCombo[] = [];\n for (const c of CRYPTO_CURRENCIES) {\n for (const chain of c.chains) {\n list.push({ code: c.code, name: c.name, chain, popular: c.popular });\n }\n }\n return list;\n})();\n","import type React from 'react';\nimport { useState, useCallback, useRef } from 'react';\nimport { getCryptoIconUrl, getFiatFlagUrl } from '../../data/cryptoData';\n\n/* ───────────── icon helpers ───────────── */\n\n/** Lazy-loaded image with placeholder and fallback */\nfunction LazyIcon({\n src,\n alt,\n size,\n className = '',\n background,\n}: {\n src: string;\n alt: string;\n size: number;\n className?: string;\n /** Background color for transparent icons */\n background?: string;\n}) {\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState(false);\n const currentSrc = useRef(src);\n\n // Reset state when src changes, using ref to avoid race with onLoad\n if (currentSrc.current !== src) {\n currentSrc.current = src;\n setLoaded(false);\n setError(false);\n }\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setError(true), []);\n\n return (\n <div\n className={`relative rounded-full shrink-0 ${className}`}\n style={{ width: size, height: size, background }}\n >\n {/* Placeholder while loading */}\n {!loaded && !error && (\n <div\n className=\"absolute inset-0 rounded-full animate-pulse\"\n style={{ background: 'var(--t-pill-bg, #333)' }}\n />\n )}\n {/* Fallback for broken images */}\n {error ? (\n <div\n className=\"absolute inset-0 rounded-full flex items-center justify-center font-bold\"\n style={{\n background: 'var(--t-pill-bg, #333)',\n color: 'var(--t-text-muted)',\n fontSize: Math.max(8, size * 0.35),\n }}\n >\n {alt.slice(0, 3)}\n </div>\n ) : (\n <img\n src={src}\n alt={alt}\n width={size}\n height={size}\n onLoad={handleLoad}\n onError={handleError}\n className={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n style={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n />\n )}\n </div>\n );\n}\n\nexport function CryptoIcon({ ticker, size = 32, baseUrl = '' }: { ticker: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getCryptoIconUrl(ticker, baseUrl)}\n alt={ticker}\n size={size}\n background=\"#ffffff\"\n />\n );\n}\n\nexport function FiatFlag({ currencyCode, size = 16, baseUrl = '' }: { currencyCode: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getFiatFlagUrl(currencyCode, baseUrl)}\n alt={currencyCode}\n size={size}\n />\n );\n}\n\nexport function GenericCoinIcon({ size = 32, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill={color} />\n <circle cx=\"16\" cy=\"16\" r=\"8\" stroke=\"white\" strokeWidth=\"1.5\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function BankIcon({ size = 24 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-card-icon-bg)' }}\n >\n <svg width={size * 0.6} height={size * 0.58} viewBox=\"0 0 25 24\" fill=\"none\">\n <path d=\"M23.292 7.5H1.70801L12.5 0.592773L23.292 7.5Z\" stroke=\"var(--t-card-icon-stroke)\" strokeWidth=\"1\" />\n <rect x=\"3\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"9\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"15\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"21\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect y=\"23\" width=\"25\" height=\"1\" fill=\"var(--t-card-icon-stroke)\" />\n </svg>\n </div>\n );\n}\n\nexport function RevolutIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center text-white font-semibold shrink-0\"\n style={{ width: size, height: size, backgroundColor: '#333', fontSize: size * 0.45 }}\n >\n R\n </div>\n );\n}\n\nexport function ApplePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#000', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.288} viewBox=\"0 0 50 20\" fill=\"none\">\n <path\n d=\"M9.14529 2.57901C8.55528 3.25398 7.61984 3.7887 6.68351 3.70976C6.56186 2.7971 7.02999 1.82591 7.55883 1.23105C8.14846 0.535892 9.166 0.0403839 9.9999 0C10.1017 0.952461 9.71518 1.88488 9.14529 2.57901ZM9.98932 3.88805C10.5171 3.92756 12.0384 4.08587 13.0125 5.48951C12.9312 5.54899 11.2066 6.51813 11.2267 8.55562C11.247 10.9883 13.4176 11.7995 13.4379 11.8193C13.4176 11.8787 13.0939 12.9667 12.3023 14.0939C11.6126 15.083 10.902 16.052 9.76606 16.0717C8.67023 16.0915 8.30483 15.4389 7.04742 15.4389C5.78949 15.4389 5.38394 16.052 4.34875 16.0915C3.25329 16.1307 2.42185 15.0429 1.73195 14.054C0.310872 12.0564 -0.764097 8.41705 0.696758 5.96431C1.40722 4.73809 2.70553 3.96677 4.10507 3.94695C5.18064 3.92756 6.17501 4.63962 6.82446 4.63962C7.47376 4.63962 8.62918 3.80889 9.98932 3.88805ZM23.544 1.13133C26.4989 1.13133 28.5569 3.11593 28.5569 6.00514C28.5569 8.90473 26.4567 10.8997 23.4702 10.8997H20.1987V15.9694H17.8349V1.13133H23.544ZM20.1987 8.96648H22.9108C24.9692 8.96648 26.1402 7.88694 26.1402 6.01552C26.1402 4.14448 24.9688 3.07467 22.9212 3.07467H20.1987V8.96648ZM29.1434 12.8945C29.1434 10.9923 30.6314 9.90226 33.375 9.7378L36.3194 9.56295V8.74027C36.3194 7.53753 35.5071 6.87939 34.0613 6.87939C32.8683 6.87939 32.0028 7.47564 31.8242 8.39042H29.6919C29.7556 6.46802 31.6126 5.06972 34.1246 5.06972C36.8262 5.06972 38.5886 6.44746 38.5886 8.58634V15.969H36.4042V14.1901H36.3515C35.7287 15.3518 34.3565 16.0817 32.8683 16.0817C30.6734 16.0817 29.1434 14.8072 29.1434 12.8945ZM36.3195 11.9385V11.1054L33.6918 11.27C32.2138 11.3624 31.4442 11.897 31.4442 12.8325C31.4442 13.7375 32.2459 14.3238 33.5018 14.3238C35.1055 14.3238 36.3195 13.3262 36.3195 11.9385ZM40.597 19.9377V18.1592C40.7449 18.1794 41.1032 18.1999 41.2935 18.1999C42.3381 18.1999 42.9291 17.7688 43.288 16.6575L43.4992 15.9997L39.4992 5.20338H41.9686L44.7548 13.9638H44.8077L47.5936 5.20338H50L45.8524 16.5445C44.9024 19.1463 43.8155 20 41.515 20C41.3354 20 40.7549 19.9793 40.597 19.9377Z\"\n fill=\"white\"\n />\n </svg>\n </div>\n );\n}\n\nexport function GooglePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#3C4043', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.296} viewBox=\"0 0 51 21\" fill=\"none\">\n <path d=\"M50.9156 5.87122L44.6406 20.2837H42.6992L45.0289 15.2416L40.9009 5.87122H42.9451L45.929 13.0573H45.9689L48.8714 5.87122H50.9156Z\" fill=\"white\" />\n <path d=\"M39.3906 6.65832C38.5866 5.91563 37.4895 5.54547 36.0995 5.54547C34.314 5.54547 32.9657 6.19816 32.0513 7.50532L33.7084 8.54664C34.3211 7.66089 35.1512 7.21951 36.2011 7.21951C36.8967 7.21951 37.5008 7.44661 38.0194 7.9023C38.538 8.35948 38.7964 8.91352 38.7964 9.5665V9.99507C38.0751 9.58796 37.1536 9.38381 36.0366 9.38381C34.7297 9.38381 33.6839 9.68959 32.8998 10.3023C32.1172 10.9151 31.7256 11.738 31.7256 12.7706C31.7256 13.8033 32.0969 14.5675 32.8396 15.2216C33.5808 15.8758 34.5065 16.2016 35.6092 16.2016C36.9033 16.2016 37.9389 15.6302 38.7147 14.4876H38.7976V15.8761H40.5944V9.70955C40.5944 8.4167 40.1944 7.39982 39.3903 6.65862L39.3906 6.65832ZM37.8665 13.6501C37.2451 14.2343 36.5424 14.5272 35.7511 14.5272C35.1926 14.5272 34.7068 14.3645 34.2913 14.0387C33.8741 13.7103 33.6673 13.3032 33.6673 12.8132C33.6673 12.2675 33.923 11.8134 34.4344 11.4462C34.9443 11.079 35.5815 10.8948 36.3442 10.8948C37.3926 10.8948 38.211 11.1249 38.7967 11.5889C38.7967 12.3775 38.4867 13.0645 37.8668 13.6501H37.8665Z\" fill=\"white\" />\n <path d=\"M30.4166 2.52282C29.5296 1.67999 28.4552 1.25739 27.1883 1.25739H22.2017V15.8758H24.0813V9.95362H27.188C28.4678 9.95362 29.5448 9.53936 30.4163 8.70815C31.3175 7.87962 31.7661 6.84397 31.7661 5.60565C31.7661 4.36733 31.3175 3.36744 30.4163 2.52312L30.4166 2.52282ZM29.0895 7.40248C28.598 7.90525 27.9781 8.15798 27.2297 8.15798H24.0816V3.05272H27.2297C27.9781 3.05272 28.5983 3.31141 29.0895 3.82849C29.5937 4.33276 29.845 4.92554 29.845 5.60535C29.845 6.28516 29.5934 6.8994 29.0895 7.40218V7.40248Z\" fill=\"white\" />\n <path d=\"M16.2663 11.4026C15.8887 12.6964 15.1901 13.9058 14.2131 14.8354C14.1815 14.8655 14.1496 14.895 14.1178 14.9245C14.116 14.9263 14.1148 14.9277 14.113 14.9292C13.1524 15.8144 11.9487 16.4295 10.6737 16.7272C10.6621 16.7302 10.6502 16.7329 10.6385 16.7356C10.2484 16.8241 9.85204 16.8888 9.45357 16.929C8.81668 16.9928 8.17293 16.9928 7.53723 16.9222C7.22102 16.8873 6.9063 16.8348 6.59546 16.7639C6.49293 16.7407 6.39101 16.7156 6.28938 16.6882C5.16759 16.3884 4.11256 15.8564 3.20476 15.1337C3.0018 14.971 2.80599 14.7987 2.61823 14.6184C2.61257 14.613 2.60721 14.6077 2.60154 14.6026C1.93962 13.9657 1.38081 13.22 0.956413 12.4034C0.938829 12.3691 0.921246 12.3352 0.90396 12.3009C0.717393 11.9319 0.559138 11.5493 0.429793 11.1574C0.364822 10.9618 0.307302 10.7634 0.257233 10.5631C0.226834 10.443 0.199117 10.3226 0.174678 10.2013C0.141299 10.0397 0.112986 9.87702 0.0894411 9.714C-0.0509314 8.75165 -0.0267907 7.76517 0.166929 6.81118C0.176168 6.76468 0.185705 6.71879 0.195838 6.6723C0.345748 5.97997 0.582981 5.31 0.903662 4.67698C1.53102 3.42525 2.48025 2.33983 3.62498 1.53514H3.62528C3.73704 1.45616 3.85029 1.38076 3.96533 1.30775C3.99424 1.28957 4.02345 1.27169 4.05206 1.25351C4.11018 1.21774 4.16889 1.18257 4.2276 1.148C4.34562 1.07945 4.46513 1.01329 4.58643 0.950111C4.64723 0.918519 4.70773 0.887822 4.76912 0.858018C5.0755 0.707811 5.39111 0.576975 5.71418 0.466108C5.77021 0.446438 5.82624 0.427961 5.88227 0.409781C5.96661 0.38266 6.05095 0.356731 6.13619 0.332292C6.19312 0.315603 6.25064 0.300106 6.30786 0.284906C6.36448 0.269707 6.4217 0.255401 6.47863 0.241393C6.51111 0.233346 6.5433 0.225895 6.57579 0.218146C6.62764 0.206225 6.6792 0.194901 6.73136 0.183874C6.73464 0.183278 6.73762 0.182681 6.7406 0.181787C6.90481 0.147216 7.06992 0.117711 7.23593 0.093273C7.25262 0.0905907 7.2693 0.088205 7.28629 0.0861187C8.67482 -0.111774 10.114 0.0309834 11.4319 0.518561C12.4443 0.889311 13.3712 1.47882 14.1651 2.21048C13.899 2.4957 13.6138 2.76661 13.3378 3.04705C12.8151 3.56533 12.2971 4.08807 11.774 4.60605C11.7734 4.60545 11.7723 4.60486 11.7717 4.60367L11.7645 4.61082C11.2465 4.11639 10.6192 3.74564 9.9346 3.53642C9.1314 3.29412 8.26652 3.26044 7.44425 3.43658C7.14741 3.49946 6.85772 3.59066 6.57847 3.70779C6.57519 3.70898 6.57221 3.71047 6.56893 3.71166C5.95231 3.97393 5.38843 4.36047 4.92022 4.83881C4.3638 5.39941 3.94089 6.09352 3.68906 6.83979C3.68727 6.8386 3.68548 6.83711 3.68369 6.83591C3.31831 7.89571 3.32308 9.07889 3.68399 10.1384C3.68191 10.1402 3.67982 10.1417 3.67773 10.1435C3.67833 10.1446 3.67863 10.1458 3.67893 10.147C3.68071 10.1461 3.6822 10.1446 3.68399 10.1435C4.03567 11.1892 4.72501 12.1158 5.62835 12.7482C6.19371 13.1473 6.84014 13.428 7.51995 13.5654C8.18545 13.6987 8.87927 13.6844 9.54477 13.5705C10.2103 13.4564 10.8519 13.209 11.4128 12.8338C11.4128 12.8338 11.413 12.834 11.4134 12.8344C11.4164 12.8326 11.4194 12.8308 11.4221 12.8287C12.3081 12.2294 12.9301 11.2691 13.1095 10.2147H8.48467V6.90178H8.48944V6.89701H16.4797C16.7458 8.38955 16.6889 9.94378 16.2657 11.4029L16.2663 11.4026Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PayPalIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#003087' }}\n >\n <span className=\"text-white font-bold\" style={{ fontSize: size * 0.38 }}>P</span>\n </div>\n );\n}\n\nexport function VisaIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#1A1F71', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.234} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function MastercardIcon({ size = 32 }: { size?: number }) {\n const s = size * 0.8;\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <svg width={s} height={s * 0.625} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n );\n}\n\nexport function CardIcon({ size = 32 }: { size?: number }) {\n const markW = size * 0.56;\n const markH = markW * 0.65;\n const r = Math.max(2, markW * 0.1);\n const overlap = markW * 0.2;\n return (\n <div className=\"flex items-center justify-center shrink-0\" style={{ width: size, height: size }}>\n {/* Visa mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#1A1F71',\n borderRadius: r,\n position: 'relative',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width={markW * 0.7} height={markH * 0.35} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n {/* Mastercard mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#252525',\n borderRadius: r,\n marginLeft: -overlap,\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <svg width={markH * 0.85} height={markH * 0.6} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n </div>\n );\n}\n\nexport function CoinifyIcon({ size = 18 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full bg-white flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <span className=\"text-black font-bold\" style={{ fontSize: size * 0.55 }}>C</span>\n </div>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\n <path d=\"M1 1L7 7L1 13\" stroke=\"var(--t-icon-stroke)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function MenuIcon({ onClick }: { onClick: () => void }) {\n return (\n <button onClick={onClick} className=\"hover:opacity-70 transition-opacity\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path\n d=\"M22.4004 12V4C22.4004 2.67452 21.3255 1.59961 20 1.59961H6.7998V14.4004H20V16H4V14.4004H5.2002V1.59961H4C2.67452 1.59961 1.59961 2.67452 1.59961 4V12C1.59961 13.3255 2.67452 14.4004 4 14.4004V16L3.79395 15.9951C1.68056 15.8879 0 14.14 0 12V4C0 1.79086 1.79086 6.44266e-08 4 0H20C22.2091 0 24 1.79086 24 4V12L23.9951 12.2061C23.8913 14.2512 22.2512 15.8913 20.2061 15.9951L20 16V14.4004C21.3255 14.4004 22.4004 13.3255 22.4004 12Z\"\n fill=\"var(--t-icon-stroke)\"\n />\n </svg>\n </button>\n );\n}\n\nexport function DarkModeIcon({ size = 40 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-surface)' }}\n >\n <svg width={size * 0.5} height={size * 0.5} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" />\n <path d=\"M10 2.5A7.5 7.5 0 0 1 10 17.5\" fill=\"var(--t-text)\" />\n </svg>\n </div>\n );\n}\n\nexport function getPaymentIcon(type: string, size = 32): React.ReactNode {\n switch (type) {\n case 'revolut': return <RevolutIcon size={size} />;\n case 'applepay': return <ApplePayIcon size={size} />;\n case 'card': return <CardIcon size={size} />;\n case 'googlepay': return <GooglePayIcon size={size} />;\n case 'paypal': return <PayPalIcon size={size} />;\n case 'bank': return <BankIcon size={size} />;\n case 'visa': return <VisaIcon size={size} />;\n case 'mastercard': return <MastercardIcon size={size} />;\n default: return <GenericCoinIcon size={size} />;\n }\n}\n","/**\n * PaymentMethodSelector\n * Inline row that opens a modal to choose a payment method.\n * Styled to match the exchange rate row in the form.\n */\n\nimport { useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { getPaymentIcon, GenericCoinIcon, ChevronDown } from './ui/icons';\n\n// Map Banxa payment-method IDs to icon keys used by getPaymentIcon\nconst ICON_KEY_MAP: Record<string, string> = {\n\t'debit-credit-card': 'card',\n\t'bank-transfer': 'bank',\n\t'ach-bank-transfer': 'bank',\n\t'payid-bank-transfer': 'bank',\n\t'sepa-bank-transfer': 'bank',\n\tsepa: 'bank',\n\t'apple-pay': 'applepay',\n\t'google-pay': 'googlepay',\n\tpaypal: 'paypal',\n\trevolut: 'revolut',\n};\n\nconst SHORT_NAME_MAP: Record<string, string> = {\n\t'debit-credit-card': 'Card',\n\t'bank-transfer': 'Bank Transfer',\n\t'ach-bank-transfer': 'ACH',\n\t'apple-pay': 'Apple Pay',\n\t'google-pay': 'Google Pay',\n\t'payid-bank-transfer': 'PayID',\n\tpaypal: 'PayPal',\n\trevolut: 'Revolut',\n};\n\nexport function getMethodDisplayName(id: string, fullName: string): string {\n\treturn SHORT_NAME_MAP[id] || fullName;\n}\n\nexport function getMethodIcon(methodId: string, icon?: string, size = 24): React.ReactNode {\n\tconst iconKey = ICON_KEY_MAP[methodId];\n\tif (iconKey) return getPaymentIcon(iconKey, size);\n\tif (icon) return <img src={icon} alt=\"\" width={size} height={size} style={{ borderRadius: '50%' }} />;\n\treturn <GenericCoinIcon size={size} />;\n}\n\nexport interface PaymentMethodSelectorProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonOpenModal: () => void;\n\tfiatCurrency: string;\n}\n\nexport function PaymentMethodSelector({\n\tmethods,\n\tselectedId,\n\tonOpenModal,\n\tfiatCurrency,\n}: PaymentMethodSelectorProps) {\n\tconst filtered = useMemo(\n\t\t() => methods.filter((m) => m.supportedFiats.includes(fiatCurrency)),\n\t\t[methods, fiatCurrency]\n\t);\n\n\tconst selected = filtered.find((m) => m.id === selectedId) || filtered[0];\n\n\tif (filtered.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center justify-between px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\tNo payment methods available for {fiatCurrency}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={0}\n\t\t\t\tonClick={onOpenModal}\n\t\t\t\tonKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n\t\t\t\tclassName=\"flex items-center justify-between w-full px-[18px] transition-colors\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\theight: 42,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tPayment method\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n\t\t\t\t\t\t{selected && getMethodIcon(selected.id, selected.icon, 20)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t{selected ? getMethodDisplayName(selected.id, selected.name) : 'Select'}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown />\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Checkout Step Component\n * Displays provider checkout iframe or redirect button.\n * Iframe/widget checkouts render in a full-screen portal overlay.\n */\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRamp } from '../context/RampContext';\n\nexport interface CheckoutStepProps {\n\tclassName?: string;\n\tautoRedirect?: boolean;\n\tredirectDelay?: number;\n}\n\nexport function CheckoutStep({\n\tclassName = '',\n\tautoRedirect = false,\n\tredirectDelay = 3000,\n}: CheckoutStepProps) {\n\tconst { order, orderStatus, goToStep, goBack } = useRamp();\n\tconst [iframeLoaded, setIframeLoaded] = useState(false);\n\tconst [redirectCountdown, setRedirectCountdown] = useState<number | null>(null);\n\n\tconst isExpired = order?.checkout.expiresAt ? Date.now() > order.checkout.expiresAt : false;\n\n\t// Handle auto-redirect\n\tuseEffect(() => {\n\t\tif (order?.checkout.method === 'redirect' && autoRedirect && !isExpired) {\n\t\t\tsetRedirectCountdown(Math.ceil(redirectDelay / 1000));\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\twindow.location.href = order.checkout.url;\n\t\t\t}, redirectDelay);\n\n\t\t\tconst countdownInterval = setInterval(() => {\n\t\t\t\tsetRedirectCountdown((prev) => (prev && prev > 1 ? prev - 1 : null));\n\t\t\t}, 1000);\n\n\t\t\treturn () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclearInterval(countdownInterval);\n\t\t\t};\n\t\t}\n\t}, [order, autoRedirect, redirectDelay, isExpired]);\n\n\t// Navigate on terminal statuses\n\tuseEffect(() => {\n\t\tif (!orderStatus) return;\n\t\tif (orderStatus.status === 'completed') {\n\t\t\tgoToStep('complete');\n\t\t} else if (['failed', 'cancelled', 'expired'].includes(orderStatus.status)) {\n\t\t\tgoToStep('error');\n\t\t}\n\t}, [orderStatus?.status, goToStep]);\n\n\tif (!order) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<p className=\"text-[15px] mb-4\">No order found</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tGo Back\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isExpired) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t{/* <div className=\"text-[48px] mb-4\">⏰</div> */}\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">Checkout expired</h3>\n\t\t\t\t<p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tThe session has expired. Please try again.\n\t\t\t\t</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tStart over\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Iframe checkout — full-screen portal overlay\n\tif (order.checkout.method === 'iframe') {\n\t\tconst iframeSrc = order.checkout.url;\n\t\tconst allowAttr =\n\t\t\torder.checkout.allowedFeatures?.join('; ') ||\n\t\t\t'payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share';\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"nramp-spinner\" />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\tLoading checkout...\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={iframeSrc}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow={allowAttr}\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle=\"Provider Checkout\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\t// Redirect checkout\n\tif (order.checkout.method === 'redirect') {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<div className=\"text-[48px] mb-4\">🔗</div>\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">Complete Payment</h3>\n\t\t\t\t<p className=\"text-[14px] mb-4\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\tYou'll be redirected to {order.gateway} to complete your payment.\n\t\t\t\t</p>\n\t\t\t\t{redirectCountdown !== null && (\n\t\t\t\t\t<p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tRedirecting in {redirectCountdown}...\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t<a\n\t\t\t\t\thref={order.checkout.url}\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] flex items-center justify-center transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t\ttextDecoration: 'none',\n\t\t\t\t\t}}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t>\n\t\t\t\t\tContinue to {order.gateway}\n\t\t\t\t</a>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[14px] mt-2 transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Widget checkout — full-screen portal overlay\n\tif (order.checkout.method === 'widget' && order.widgetConfig) {\n\t\tconst widgetUrl = buildWidgetUrl(order.checkout.url, order.widgetConfig);\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"nramp-spinner\" />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\tLoading checkout...\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={widgetUrl}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow=\"payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share\"\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle=\"Payment Checkout\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t>\n\t\t\t<p className=\"text-[15px] mb-4\">Unknown checkout method</p>\n\t\t\t<button\n\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: 48,\n\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t}}\n\t\t\t\tonClick={goBack}\n\t\t\t>\n\t\t\t\tGo Back\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction buildWidgetUrl(baseUrl: string, config: Record<string, unknown>): string {\n\tconst url = new URL('/en/partner/widget', baseUrl);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value != null && value !== '') {\n\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\t}\n\treturn url.toString();\n}\n","/**\n * Processing Step Component\n * Shows order processing status with live updates.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useEffect } from 'react';\nimport { useRamp } from '../context/RampContext';\n\nexport interface ProcessingStepProps {\n className?: string;\n}\n\nexport function ProcessingStep({ className = '' }: ProcessingStepProps) {\n const { orderStatus, orderStatusLoading, goToStep } = useRamp();\n\n useEffect(() => {\n if (!orderStatus) return;\n if (orderStatus.status === 'completed') {\n goToStep('complete');\n } else if (['failed', 'cancelled', 'expired', 'refunded'].includes(orderStatus.status)) {\n goToStep('error');\n }\n }, [orderStatus?.status, goToStep]);\n\n const getStatusMessage = () => {\n if (!orderStatus) return 'Processing your order...';\n switch (orderStatus.status) {\n case 'pending':\n return 'Waiting for payment confirmation...';\n case 'processing':\n return 'Processing your transaction...';\n default:\n return 'Processing...';\n }\n };\n\n return (\n <div className={`flex flex-col items-center justify-center px-8 py-12 text-center ${className}`}>\n <div className=\"mb-6\">\n <div className=\"nramp-spinner-large nramp-spinner\" />\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-3\" style={{ color: 'var(--t-text)' }}>\n {getStatusMessage()}\n </h2>\n\n {orderStatusLoading && (\n <p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>Checking status...</p>\n )}\n\n {orderStatus && (\n <div className=\"w-full mt-6 text-left\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <DetailRow label=\"Order ID\" value={orderStatus.orderId} mono />\n <DetailRow label=\"Provider\" value={orderStatus.gateway} />\n <DetailRow\n label=\"Amount\"\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow\n label=\"Receiving\"\n value={`${orderStatus.cryptoAmount || '...'} ${orderStatus.cryptoCurrency}`}\n />\n <DetailRow label=\"Network\" value={orderStatus.network} />\n <DetailRow\n label=\"To Address\"\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n </div>\n )}\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n This usually takes a few minutes.\n </p>\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n You can safely close this page - we'll send you an email when complete.\n </p>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Complete Step Component\n * Success screen with transaction details.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\n\nexport interface CompleteStepProps {\n className?: string;\n explorerUrl?: string;\n onDone?: () => void;\n doneButtonText?: string;\n}\n\nexport function CompleteStep({\n className = '',\n explorerUrl,\n onDone,\n doneButtonText = 'Done',\n}: CompleteStepProps) {\n const { orderStatus, state, dispatch } = useRamp();\n const isSell = state.flowType === 'sell';\n\n const getExplorerUrl = () => {\n if (!orderStatus?.transactionHash) return null;\n if (!explorerUrl) {\n const defaultExplorers: Record<string, string> = {\n ethereum: 'https://etherscan.io/tx/{txHash}',\n polygon: 'https://polygonscan.com/tx/{txHash}',\n arbitrum: 'https://arbiscan.io/tx/{txHash}',\n optimism: 'https://optimistic.etherscan.io/tx/{txHash}',\n base: 'https://basescan.org/tx/{txHash}',\n bitcoin: 'https://mempool.space/tx/{txHash}',\n solana: 'https://solscan.io/tx/{txHash}',\n avalanche: 'https://snowtrace.io/tx/{txHash}',\n fantom: 'https://ftmscan.com/tx/{txHash}',\n };\n const baseUrl = defaultExplorers[state.network] || defaultExplorers.ethereum;\n return baseUrl.replace('{txHash}', orderStatus.transactionHash);\n }\n return explorerUrl.replace('{txHash}', orderStatus.transactionHash);\n };\n\n const handleDone = () => {\n if (onDone) {\n onDone();\n } else {\n dispatch({ type: 'RESET' });\n }\n };\n\n const explorerLink = getExplorerUrl();\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Success icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-success, #10b981)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {isSell ? 'Sale Complete!' : 'Purchase Complete!'}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {isSell\n ? `Your ${orderStatus?.fiatCurrency || state.fiatCurrency} payout is being processed.`\n : `Your ${orderStatus?.cryptoCurrency || state.cryptoCurrency} has been sent to your wallet.`\n }\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <DetailRow\n label={isSell ? 'Amount Sold' : 'Amount Received'}\n value={`${orderStatus.cryptoAmount} ${orderStatus.cryptoCurrency}`}\n highlight\n />\n <DetailRow\n label={isSell ? 'Payout Amount' : 'Amount Paid'}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow label=\"Network\" value={orderStatus.network} />\n <DetailRow\n label=\"Wallet\"\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n {orderStatus.transactionHash && (\n <DetailRow\n label=\"Transaction\"\n value={`${orderStatus.transactionHash.slice(0, 10)}...${orderStatus.transactionHash.slice(-8)}`}\n mono\n />\n )}\n <DetailRow label=\"Provider\" value={orderStatus.gateway} />\n <DetailRow label=\"Order ID\" value={orderStatus.orderId} mono />\n {orderStatus.completedAt && (\n <DetailRow\n label=\"Completed\"\n value={new Date(orderStatus.completedAt).toLocaleString()}\n />\n )}\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n {explorerLink && (\n <a\n href={explorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full font-semibold text-[14px] flex items-center justify-center transition-all\"\n style={{ height: 48, borderRadius: 5, background: 'var(--t-surface)', color: 'var(--t-text)', textDecoration: 'none' }}\n >\n View on Explorer\n </a>\n )}\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleDone}\n >\n {doneButtonText}\n </button>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Error Step Component\n * Displays error state with retry options.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\n\nexport interface ErrorStepProps {\n className?: string;\n onRetry?: () => void;\n supportEmail?: string;\n}\n\nexport function ErrorStep({\n className = '',\n onRetry,\n supportEmail = 'support@nowramp.com',\n}: ErrorStepProps) {\n const { state, orderStatus, dispatch, goToStep } = useRamp();\n const isSell = state.flowType === 'sell';\n\n const getErrorTitle = () => {\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed': return 'Payment Failed';\n case 'cancelled': return 'Order Cancelled';\n case 'expired': return 'Order Expired';\n case 'refunded': return 'Order Refunded';\n default: return 'Something Went Wrong';\n }\n }\n return 'Something Went Wrong';\n };\n\n const getErrorMessage = () => {\n if (state.errorMessage) return state.errorMessage;\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed':\n return isSell\n ? 'Your sale could not be processed. Please try again.'\n : 'Your payment could not be processed. Please try again or use a different payment method.';\n case 'cancelled':\n return isSell\n ? 'Your sale was cancelled. No crypto was transferred.'\n : 'Your order was cancelled. No payment was processed.';\n case 'expired':\n return isSell\n ? 'Your order has expired. Please start a new sale.'\n : 'Your order has expired. Please start a new purchase.';\n case 'refunded':\n return isSell\n ? 'Your crypto has been returned. The funds should appear in your wallet shortly.'\n : 'Your payment has been refunded. The funds should appear in your account within 5-10 business days.';\n default:\n return 'An unexpected error occurred. Please try again.';\n }\n }\n return 'An unexpected error occurred. Please try again.';\n };\n\n const handleRetry = () => {\n dispatch({ type: 'CLEAR_ERROR' });\n if (onRetry) {\n onRetry();\n } else {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n }\n };\n\n const handleStartOver = () => {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n };\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Error icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-error, #EF4444)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {getErrorTitle()}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {getErrorMessage()}\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n <div className=\"flex justify-between items-center py-2\">\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>Order ID</span>\n <span className=\"text-[13px] font-medium font-mono\" style={{ color: 'var(--t-text)' }}>\n {orderStatus.orderId}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleRetry}\n >\n Try Again\n </button>\n <button\n className=\"w-full font-semibold text-[14px] transition-all\"\n style={{ height: 48, borderRadius: 5, background: 'var(--t-surface)', color: 'var(--t-text)' }}\n onClick={handleStartOver}\n >\n Start Over\n </button>\n </div>\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n Need help? Contact{' '}\n <a\n href={`mailto:${supportEmail}`}\n className=\"underline\"\n style={{ color: 'var(--t-accent)' }}\n >\n {supportEmail}\n </a>\n </p>\n {orderStatus && (\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n Reference: {orderStatus.orderId}\n </p>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Confirm Step Component\n * Shown when all fields are pre-configured (session mode).\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useState } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { isStablecoin, formatOutput } from '../data/cryptoData';\n\nexport interface ConfirmStepProps {\n className?: string;\n stablecoinParity?: boolean;\n partnerName?: string;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-6)}`;\n}\n\nexport function ConfirmStep({ className = '', stablecoinParity, partnerName }: ConfirmStepProps) {\n const {\n config,\n configLoading,\n state,\n defaultGateway,\n quotes,\n fetchQuotes,\n createOrder,\n orderLoading,\n } = useRamp();\n\n const isSell = state.flowType === 'sell';\n const [error, setError] = useState<string | null>(null);\n\n const gatewayInfo = config?.gateways.find((g) => g.id === defaultGateway);\n\n // Parity display for confirm step: stablecoin equivalent of fiat (partner absorbs fees)\n const exchangeRate = quotes?.bestQuote?.exchangeRate ? parseFloat(quotes.bestQuote.exchangeRate) : null;\n const fiatNumeric = parseFloat(state.fiatAmount) || 0;\n const confirmParityActive = !!(stablecoinParity && partnerName && !isSell && isStablecoin(state.cryptoCurrency) && exchangeRate);\n const confirmSamePeg = confirmParityActive && state.cryptoCurrency.toUpperCase().includes(state.fiatCurrency.toUpperCase());\n const confirmParityAmount = confirmParityActive && fiatNumeric > 0\n ? formatOutput(confirmSamePeg ? fiatNumeric : fiatNumeric / exchangeRate)\n : null;\n\n const handleConfirm = async () => {\n setError(null);\n try {\n fetchQuotes();\n await createOrder();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n setError(message);\n }\n };\n\n if (configLoading) {\n return (\n <div className={`flex flex-col items-center justify-center p-12 ${className}`}>\n <div className=\"nramp-spinner\" />\n <p className=\"text-[14px] mt-4\" style={{ color: 'var(--t-text-secondary)' }}>Loading...</p>\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 ${className}`}>\n <h2 className=\"text-[20px] font-semibold mb-6\" style={{ color: 'var(--t-text)' }}>\n {isSell ? 'Confirm Sale' : 'Confirm Purchase'}\n </h2>\n\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 5, padding: 16 }}>\n {gatewayInfo && (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>Provider</span>\n <span className=\"flex items-center gap-2\">\n {gatewayInfo.logo && (\n <img src={gatewayInfo.logo} alt={gatewayInfo.name} width={20} height={20} style={{ borderRadius: 4 }} />\n )}\n <span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>{gatewayInfo.name}</span>\n </span>\n </div>\n )}\n\n {isSell ? (\n <>\n <DetailRow label=\"You sell\" value={`${state.cryptoAmount} ${state.cryptoCurrency}`} highlight />\n <DetailRow label=\"You receive\" value={`${state.fiatCurrency} payout`} />\n </>\n ) : (\n <>\n <DetailRow label=\"You pay\" value={`${state.fiatAmount} ${state.fiatCurrency}`} highlight />\n <DetailRow\n label=\"You receive\"\n value={confirmParityAmount ? `${confirmParityAmount} ${state.cryptoCurrency}` : `${state.cryptoCurrency} on ${state.network}`}\n />\n <DetailRow label=\"Wallet\" value={truncateAddress(state.walletAddress)} mono />\n {confirmParityActive && confirmParityAmount && (\n <div className=\"py-2 text-[11px]\" style={{ color: 'var(--t-text-muted)', lineHeight: '15px' }}>\n Charged amount from provider may differ. The rest up to {confirmParityAmount} {state.cryptoCurrency} will be credited to your {partnerName} account.\n </div>\n )}\n </>\n )}\n\n <DetailRow label=\"Network\" value={state.network} />\n\n {isSell && state.walletAddress && (\n <DetailRow label=\"Refund address\" value={truncateAddress(state.walletAddress)} mono />\n )}\n </div>\n\n {error && (\n <p className=\"text-[12px] mb-4\" style={{ color: '#EF4444' }}>{error}</p>\n )}\n\n <button\n className=\"w-full font-semibold text-[16px] transition-all flex items-center justify-center gap-2\"\n style={{ height: 60, borderRadius: 5, background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)', opacity: orderLoading ? 0.7 : 1 }}\n disabled={orderLoading}\n onClick={handleConfirm}\n >\n {orderLoading ? (\n <>\n <span className=\"nramp-spinner-inline\" />\n Processing...\n </>\n ) : (\n isSell ? 'Confirm & Sell' : 'Confirm & Pay'\n )}\n </button>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function Modal({\n isOpen,\n onClose,\n children,\n}: {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n}) {\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setAnimating(true)));\n } else if (mounted) {\n setAnimating(false);\n const t = setTimeout(() => setMounted(false), 250);\n return () => clearTimeout(t);\n }\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setAnimating(false);\n setTimeout(() => onClose(), 250);\n }, [onClose]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [isOpen, handleClose]);\n\n if (!mounted) return null;\n\n return (\n <div\n className=\"absolute inset-0 z-20 transition-opacity duration-250\"\n style={{ opacity: animating ? 1 : 0 }}\n >\n <div\n className=\"absolute inset-0 flex flex-col transition-transform duration-250 ease-out\"\n style={{ background: 'var(--t-modal-bg)', transform: animating ? 'translateY(0)' : 'translateY(24px)' }}\n >\n {typeof children === 'function' ? children(handleClose) : children}\n </div>\n </div>\n );\n}\n","import type React from 'react';\n\nexport function AnimatedDigit({ char, height = 38 }: { char: string; height?: number }) {\n const digits = '0123456789';\n const idx = digits.indexOf(char);\n if (idx === -1) return <span>{char}</span>;\n return (\n <span className=\"digit-slot\" style={{ height, lineHeight: `${height}px` }}>\n <span className=\"digit-slot-inner block\" style={{ transform: `translateY(-${idx * height}px)` }}>\n {digits.split('').map(d => (\n <span key={d} className=\"block\" style={{ height, lineHeight: `${height}px` }}>{d}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport function AnimatedNumber({\n value,\n height = 38,\n className = '',\n style = {},\n}: {\n value: string;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <span className={className} style={{ display: 'inline-flex', ...style }}>\n {value.split('').map((ch, i) => (\n <AnimatedDigit key={i} char={ch} height={height} />\n ))}\n </span>\n );\n}\n","export function Skeleton({\n w,\n h,\n className = '',\n}: {\n w: number | string;\n h: number | string;\n className?: string;\n}) {\n return <div className={`skeleton ${className}`} style={{ width: w, height: h }} />;\n}\n\nexport function FormSkeleton() {\n return (\n <div className=\"flex-1 px-5 flex flex-col\">\n <div className=\"px-[18px] pt-[14px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5 }}>\n <Skeleton w={70} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={120} h={32} />\n <Skeleton w={75} h={32} />\n </div>\n </div>\n <div className=\"px-[18px] pt-[12px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5, marginTop: 4 }}>\n <Skeleton w={50} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={180} h={32} />\n <Skeleton w={85} h={32} />\n </div>\n </div>\n <div className=\"flex justify-between mt-3 px-[2px]\">\n <Skeleton w={140} h={12} />\n <Skeleton w={90} h={12} />\n </div>\n <div className=\"mt-8\">\n <Skeleton w={65} h={14} className=\"mb-2.5\" />\n <Skeleton w=\"100%\" h={47} />\n </div>\n <div className=\"flex-1\" />\n <Skeleton w=\"100%\" h={60} className=\"mb-2\" />\n <div className=\"text-center py-3\">\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>Powered by NowRamp</span>\n </div>\n </div>\n );\n}\n","export function CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center transition-colors rounded-full shrink-0\"\n style={{ width: 30, height: 30, backgroundColor: 'var(--t-close-bg)' }}\n onMouseEnter={e => (e.currentTarget.style.backgroundColor = 'var(--t-close-hover)')}\n onMouseLeave={e => (e.currentTarget.style.backgroundColor = 'var(--t-close-bg)')}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"var(--t-icon-close)\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n );\n}\n","import { useState } from 'react';\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = '',\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n}) {\n const [focused, setFocused] = useState(false);\n return (\n <div className=\"relative mx-5 mb-5\">\n <input\n type=\"text\"\n value={value}\n onChange={e => onChange(e.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder}\n style={{ height: 47, borderRadius: 4.5, border: `1px solid ${focused ? 'var(--t-border-focus)' : 'var(--t-border)'}`, outline: 'none', boxShadow: 'none', color: 'var(--t-text)', padding: `0 ${value ? 40 : 14}px 0 14px`, fontSize: 14, backgroundColor: 'transparent' }}\n className=\"w-full outline-none transition-colors\"\n />\n {value && (\n <button\n onClick={() => onChange('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center transition-colors rounded\"\n style={{ width: 22, height: 22, backgroundColor: 'var(--t-close-bg)', borderRadius: 4 }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M1 1L7 7M7 1L1 7\" stroke=\"var(--t-icon-close)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Fiat Currency Selector Modal\n * Searchable list of fiat currencies with flag icons.\n * Uses API currencies if provided, falls back to static FIAT_CURRENCIES data.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { FiatFlag } from '../ui/icons';\nimport { FIAT_CURRENCIES, type FiatCurrency } from '../../data/cryptoData';\n\nexport interface FiatCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string) => void;\n\t/** Currencies from API config — takes precedence over static fallback */\n\tcurrencies?: Array<{ code: string; name?: string }>;\n\t/** Base URL for static assets (fiat flags) */\n\tassetBaseUrl?: string;\n\t/** Currently selected currency code */\n\tselectedCode?: string;\n}\n\nexport function FiatCurrencyModal({\n\tonClose,\n\tonSelect,\n\tcurrencies,\n\tassetBaseUrl = '',\n\tselectedCode,\n}: FiatCurrencyModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\t// Merge API data with static fallback for display names\n\tconst currencyList = useMemo<FiatCurrency[]>(() => {\n\t\tif (!currencies || currencies.length === 0) return FIAT_CURRENCIES;\n\n\t\t// Build a lookup from static data for display names\n\t\tconst staticMap = new Map(FIAT_CURRENCIES.map((c) => [c.code, c.name]));\n\n\t\treturn currencies.map((c) => ({\n\t\t\tcode: c.code,\n\t\t\tname: c.name || staticMap.get(c.code) || c.code,\n\t\t}));\n\t}, [currencies]);\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode) {\n\t\t\t\tconst selected = currencyList.find((c) => c.code === selectedCode);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = currencyList.filter((c) => c.code !== selectedCode);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn currencyList;\n\t\t}\n\n\t\treturn currencyList.filter(\n\t\t\t(c) => c.code.toLowerCase().includes(raw) || c.name.toLowerCase().includes(raw)\n\t\t);\n\t}, [currencyList, search, selectedCode]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tfontSize: 17,\n\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\tmarginTop: 8,\n\t\t\t\t\tmarginBottom: 24,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\tSelect fiat currency\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((c, idx) => {\n\t\t\t\t\t// Only show name if different from code\n\t\t\t\t\tconst displayName = c.name !== c.code ? c.name : '';\n\t\t\t\t\tconst isSelected = selectedCode === c.code;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={c.code}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(c.code)}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FiatFlag currencyCode={c.code} size={32} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<span className=\"font-semibold text-[15px]\">{c.code}</span>\n\t\t\t\t\t\t\t\t\t{displayName && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo currencies found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Crypto Currency + Chain Selector Modal\n * Searchable list of crypto+chain combinations with compound icons (crypto icon + chain badge).\n * Smart search ranking: exact code > starts with > popular > other.\n * Uses API data if provided, falls back to static CRYPTO_CHAIN_COMBOS.\n */\n\nimport { useState, useMemo, useCallback, useRef } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport {\n\tCRYPTO_CHAIN_COMBOS,\n\tgetCryptoIconUrl,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\tCRYPTO_NAMES,\n\ttype CryptoChainCombo,\n} from '../../data/cryptoData';\n\n/** Image component with loading state and error fallback */\nfunction CryptoImage({ src, alt, size, className, style }: {\n\tsrc: string;\n\talt: string;\n\tsize: number;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\tconst [loaded, setLoaded] = useState(false);\n\tconst [error, setError] = useState(false);\n\tconst currentSrc = useRef(src);\n\n\t// Reset state when src changes, using ref to avoid race with onLoad\n\tif (currentSrc.current !== src) {\n\t\tcurrentSrc.current = src;\n\t\tsetLoaded(false);\n\t\tsetError(false);\n\t}\n\n\tconst handleLoad = useCallback(() => setLoaded(true), []);\n\tconst handleError = useCallback(() => setError(true), []);\n\n\treturn (\n\t\t<div className={className} style={{ ...style, width: size, height: size, position: 'relative' }}>\n\t\t\t{/* Placeholder shown while loading */}\n\t\t\t{!loaded && !error && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full animate-pulse\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{/* Fallback for broken images */}\n\t\t\t{error ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full flex items-center justify-center text-[10px] font-bold\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)', color: 'var(--t-text-muted)' }}\n\t\t\t\t>\n\t\t\t\t\t{alt.slice(0, 3)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<img\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={size}\n\t\t\t\t\theight={size}\n\t\t\t\t\tonLoad={handleLoad}\n\t\t\t\t\tonError={handleError}\n\t\t\t\t\tclassName={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n\t\t\t\t\tstyle={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport interface CryptoCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string, chain: string) => void;\n\t/** Crypto data from API config — takes precedence over static fallback */\n\tcryptos?: Array<{\n\t\tcode: string;\n\t\tname?: string;\n\t\tnetworks?: Array<{ code: string; id?: string; name?: string }>;\n\t}>;\n\t/** Base URL for static assets (crypto icons) */\n\tassetBaseUrl?: string;\n\t/** Currently selected crypto code */\n\tselectedCode?: string;\n\t/** Currently selected chain/network */\n\tselectedChain?: string;\n}\n\nexport function CryptoCurrencyModal({ onClose, onSelect, cryptos, assetBaseUrl = '', selectedCode, selectedChain }: CryptoCurrencyModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\t// Build flat combo list from API data or fall back to static data\n\tconst comboList = useMemo<CryptoChainCombo[]>(() => {\n\t\tif (!cryptos || cryptos.length === 0) return CRYPTO_CHAIN_COMBOS;\n\n\t\tconst list: CryptoChainCombo[] = [];\n\t\tfor (const c of cryptos) {\n\t\t\tconst networks = c.networks || [];\n\t\t\t// Get name from API, fallback to CRYPTO_NAMES lookup, then code\n\t\t\tconst cryptoName = c.name || CRYPTO_NAMES[c.code] || c.code;\n\t\t\tif (networks.length === 0) {\n\t\t\t\t// No networks listed — add a single entry with the code as chain\n\t\t\t\tlist.push({ code: c.code, name: cryptoName, chain: c.code, popular: false });\n\t\t\t} else {\n\t\t\t\tfor (const net of networks) {\n\t\t\t\t\tconst chainCode = net.code || net.id || net.name || c.code;\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\tname: cryptoName,\n\t\t\t\t\t\tchain: chainCode,\n\t\t\t\t\t\tchainName: net.name,\n\t\t\t\t\t\tpopular: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}, [cryptos]);\n\n\t// Check if an item is currently selected\n\tconst isSelected = useCallback((code: string, chain: string) => {\n\t\treturn selectedCode === code && selectedChain === chain;\n\t}, [selectedCode, selectedChain]);\n\n\t// Filtered and ranked results\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode && selectedChain) {\n\t\t\t\tconst selected = comboList.find(c => c.code === selectedCode && c.chain === selectedChain);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = comboList.filter(c => !(c.code === selectedCode && c.chain === selectedChain));\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn comboList;\n\t\t}\n\n\t\tconst terms = raw.split(/\\s+/);\n\t\tconst scored: Array<{ item: CryptoChainCombo; score: number }> = [];\n\n\t\tfor (const c of comboList) {\n\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\tconst chainName = chain ? chain.name.toLowerCase() : '';\n\t\t\tconst chainShort = chain?.shortName?.toLowerCase() || '';\n\t\t\tconst chainCode = c.chain.toLowerCase();\n\t\t\tconst code = c.code.toLowerCase();\n\t\t\tconst name = c.name.toLowerCase();\n\t\t\tconst fields = [code, name, chainName, chainShort, chainCode];\n\n\t\t\t// All search terms must match at least one field\n\t\t\tconst allMatch = terms.every((t) => fields.some((f) => f.includes(t)));\n\t\t\tif (!allMatch) continue;\n\n\t\t\t// Scoring: exact code match > starts with > chain match bonus > popular\n\t\t\tlet score = 0;\n\t\t\tif (code === raw) score += 100;\n\t\t\telse if (code.startsWith(terms[0])) score += 50;\n\t\t\tif (c.popular) score += 10;\n\t\t\tif (\n\t\t\t\tterms.length > 1 &&\n\t\t\t\t(chainName.includes(terms[1]) ||\n\t\t\t\t\tchainShort.includes(terms[1]) ||\n\t\t\t\t\tchainCode.includes(terms[1]))\n\t\t\t) {\n\t\t\t\tscore += 25;\n\t\t\t}\n\t\t\tscored.push({ item: c, score });\n\t\t}\n\n\t\tscored.sort((a, b) => b.score - a.score);\n\t\treturn scored.map((s) => s.item);\n\t}, [comboList, search, selectedCode, selectedChain]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tSelect crypto currency\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((c, idx) => {\n\t\t\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\t\t\tconst chainName = chain?.name || c.chainName || c.chain;\n\t\t\t\t\t// Only show name if it's different from code\n\t\t\t\t\tconst displayName = c.name !== c.code ? c.name : '';\n\t\t\t\t\tconst itemSelected = isSelected(c.code, c.chain);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={`${c.code}-${c.chain}`}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(c.code, c.chain)}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n\t\t\t\t\t\t\t\tstyle={{ gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Compound icon: crypto icon + chain badge */}\n\t\t\t\t\t\t\t\t<div className=\"relative shrink-0\" style={{ width: 40, height: 40 }}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ background: '#ffffff', borderRadius: '50%' }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\t\tsrc={getCryptoIconUrl(c.code, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\talt={c.code}\n\t\t\t\t\t\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\t\tborder: '2px solid var(--t-surface, #1C1C22)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\t\t\tbackground: '#ffffff',\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(c.chain, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\talt={c.chain}\n\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-[15px]\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{displayName && (\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[13px]\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 shrink-0\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t{chainName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{itemSelected && (\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo currencies found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Payment Method Modal\n * Searchable list of payment methods with icons.\n * Follows the same pattern as FiatCurrencyModal / CryptoCurrencyModal.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { getMethodIcon, getMethodDisplayName } from '../PaymentMethodSelector';\n\nexport interface PaymentMethodModalProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tonClose: () => void;\n}\n\nexport function PaymentMethodModal({\n\tmethods,\n\tselectedId,\n\tonSelect,\n\tonClose,\n}: PaymentMethodModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedId) {\n\t\t\t\tconst selected = methods.find((m) => m.id === selectedId);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = methods.filter((m) => m.id !== selectedId);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn methods;\n\t\t}\n\n\t\treturn methods.filter(\n\t\t\t(m) =>\n\t\t\t\tm.id.toLowerCase().includes(raw) ||\n\t\t\t\tm.name.toLowerCase().includes(raw) ||\n\t\t\t\t(m.description && m.description.toLowerCase().includes(raw))\n\t\t);\n\t}, [methods, search, selectedId]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tChoose payment method\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n\t\t\t\t{filtered.map((m, idx) => {\n\t\t\t\t\tconst isSelected = m.id === selectedId;\n\t\t\t\t\tconst shortName = getMethodDisplayName(m.id, m.name);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={m.id}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => onSelect(m.id)}\n\t\t\t\t\t\t\t\tclassName={`flex w-full transition-colors rounded-lg hover-item ${m.description ? 'items-start' : 'items-center'}`}\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center shrink-0 ${m.description ? 'mt-0.5' : ''}`}\n\t\t\t\t\t\t\t\t\tstyle={{ width: 32, height: 32 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{getMethodIcon(m.id, m.icon, 32)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold text-[15px] leading-tight\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{shortName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{m.description && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[13px] leading-snug mt-1\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{m.description}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0 mt-1\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{/* Divider between items */}\n\t\t\t\t\t\t\t{idx < filtered.length - 1 && (\n\t\t\t\t\t\t\t\t<div style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\tNo payment methods found\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","export function ToggleSwitch({\n checked,\n onChange,\n accentColor = 'var(--t-accent)',\n}: {\n checked: boolean;\n onChange: (v: boolean) => void;\n accentColor?: string;\n}) {\n return (\n <button\n onClick={() => onChange(!checked)}\n className=\"relative shrink-0 transition-colors duration-200\"\n style={{\n width: 48,\n height: 28,\n borderRadius: 14,\n backgroundColor: checked ? accentColor : 'var(--t-border)',\n }}\n >\n <div\n className=\"absolute top-[3px] rounded-full bg-white shadow transition-transform duration-200\"\n style={{\n width: 22,\n height: 22,\n transform: checked ? 'translateX(23px)' : 'translateX(3px)',\n }}\n />\n </button>\n );\n}\n","/**\n * Settings Screen Modal\n * Location selector, dark mode toggle, theme skin picker, and links (Privacy Policy, Terms of Use).\n */\n\nimport { useState } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { DarkModeIcon, ChevronRight } from '../ui/icons';\nimport { ToggleSwitch } from '../ui/ToggleSwitch';\n// import { SkinSwatch } from '../ui/SkinSwatch';\n// import { SKINS } from '../../data/cryptoData';\n\nconst SETTINGS_LINKS = [\n { label: 'Privacy policy', href: 'https://nowramp.com/privacy-policy' },\n { label: 'Terms of use', href: 'https://nowramp.com/terms-and-conditions' },\n];\n\nexport interface SettingsScreenProps {\n onClose: () => void;\n darkMode: boolean;\n onToggleDarkMode: (v: boolean) => void;\n skinId: string;\n onSelectSkin: (id: string) => void;\n /** Show dark mode toggle (default: true) */\n showThemeToggle?: boolean;\n /** Currently detected/selected country code */\n country?: string;\n /** Display name for the country */\n countryName?: string;\n /** Callback when location row is pressed */\n onLocationPress?: () => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n}\n\nexport function SettingsScreen({\n onClose,\n darkMode,\n onToggleDarkMode,\n skinId: _skinId,\n onSelectSkin: _onSelectSkin,\n showThemeToggle = true,\n country,\n countryName,\n onLocationPress,\n assetBaseUrl = '',\n}: SettingsScreenProps) {\n void _skinId;\n void _onSelectSkin;\n\n const [flagError, setFlagError] = useState(false);\n\n return (\n <>\n <div className=\"flex justify-end items-center px-5 pt-5\">\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"px-5 flex-1 pt-6 overflow-y-auto custom-scroll\">\n {/* Location row */}\n {onLocationPress && (\n <>\n <div style={{ borderTop: '1px solid var(--t-divider)' }}>\n <button\n onClick={onLocationPress}\n className=\"flex items-center justify-between w-full py-5 transition-colors\"\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer', padding: '20px 0' }}\n >\n <div className=\"flex items-center gap-3.5\">\n {country && !flagError ? (\n <img\n src={`${assetBaseUrl}/flags/${country.toLowerCase()}.svg`}\n alt={country}\n width={40}\n height={40}\n style={{ width: 40, height: 40, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setFlagError(true)}\n />\n ) : (\n <GlobeIcon size={40} />\n )}\n <div className=\"text-left\">\n <span\n className=\"font-medium text-[15px] block\"\n style={{ color: 'var(--t-text)' }}\n >\n Location\n </span>\n {countryName && (\n <span\n className=\"text-[13px]\"\n style={{ color: 'var(--t-text-secondary)' }}\n >\n {countryName}\n </span>\n )}\n </div>\n </div>\n <ChevronRight />\n </button>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </>\n )}\n\n {/* Dark mode toggle */}\n {showThemeToggle && (\n <>\n <div style={{ borderTop: onLocationPress ? 'none' : '1px solid var(--t-divider)' }}>\n <div className=\"flex items-center justify-between w-full py-5\">\n <div className=\"flex items-center gap-3.5\">\n <DarkModeIcon size={40} />\n <span\n className=\"font-medium text-[15px]\"\n style={{ color: 'var(--t-text)' }}\n >\n Dark Mode\n </span>\n </div>\n <ToggleSwitch checked={darkMode} onChange={onToggleDarkMode} accentColor=\"#4CD964\" />\n </div>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </>\n )}\n\n {/* Skin picker — controlled via code props only, hidden from end-user settings */}\n {/* <div className=\"py-5\">\n <div\n className=\"text-[15px] font-medium mb-4\"\n style={{ color: 'var(--t-text)' }}\n >\n Theme\n </div>\n <div className=\"flex gap-3\">\n {SKINS.map(skin => (\n <SkinSwatch\n key={skin.id}\n skin={skin}\n active={skin.id === skinId}\n dimmed={hasCustomAccent}\n onClick={() => onSelectSkin(skin.id)}\n darkMode={darkMode}\n />\n ))}\n </div>\n </div>\n <div style={{ height: 1, background: 'var(--t-divider)' }} /> */}\n\n {/* Links: Privacy Policy, Terms of Use */}\n {SETTINGS_LINKS.map((item) => (\n <div key={item.label}>\n <a\n href={item.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-between w-full py-5 transition-colors\"\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n <span\n className=\"font-medium text-[15px]\"\n style={{ color: 'var(--t-text)' }}\n >\n {item.label}\n </span>\n <ChevronRight />\n </a>\n <div style={{ height: 1, background: 'var(--t-divider)' }} />\n </div>\n ))}\n </div>\n </>\n );\n}\n\nfunction GlobeIcon({ size = 40 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <ellipse cx=\"20\" cy=\"20\" rx=\"9\" ry=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <line x1=\"2\" y1=\"20\" x2=\"38\" y2=\"20\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" />\n <path d=\"M5 12h30M5 28h30\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n","/**\n * Country Picker Modal\n * Searchable list of countries with flag icons.\n * Follows the FiatCurrencyModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { COUNTRIES, COUNTRY_MAP } from '../../data/countries';\n\nexport interface CountryPickerModalProps {\n onClose: () => void;\n onSelect: (countryCode: string) => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n /** Currently selected country code */\n selectedCode?: string;\n}\n\nexport function CountryPickerModal({\n onClose,\n onSelect,\n assetBaseUrl = '',\n selectedCode,\n}: CountryPickerModalProps) {\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const normalizedCode = selectedCode.toLowerCase();\n const selected = COUNTRY_MAP[normalizedCode];\n if (selected) {\n const rest = COUNTRIES.filter((c) => c.code !== normalizedCode);\n return [selected, ...rest];\n }\n }\n return COUNTRIES;\n }\n\n return COUNTRIES.filter(\n (c) =>\n c.name.toLowerCase().includes(raw) ||\n c.code.includes(raw) ||\n c.defaultFiat.toLowerCase().includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n <div className=\"flex justify-end px-5 pt-5\">\n <CloseButton onClick={onClose} />\n </div>\n <h2\n className=\"text-center text-[17px] font-medium mt-2 mb-6\"\n style={{\n color: 'var(--t-text)',\n fontSize: 17,\n fontWeight: 500,\n marginTop: 8,\n marginBottom: 24,\n }}\n >\n Select your country\n </h2>\n <SearchInput value={search} onChange={setSearch} />\n <div className=\"flex-1 overflow-y-auto custom-scroll px-5\">\n {filtered.map((c, idx) => {\n const isSelected = selectedCode?.toLowerCase() === c.code;\n return (\n <div key={c.code}>\n <button\n onClick={() => onSelect(c.code)}\n className=\"flex items-center w-full transition-colors rounded-lg hover-item\"\n style={{ color: 'var(--t-text)', gap: 14, padding: '18px 8px', margin: '0 -8px' }}\n >\n <CountryFlag code={c.code} size={32} baseUrl={assetBaseUrl} />\n <div className=\"text-left flex-1\">\n <span className=\"font-semibold text-[15px]\">{c.name}</span>\n <span className=\"text-[13px] ml-2\" style={{ color: 'var(--t-text-secondary)' }}>\n {c.defaultFiat}\n </span>\n </div>\n {isSelected && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n {idx < filtered.length - 1 && (\n <div\n style={{ height: 1, background: 'var(--t-divider, rgba(255,255,255,0.08))' }}\n />\n )}\n </div>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n No countries found\n </div>\n )}\n </div>\n </>\n );\n}\n\n/** Country flag image using the /flags/{code}.svg pattern */\nfunction CountryFlag({ code, size = 32, baseUrl = '' }: { code: string; size?: number; baseUrl?: string }) {\n const [error, setError] = useState(false);\n\n if (error) {\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'var(--t-pill-bg, #333)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: size * 0.4,\n color: 'var(--t-text-muted)',\n }}\n >\n {code.toUpperCase().slice(0, 2)}\n </div>\n );\n }\n\n return (\n <img\n src={`${baseUrl}/flags/${code}.svg`}\n alt={code}\n width={size}\n height={size}\n style={{ width: size, height: size, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setError(true)}\n />\n );\n}\n","/**\n * RampForm\n * Main single-screen form with modal overlays (new NowRamp design).\n * Replaces the old multi-step wizard.\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { RampProvider, useRamp, type RampProviderProps } from '../context/RampContext';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { CheckoutStep } from './CheckoutStep';\nimport { ProcessingStep } from './ProcessingStep';\nimport { CompleteStep } from './CompleteStep';\nimport { ErrorStep } from './ErrorStep';\nimport { ConfirmStep } from './ConfirmStep';\nimport { Modal } from './ui/Modal';\nimport { AnimatedNumber } from './ui/AnimatedNumber';\nimport { Skeleton, FormSkeleton } from './ui/Skeleton';\nimport { CryptoIcon, FiatFlag, ChevronDown, MenuIcon } from './ui/icons';\nimport { FiatCurrencyModal } from './modals/FiatCurrencyModal';\nimport { CryptoCurrencyModal } from './modals/CryptoCurrencyModal';\nimport { PaymentMethodModal } from './modals/PaymentMethodModal';\nimport { SettingsScreen } from './modals/SettingsScreen';\nimport { CountryPickerModal } from './modals/CountryPickerModal';\nimport { COUNTRY_MAP } from '../data/countries';\nimport {\n\tSKINS,\n\tparseAmount,\n\tformatOutput,\n\tisValidHex,\n\tisStablecoin,\n\tMIN_FIAT_AMOUNT,\n\tMIN_CRYPTO_AMOUNT,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\ttype Skin,\n} from '../data/cryptoData';\nimport type { Transaction } from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RampFormProps extends Omit<RampProviderProps, 'children'> {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\t/** Skin preset ID */\n\tskinId?: string;\n\t/** Custom accent color override (hex) */\n\taccentColor?: string;\n\t/** Custom background color override (hex) */\n\tbgColor?: string;\n\t/** Custom background image URL */\n\tbgImage?: string;\n\t/** Custom border color (hex) */\n\tborderColor?: string;\n\t/** Custom border radius (CSS value, e.g. '5px') */\n\tborderRadius?: string;\n\t// Extended theme color overrides\n\t/** Surface/card background color (hex) */\n\tsurfaceColor?: string;\n\t/** Input/pill background color (hex) */\n\tinputBgColor?: string;\n\t/** Primary text color (hex) */\n\ttextColor?: string;\n\t/** Secondary/label text color (hex) */\n\ttextSecondaryColor?: string;\n\t/** Muted text color (hex) */\n\ttextMutedColor?: string;\n\t/** Success/rate indicator color (hex) */\n\tsuccessColor?: string;\n\t/** Show Buy/Sell flow toggle (default: true). Set false to lock to the provided flowType. */\n\tshowFlowToggle?: boolean;\n\t/** Show settings menu icon (default: true). Set false to hide settings entirely. */\n\tshowSettings?: boolean;\n\t/** Show dark mode toggle in settings (default: true). Set false to hide theme switching. */\n\tshowThemeToggle?: boolean;\n\t/** Auto-redirect for redirect checkouts */\n\tautoRedirect?: boolean;\n\t/** Block explorer URL pattern */\n\texplorerUrl?: string;\n\t/** Done button text */\n\tdoneButtonText?: string;\n\t/** Support email */\n\tsupportEmail?: string;\n\t/** Show email field in wallet step */\n\tshowEmail?: boolean;\n\t/** Require email */\n\trequireEmail?: boolean;\n\t/** Show fee-free stablecoin amount (partner absorbs fees) */\n\tstablecoinParity?: boolean;\n\t/** Partner display name for parity info banner */\n\tpartnerName?: string;\n\t/** Callback when user clicks done */\n\tonDone?: () => void;\n\tonComplete?: (status: Transaction) => void;\n\tonError?: (error: Error) => void;\n}\n\n// =============================================================================\n// Inner Form\n// =============================================================================\n\ninterface InnerFormProps {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\tskinId?: string;\n\taccentColor?: string;\n\tbgColor?: string;\n\tbgImage?: string;\n\tborderColor?: string;\n\tborderRadius?: string;\n\tsurfaceColor?: string;\n\tinputBgColor?: string;\n\ttextColor?: string;\n\ttextSecondaryColor?: string;\n\ttextMutedColor?: string;\n\tsuccessColor?: string;\n\tshowFlowToggle?: boolean;\n\tshowSettings?: boolean;\n\tshowThemeToggle?: boolean;\n\tautoRedirect?: boolean;\n\texplorerUrl?: string;\n\tdoneButtonText?: string;\n\tsupportEmail?: string;\n\tstablecoinParity?: boolean;\n\tpartnerName?: string;\n\tonDone?: () => void;\n}\n\ntype ModalType = 'fiat' | 'crypto' | 'payment' | 'settings' | 'country' | null;\n\nfunction InnerForm({\n\tclassName = '',\n\ttheme = 'dark',\n\tskinId: skinIdProp = 'mono',\n\taccentColor: accentColorProp,\n\tbgColor: bgColorProp,\n\tbgImage: bgImageProp,\n\tborderColor: borderColorProp,\n\tborderRadius: borderRadiusProp,\n\tsurfaceColor: surfaceColorProp,\n\tinputBgColor: inputBgColorProp,\n\ttextColor: textColorProp,\n\ttextSecondaryColor: textSecondaryColorProp,\n\ttextMutedColor: textMutedColorProp,\n\tsuccessColor: successColorProp,\n\tshowFlowToggle = true,\n\tshowSettings = true,\n\tshowThemeToggle = true,\n\tautoRedirect = false,\n\texplorerUrl,\n\tdoneButtonText = 'Done',\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tonDone,\n}: InnerFormProps) {\n\tconst {\n\t\tstate,\n\t\tdispatch,\n\t\tconfig,\n\t\tconfigLoading,\n\t\tquotes,\n\t\tquotesLoading,\n\t\tquotesError,\n\t\tfetchQuotes,\n\t\tcreateOrder,\n\t\torderLoading,\n\t\tamountError,\n\t\tfieldLocks,\n\t\tapiConfig,\n\t\tassetBaseUrl,\n\t\tavailableFiats,\n\t\tavailableCryptos,\n\t\tavailablePaymentMethods,\n\t\tselectionUnsupported,\n\t} = useRamp();\n\n\t// Local UI state\n\tconst [darkMode, setDarkMode] = useState(theme === 'dark');\n\tconst [skinId, setSkinId] = useState(skinIdProp);\n\tconst [modal, setModal] = useState<ModalType>(null);\n\tconst [amountTouched, setAmountTouched] = useState(false);\n\tconst [walletTouched, setWalletTouched] = useState(false);\n\tconst [walletFocused, setWalletFocused] = useState(false);\n\tconst [walletValidating, setWalletValidating] = useState(false);\n\tconst [walletServerValid, setWalletServerValid] = useState<boolean | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [switching, setSwitching] = useState(false);\n\tconst [autoSelectPending, setAutoSelectPending] = useState(false);\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst walletValidationTimer = useRef<ReturnType<typeof setTimeout>>();\n\tconst prevTabRef = useRef(state.flowType);\n\n\t// Sync darkMode with theme prop\n\tuseEffect(() => {\n\t\tsetDarkMode(theme === 'dark');\n\t}, [theme]);\n\n\t// Initial load animation\n\tuseEffect(() => {\n\t\tconst t = setTimeout(() => setLoading(false), configLoading ? 0 : 800);\n\t\treturn () => clearTimeout(t);\n\t}, [configLoading]);\n\n\t// Tab switching animation\n\tuseEffect(() => {\n\t\tif (prevTabRef.current !== state.flowType && !loading) {\n\t\t\tprevTabRef.current = state.flowType;\n\t\t\tsetSwitching(true);\n\t\t\tsetAmountTouched(false);\n\t\t\tsetWalletTouched(false);\n\t\t\tconst t = setTimeout(() => setSwitching(false), 350);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevTabRef.current = state.flowType;\n\t}, [state.flowType, loading]);\n\n\tconst tab = state.flowType;\n\tconst isBuy = tab === 'buy';\n\n\t// Compute display values from real quotes only\n\tconst cryptoCode = state.cryptoCurrency || 'BTC';\n\tconst fiatCode = state.fiatCurrency || 'USD';\n\tconst spendAmount = isBuy ? state.fiatAmount : state.cryptoAmount;\n\tconst spendNumeric = parseAmount(spendAmount);\n\n\tconst quoteRate = quotes?.bestQuote?.exchangeRate\n\t\t? parseFloat(quotes.bestQuote.exchangeRate)\n\t\t: null;\n\n\t// Persist last known rate so it stays visible between quote fetches\n\tconst lastRateRef = useRef<{ rate: number; crypto: string; fiat: string } | null>(null);\n\tif (quoteRate && cryptoCode && fiatCode) {\n\t\tlastRateRef.current = { rate: quoteRate, crypto: cryptoCode, fiat: fiatCode };\n\t}\n\n\tconst receiveAmount = useMemo(() => {\n\t\tif (quotes?.bestQuote) {\n\t\t\tconst amt = isBuy ? quotes.bestQuote.cryptoAmount : quotes.bestQuote.fiatAmount;\n\t\t\tif (amt) return amt;\n\t\t}\n\t\treturn '0';\n\t}, [quotes, isBuy]);\n\n\t// Stablecoin parity: partner absorbs fees, credits user full amount\n\t// Same-peg (crypto code contains fiat code) → 1:1 fiat amount.\n\t// Cross-currency → FX-convert via quote rate.\n\tconst parityActive = !!(stablecoinParity && partnerName && isBuy && isStablecoin(cryptoCode) && quoteRate);\n\tconst isSamePeg = parityActive && cryptoCode.toUpperCase().includes(fiatCode.toUpperCase());\n\tconst parityAmount = parityActive && spendNumeric > 0\n\t\t? formatOutput(isSamePeg ? spendNumeric : spendNumeric / quoteRate)\n\t\t: null;\n\tconst displayReceiveAmount = parityActive && parityAmount ? parityAmount : receiveAmount;\n\n\tconst displayRate = useMemo(() => {\n\t\tconst r = quoteRate || lastRateRef.current?.rate;\n\t\tconst cc = quoteRate ? cryptoCode : lastRateRef.current?.crypto;\n\t\tconst fc = quoteRate ? fiatCode : lastRateRef.current?.fiat;\n\t\tif (!r || !cc || !fc) return '';\n\t\treturn `1 ${cc} ≈ ${r.toFixed(2)} ${fc}`;\n\t}, [cryptoCode, fiatCode, quoteRate]);\n\n\t// Server-side wallet address validation (debounced with AbortController)\n\tuseEffect(() => {\n\t\tconst addr = state.walletAddress.trim();\n\t\tconst network = state.network;\n\n\t\t// Reset when empty\n\t\tif (!addr || addr.length < 10) {\n\t\t\tsetWalletServerValid(null);\n\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\treturn;\n\t\t}\n\n\t\tsetWalletValidating(true);\n\t\tsetWalletServerValid(null);\n\n\t\tconst abortController = new AbortController();\n\n\t\tclearTimeout(walletValidationTimer.current);\n\t\twalletValidationTimer.current = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${apiConfig.apiUrl}/public/validate/address`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ address: addr, ...(network ? { network } : {}) }),\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t});\n\t\t\t\tconst data = await res.json();\n\t\t\t\tconst result = data.data?.attributes || data.data || data;\n\t\t\t\tif (result.isValid) {\n\t\t\t\t\tsetWalletServerValid(true);\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\t\t} else {\n\t\t\t\t\tsetWalletServerValid(false);\n\t\t\t\t\tconst msg = result.errors?.[0] || result.details?.formatMessage || 'Invalid wallet address';\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: msg });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Ignore aborted requests; network errors don't block the user\n\t\t\t\tif (err instanceof DOMException && err.name === 'AbortError') return;\n\t\t\t\tsetWalletServerValid(null);\n\t\t\t} finally {\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tsetWalletValidating(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 500);\n\n\t\treturn () => {\n\t\t\tclearTimeout(walletValidationTimer.current);\n\t\t\tabortController.abort();\n\t\t};\n\t}, [state.walletAddress, state.network, apiConfig.apiUrl]);\n\n\t// Validation — use server-provided limits (amountError) as source of truth, fall back to hardcoded\n\tconst amountIsEmpty = !spendAmount || spendNumeric === 0;\n\tconst amountBelowMin = spendNumeric > 0 && (isBuy ? spendNumeric < MIN_FIAT_AMOUNT : spendNumeric < MIN_CRYPTO_AMOUNT);\n\tconst hasAmountError = !!amountError || amountBelowMin || (amountTouched && amountIsEmpty);\n\tconst isAmountValid = spendNumeric > 0 && !amountError && !amountBelowMin;\n\tconst isWalletValid = state.walletAddress.trim().length >= 10 && walletServerValid !== false && !walletValidating;\n\tconst isFormValid = isAmountValid && isWalletValid && !!state.cryptoCurrency && !!state.network;\n\n\tconst handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tlet raw = e.target.value.replace(/[^0-9.,]/g, '');\n\t\t// Limit decimal places: 2 for fiat, 6 for crypto\n\t\tconst maxDecimals = isBuy ? 2 : 6;\n\t\tconst dotIndex = raw.indexOf('.');\n\t\tif (dotIndex !== -1 && raw.length - dotIndex - 1 > maxDecimals) {\n\t\t\traw = raw.slice(0, dotIndex + maxDecimals + 1);\n\t\t}\n\t\tif (isBuy) {\n\t\t\tdispatch({ type: 'SET_FIAT_AMOUNT', amount: raw });\n\t\t} else {\n\t\t\tdispatch({ type: 'SET_CRYPTO_AMOUNT', amount: raw });\n\t\t}\n\t};\n\n\tconst handleTabSwitch = (newTab: 'buy' | 'sell') => {\n\t\tif (newTab === tab) return;\n\t\tdispatch({ type: 'SET_FLOW_TYPE', flowType: newTab, fieldLocks });\n\t};\n\n\tconst handleFiatSelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_FIAT_CURRENCY', currency: code });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCryptoSelect = useCallback(\n\t\t(code: string, chain: string) => {\n\t\t\tdispatch({ type: 'SET_CRYPTO_CURRENCY', currency: code });\n\t\t\tdispatch({ type: 'SET_CRYPTO_CHAIN', chain });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handlePaymentMethodSelect = useCallback(\n\t\t(methodId: string) => {\n\t\t\tdispatch({ type: 'SET_PAYMENT_METHOD', methodId });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCountrySelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_COUNTRY', country: code });\n\t\t\tsetModal(null);\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleLocationPress = useCallback(() => {\n\t\t// Close settings, then open country picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('country'), 280);\n\t}, []);\n\n\tconst countryName = state.country ? COUNTRY_MAP[state.country.toLowerCase()]?.name : undefined;\n\n\tconst handleCtaClick = () => {\n\t\tif (!isFormValid) return;\n\t\tsetAutoSelectPending(true);\n\t\tfetchQuotes();\n\t};\n\n\t// Auto-select best quote when quotes arrive after CTA click\n\tuseEffect(() => {\n\t\tif (!autoSelectPending || quotesLoading) return;\n\n\t\tif (quotes?.bestQuote) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t\tcreateOrder().catch(() => {\n\t\t\t\t// Error handled by context\n\t\t\t});\n\t\t} else if (quotesError) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SET_ERROR', message: quotesError.message || 'No quotes available' });\n\t\t} else if (quotes && !quotes.bestQuote) {\n\t\t\t// Quotes loaded successfully but no providers available\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst reasons = (quotes as any).unavailableGateways\n\t\t\t\t?.map((g: any) => g.reason)\n\t\t\t\t.filter(Boolean);\n\t\t\tconst message = reasons?.length\n\t\t\t\t? `No providers available: ${reasons.join('; ')}`\n\t\t\t\t: 'No providers available for this currency/network combination';\n\t\t\tdispatch({ type: 'SET_ERROR', message });\n\t\t}\n\t}, [autoSelectPending, quotes, quotesLoading, quotesError, dispatch, createOrder]);\n\n\t// Theme computation\n\tconst themeClass = darkMode ? 'theme-dark' : 'theme-light';\n\tconst activeSkin = SKINS.find((s: Skin) => s.id === skinId) || SKINS[0];\n\tconst isMono = activeSkin.accent === null;\n\n\tconst hasCustomAccent = accentColorProp ? isValidHex(accentColorProp) : false;\n\n\t// Auto-detect best text color for CTA based on accent luminance\n\tconst getCtaTextColor = (hex: string): string => {\n\t\tconst c = hex.replace('#', '');\n\t\tconst r = parseInt(c.substring(0, 2), 16);\n\t\tconst g = parseInt(c.substring(2, 4), 16);\n\t\tconst b = parseInt(c.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#000000' : '#ffffff';\n\t};\n\n\tconst accentStyle: Record<string, string> = hasCustomAccent\n\t\t? { '--t-accent': accentColorProp!, '--t-cta-bg': accentColorProp!, '--t-cta-text': getCtaTextColor(accentColorProp!) }\n\t\t: isMono\n\t\t\t? {\n\t\t\t\t\t'--t-accent': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-bg': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-text': darkMode ? '#000000' : '#ffffff',\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t'--t-accent': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-bg': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-text': getCtaTextColor(activeSkin.accent!),\n\t\t\t\t};\n\n\t// Extended theme overrides\n\tconst themeOverrides: Record<string, string> = {};\n\tif (surfaceColorProp && isValidHex(surfaceColorProp)) {\n\t\tthemeOverrides['--t-surface'] = surfaceColorProp;\n\t\tthemeOverrides['--t-modal-bg'] = surfaceColorProp;\n\t}\n\tif (inputBgColorProp && isValidHex(inputBgColorProp)) {\n\t\tthemeOverrides['--t-pill-bg'] = inputBgColorProp;\n\t\tthemeOverrides['--t-close-bg'] = inputBgColorProp;\n\t}\n\tif (textColorProp && isValidHex(textColorProp)) {\n\t\tthemeOverrides['--t-text'] = textColorProp;\n\t}\n\tif (textSecondaryColorProp && isValidHex(textSecondaryColorProp)) {\n\t\tthemeOverrides['--t-text-secondary'] = textSecondaryColorProp;\n\t}\n\tif (textMutedColorProp && isValidHex(textMutedColorProp)) {\n\t\tthemeOverrides['--t-text-muted'] = textMutedColorProp;\n\t\tthemeOverrides['--t-text-tertiary'] = textMutedColorProp;\n\t}\n\tif (successColorProp && isValidHex(successColorProp)) {\n\t\tthemeOverrides['--t-success'] = successColorProp;\n\t}\n\n\tconst backgroundStyle: Record<string, string> = {};\n\tif (bgColorProp && isValidHex(bgColorProp)) {\n\t\tbackgroundStyle.backgroundColor = bgColorProp;\n\t} else {\n\t\tbackgroundStyle.backgroundColor = 'var(--t-bg)';\n\t}\n\tif (bgImageProp && (bgImageProp.startsWith('https://') || bgImageProp.startsWith('data:image/'))) {\n\t\tbackgroundStyle.backgroundImage = `url(${bgImageProp})`;\n\t\tbackgroundStyle.backgroundSize = 'cover';\n\t\tbackgroundStyle.backgroundPosition = 'center';\n\t}\n\n\t// Pill text: always high-contrast against pill background (not affected by textColor override)\n\tconst pillTextColor = darkMode ? '#ffffff' : '#111111';\n\n\tconst borderStyle: Record<string, string> = {};\n\tif (borderColorProp && isValidHex(borderColorProp)) {\n\t\tborderStyle.border = `1px solid ${borderColorProp}`;\n\t}\n\tif (borderRadiusProp) {\n\t\tborderStyle.borderRadius = borderRadiusProp;\n\t}\n\n\t// If we're in a post-form step, render inside the same themed container\n\tconst postFormStep =\n\t\tstate.step === 'checkout' ? <CheckoutStep autoRedirect={autoRedirect} /> :\n\t\tstate.step === 'processing' ? <ProcessingStep /> :\n\t\tstate.step === 'complete' ? <CompleteStep explorerUrl={explorerUrl} doneButtonText={doneButtonText} onDone={onDone} /> :\n\t\tstate.step === 'error' ? <ErrorStep supportEmail={supportEmail} /> :\n\t\tstate.step === 'confirm' ? <ConfirmStep stablecoinParity={parityActive} partnerName={partnerName} /> :\n\t\tnull;\n\n\tif (postFormStep) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] h-[640px] overflow-hidden flex flex-col select-none transition-colors duration-300 ${className}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t\t...backgroundStyle,\n\t\t\t\t\t...accentStyle,\n\t\t\t\t\t...themeOverrides,\n\t\t\t\t\t...borderStyle,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{postFormStep}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst chainCode = state.network;\n\tconst chainInfo = chainCode ? getChainInfo(chainCode) : null;\n\tconst chainDisplay = chainInfo?.shortName || chainInfo?.name || chainCode;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] min-h-[640px] overflow-hidden flex flex-col select-none transition-colors duration-300 ${className}`}\n\t\t\tstyle={{\n\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t...backgroundStyle,\n\t\t\t\t...accentStyle,\n\t\t\t\t...themeOverrides,\n\t\t\t\t...borderStyle,\n\t\t\t}}\n\t\t>\n\t\t\t{/* Menu icon */}\n\t\t\t{showSettings && (\n\t\t\t\t<div className={`flex justify-end items-center px-5 pt-3 ${showFlowToggle ? 'pb-1' : 'pb-5'}`}>\n\t\t\t\t\t<MenuIcon onClick={() => setModal('settings')} />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Buy / Sell tabs */}\n\t\t\t{showFlowToggle ? (\n\t\t\t\t<div className=\"flex flex-col items-center pt-3 pb-5\">\n\t\t\t\t\t<div className=\"flex\" style={{ width: 165 }}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => handleTabSwitch('buy')}\n\t\t\t\t\t\t\tclassName=\"flex-1 pb-2.5 text-[16px] font-medium text-center transition-colors duration-200\"\n\t\t\t\t\t\t\tstyle={{ color: tab === 'buy' ? 'var(--t-text)' : 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tBuy\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => handleTabSwitch('sell')}\n\t\t\t\t\t\t\tclassName=\"flex-1 pb-2.5 text-[16px] font-medium text-center transition-colors duration-200\"\n\t\t\t\t\t\t\tstyle={{ color: tab === 'sell' ? 'var(--t-text)' : 'var(--t-text-secondary)' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSell\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"relative\" style={{ width: 165, height: 1 }}>\n\t\t\t\t\t\t<div className=\"absolute inset-0\" style={{ background: 'var(--t-divider)' }} />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"absolute top-0 h-full transition-all duration-300 ease-in-out\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '50%',\n\t\t\t\t\t\t\t\tleft: tab === 'buy' ? '0%' : '50%',\n\t\t\t\t\t\t\t\tbackground: 'var(--t-accent)',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{loading || switching || configLoading ? (\n\t\t\t\t<FormSkeleton />\n\t\t\t) : (\n\t\t\t\t<div key={tab} className=\"flex-1 overflow-hidden px-5 flex flex-col tab-fade-in\">\n\t\t\t\t\t{/* You spend card */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"px-[18px] pt-[14px] pb-[18px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tborder:\n\t\t\t\t\t\t\t\tamountTouched && hasAmountError ? '1px solid #EF4444' : '1px solid transparent',\n\t\t\t\t\t\t\tminHeight: 102,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\tYou spend\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={spendAmount}\n\t\t\t\t\t\t\t\tonChange={handleAmountChange}\n\t\t\t\t\t\t\t\tonBlur={() => setAmountTouched(true)}\n\t\t\t\t\t\t\t\tplaceholder={isBuy ? '250' : '0.01'}\n\t\t\t\t\t\t\t\tclassName=\"bg-transparent outline-none w-0 flex-1 mr-3\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 24, fontWeight: 600, lineHeight: '32px', padding: 0, border: 'none', borderRadius: 0, backgroundColor: 'transparent', height: 'auto', width: 0 }}\n\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceAmount?.locked}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{isBuy ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setModal('fiat')}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 shrink-0 transition-colors\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceCurrency?.locked}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FiatFlag currencyCode={fiatCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t{fiatCode}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-end shrink-0\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={() => setModal('crypto')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 transition-colors\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationCurrency?.locked}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoIcon ticker={cryptoCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t\t{cryptoCode}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{chainCode && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(chainCode, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={chainCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 14, height: 14 }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{chainDisplay}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{amountTouched && hasAmountError && (\n\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5 px-[2px]\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t{amountError\n\t\t\t\t\t\t\t\t|| (amountIsEmpty\n\t\t\t\t\t\t\t\t\t? 'Amount should be more than 0'\n\t\t\t\t\t\t\t\t\t: isBuy\n\t\t\t\t\t\t\t\t\t\t? `Minimum amount is ${MIN_FIAT_AMOUNT} ${fiatCode}`\n\t\t\t\t\t\t\t\t\t\t: `Minimum amount is ${MIN_CRYPTO_AMOUNT} ${cryptoCode}`)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* You get card */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\tborderTopLeftRadius: 5,\n\t\t\t\t\t\t\tborderTopRightRadius: 5,\n\t\t\t\t\t\t\tborderBottomLeftRadius: 0,\n\t\t\t\t\t\t\tborderBottomRightRadius: 0,\n\t\t\t\t\t\t\tmarginTop: 4,\n\t\t\t\t\t\t\tminHeight: 102,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\tYou get\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-start justify-between\">\n\t\t\t\t\t\t\t{quotesLoading && !autoSelectPending ? (\n\t\t\t\t\t\t\t\t<Skeleton w={180} h={32} />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<AnimatedNumber\n\t\t\t\t\t\t\t\t\tvalue={spendNumeric > 0 ? displayReceiveAmount : '0'}\n\t\t\t\t\t\t\t\t\theight={32}\n\t\t\t\t\t\t\t\t\tclassName=\"font-semibold\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: spendNumeric > 0 ? 'var(--t-text)' : 'var(--t-text-muted)', fontSize: 24 }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{isBuy ? (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-col items-end shrink-0\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={() => setModal('crypto')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 transition-colors\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationCurrency?.locked}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CryptoIcon ticker={cryptoCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t\t{cryptoCode}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{chainCode && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(chainCode, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt={chainCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 14, height: 14 }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{chainDisplay}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setModal('fiat')}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 shrink-0 transition-colors\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-pill-bg)',\n\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\t\t\t\theight: 32,\n\t\t\t\t\t\t\t\t\t\tpaddingLeft: 10,\n\t\t\t\t\t\t\t\t\t\tpaddingRight: 10,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={!!fieldLocks?.sourceCurrency?.locked}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FiatFlag currencyCode={fiatCode} size={16} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: pillTextColor }}>\n\t\t\t\t\t\t\t\t\t\t{fiatCode}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<ChevronDown />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Parity info banner */}\n\t\t\t\t\t{parityActive && spendNumeric > 0 && quotes?.bestQuote && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 mt-[2px] px-[14px] py-[10px]\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', fontSize: 12, color: 'var(--t-text-secondary)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0, marginTop: 1 }}>\n\t\t\t\t\t\t\t\t<circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n\t\t\t\t\t\t\t\t<path d=\"M8 7v4M8 5.5v-.01\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\tYou will be charged for {receiveAmount} {cryptoCode}, the rest up to {formatOutput(spendNumeric)} {fiatCode} will be credited to your {partnerName} account\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Exchange rate row */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-between mt-[2px] px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t...(!availablePaymentMethods.length && !config?.paymentMethods?.length ? { borderBottomLeftRadius: 5, borderBottomRightRadius: 5 } : {}),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: successColorProp ? 'var(--t-success)' : 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t{displayRate || '\\u00A0'}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Payment method selector */}\n\t\t\t\t\t{(availablePaymentMethods.length > 0 || (config?.paymentMethods && config.paymentMethods.length > 0)) && (\n\t\t\t\t\t\t<div className=\"mt-[2px]\">\n\t\t\t\t\t\t\t{availablePaymentMethods.length > 0 ? (\n\t\t\t\t\t\t\t\t<PaymentMethodSelector\n\t\t\t\t\t\t\t\t\tmethods={availablePaymentMethods}\n\t\t\t\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\t\t\t\tonOpenModal={() => setModal('payment')}\n\t\t\t\t\t\t\t\t\tfiatCurrency={state.fiatCurrency}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\t\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t\tNo payment methods for this pair\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Wallet address */}\n\t\t\t\t\t<div className=\"mt-8\">\n\t\t\t\t\t\t<div className=\"text-[13px] mb-2.5\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t{isBuy ? 'Receiving wallet address' : 'Sending wallet address'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tvalue={state.walletAddress}\n\t\t\t\t\t\t\tonChange={(e) => dispatch({ type: 'SET_WALLET_ADDRESS', address: e.target.value })}\n\t\t\t\t\t\t\tonFocus={() => setWalletFocused(true)}\n\t\t\t\t\t\t\tonBlur={() => { setWalletFocused(false); setWalletTouched(true); }}\n\t\t\t\t\t\t\tplaceholder={isBuy ? 'Enter your receiving address' : 'Enter your sending address'}\n\t\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tclassName=\"w-full bg-transparent text-[13px] outline-none transition-colors\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tborder:\n\t\t\t\t\t\t\t\t\tstate.walletError || (walletTouched && !isWalletValid)\n\t\t\t\t\t\t\t\t\t\t? '1px solid #EF4444'\n\t\t\t\t\t\t\t\t\t\t: walletFocused\n\t\t\t\t\t\t\t\t\t\t\t? '1px solid var(--t-border-focus)'\n\t\t\t\t\t\t\t\t\t\t\t: '1px solid var(--t-border)',\n\t\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\t\tboxShadow: 'none',\n\t\t\t\t\t\t\t\tborderRadius: 3.5,\n\t\t\t\t\t\t\t\theight: 47,\n\t\t\t\t\t\t\t\tpadding: '0 14px',\n\t\t\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\t\t\tfontSize: 13,\n\t\t\t\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationAddress?.locked}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{state.walletError ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t\t{state.walletError}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : walletTouched && !isWalletValid && !walletValidating ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\t\tEnter a valid wallet address\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : walletValidating && state.walletAddress.trim().length >= 10 ? (\n\t\t\t\t\t\t\t<div className=\"text-[12px] mt-1.5\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\tValidating address...\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex-1\" style={{ minHeight: 16 }} />\n\n\t\t\t\t\t{/* Unsupported selection message */}\n\t\t\t\t\t{selectionUnsupported && (\n\t\t\t\t\t\t<div className=\"text-[12px] text-center mb-2\" style={{ color: '#EF4444' }}>\n\t\t\t\t\t\t\tThis currency is not available for {isBuy ? 'buy' : 'sell'} orders\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* CTA button */}\n\t\t\t\t\t<button\n\t\t\t\t\t\tdisabled={!isFormValid || orderLoading || autoSelectPending || selectionUnsupported}\n\t\t\t\t\t\tonClick={handleCtaClick}\n\t\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t\t\topacity: isFormValid && !orderLoading && !autoSelectPending && !selectionUnsupported ? 1 : 0.4,\n\t\t\t\t\t\t\tcursor:\n\t\t\t\t\t\t\t\tisFormValid && !orderLoading && !autoSelectPending && !selectionUnsupported ? 'pointer' : 'not-allowed',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{autoSelectPending\n\t\t\t\t\t\t\t? 'Getting best price...'\n\t\t\t\t\t\t\t: orderLoading\n\t\t\t\t\t\t\t\t? 'Processing...'\n\t\t\t\t\t\t\t\t: isBuy\n\t\t\t\t\t\t\t\t\t? `Buy ${cryptoCode}`\n\t\t\t\t\t\t\t\t\t: `Sell ${cryptoCode}`}\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t<div className=\"text-center py-3\">\n\t\t\t\t\t\t<span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>\n\t\t\t\t\t\t\tPowered by NowRamp\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Modal overlays */}\n\t\t\t<Modal isOpen={modal === 'fiat'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<FiatCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(v) => {\n\t\t\t\t\t\t\thandleFiatSelect(v);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcurrencies={availableFiats.map((f) => ({ code: f.code, name: f.code }))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.fiatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'crypto'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CryptoCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code, chain) => {\n\t\t\t\t\t\t\thandleCryptoSelect(code, chain);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcryptos={availableCryptos.map((c) => ({\n\t\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\t\tname: c.code,\n\t\t\t\t\t\t\tnetworks: c.networks?.map((n) => ({ code: n.id, name: n.name })),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.cryptoCurrency}\n\t\t\t\t\t\tselectedChain={state.network}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'payment'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<PaymentMethodModal\n\t\t\t\t\t\tmethods={availablePaymentMethods}\n\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\tonSelect={(id) => {\n\t\t\t\t\t\t\thandlePaymentMethodSelect(id);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'settings'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<SettingsScreen\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\tonToggleDarkMode={setDarkMode}\n\t\t\t\t\t\tskinId={skinId}\n\t\t\t\t\t\tonSelectSkin={(id) => {\n\t\t\t\t\t\t\tsetSkinId(id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\t\tcountry={state.country}\n\t\t\t\t\t\tcountryName={countryName}\n\t\t\t\t\t\tonLocationPress={handleLocationPress}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'country'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CountryPickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\thandleCountrySelect(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.country}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t</div>\n\t);\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport function RampForm({\n\tprojectId,\n\tapiUrl,\n\tassetBaseUrl,\n\tflowType,\n\tcustomerId,\n\tbrandId,\n\tdefaultFiatCurrency,\n\tdefaultCryptoCurrency,\n\tdefaultNetwork,\n\tdefaultFiatAmount,\n\tdefaultCryptoAmount,\n\tdefaultWalletAddress,\n\tdefaultGateway,\n\tdefaultCountry,\n\tfieldLocks,\n\tstatusPollInterval,\n\tonComplete,\n\tonError,\n\tclassName,\n\ttheme,\n\tskinId,\n\taccentColor,\n\tbgColor,\n\tbgImage,\n\tborderColor,\n\tborderRadius,\n\tsurfaceColor,\n\tinputBgColor,\n\ttextColor,\n\ttextSecondaryColor,\n\ttextMutedColor,\n\tsuccessColor,\n\tshowFlowToggle,\n\tshowSettings,\n\tshowThemeToggle,\n\tautoRedirect,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tonDone,\n}: RampFormProps) {\n\treturn (\n\t\t<RampProvider\n\t\t\tprojectId={projectId}\n\t\t\tapiUrl={apiUrl}\n\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\tflowType={flowType}\n\t\t\tcustomerId={customerId}\n\t\t\tbrandId={brandId}\n\t\t\tdefaultFiatCurrency={defaultFiatCurrency}\n\t\t\tdefaultCryptoCurrency={defaultCryptoCurrency}\n\t\t\tdefaultNetwork={defaultNetwork}\n\t\t\tdefaultFiatAmount={defaultFiatAmount}\n\t\t\tdefaultCryptoAmount={defaultCryptoAmount}\n\t\t\tdefaultWalletAddress={defaultWalletAddress}\n\t\t\tdefaultGateway={defaultGateway}\n\t\t\tdefaultCountry={defaultCountry}\n\t\t\tfieldLocks={fieldLocks}\n\t\t\tstatusPollInterval={statusPollInterval}\n\t\t\tonComplete={onComplete}\n\t\t\tonError={onError}\n\t\t>\n\t\t\t<InnerForm\n\t\t\t\tclassName={className}\n\t\t\t\ttheme={theme}\n\t\t\t\tskinId={skinId}\n\t\t\t\taccentColor={accentColor}\n\t\t\t\tbgColor={bgColor}\n\t\t\t\tbgImage={bgImage}\n\t\t\t\tborderColor={borderColor}\n\t\t\t\tborderRadius={borderRadius}\n\t\t\t\tsurfaceColor={surfaceColor}\n\t\t\t\tinputBgColor={inputBgColor}\n\t\t\t\ttextColor={textColor}\n\t\t\t\ttextSecondaryColor={textSecondaryColor}\n\t\t\t\ttextMutedColor={textMutedColor}\n\t\t\t\tsuccessColor={successColor}\n\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\tautoRedirect={autoRedirect}\n\t\t\t\texplorerUrl={explorerUrl}\n\t\t\t\tdoneButtonText={doneButtonText}\n\t\t\t\tsupportEmail={supportEmail}\n\t\t\t\tstablecoinParity={stablecoinParity}\n\t\t\t\tpartnerName={partnerName}\n\t\t\t\tonDone={onDone}\n\t\t\t/>\n\t\t</RampProvider>\n\t);\n}\n","/**\n * CheckoutForm Component\n * Single-page checkout form using the same NowRamp design as RampForm.\n * This is the hosted-checkout variant — both components now produce the\n * same visual since the new design is inherently single-page.\n */\n\nimport { RampForm, type RampFormProps } from './RampForm';\n\nexport interface CheckoutFormProps extends RampFormProps {\n /** Submit button text (legacy — maps to nothing in new design, kept for API compat) */\n submitButtonText?: string;\n /** Rate refresh interval in ms (legacy, kept for API compat) */\n rateRefreshInterval?: number;\n}\n\n/**\n * Hosted checkout form.\n * Now uses the same NowRamp design as RampForm.\n */\nexport function CheckoutForm({\n submitButtonText: _submitButtonText,\n rateRefreshInterval: _rateRefreshInterval,\n ...props\n}: CheckoutFormProps) {\n return <RampForm {...props} />;\n}\n","export interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport function SkinSwatch({\n skin,\n active,\n onClick,\n darkMode,\n dimmed,\n}: {\n skin: Skin;\n active: boolean;\n onClick: () => void;\n darkMode: boolean;\n dimmed: boolean;\n}) {\n const isMono = skin.accent === null;\n const size = 32;\n return (\n <button\n onClick={onClick}\n className=\"relative shrink-0\"\n style={{ width: size, height: size, opacity: dimmed ? 0.4 : 1, transition: 'opacity 0.2s' }}\n >\n {isMono ? (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <clipPath id=\"mono-left\"><rect x=\"0\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <clipPath id=\"mono-right\"><rect x=\"16\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#111111\" clipPath=\"url(#mono-left)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#ffffff\" clipPath=\"url(#mono-right)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"none\" stroke={darkMode ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.1)'} strokeWidth=\"1\" />\n </svg>\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill={skin.accent!} />\n </svg>\n )}\n {active && !dimmed && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{ boxShadow: '0 0 0 2px var(--t-bg), 0 0 0 4px var(--t-text)' }}\n />\n )}\n </button>\n );\n}\n","/**\n * Choose Ramp (Provider) Modal\n * Displays REAL quotes from the aggregation engine in a ranked list.\n * First item (best quote) gets a border outline, remaining items get surface background.\n * Shows loading skeletons while quotes load, and an empty state if no quotes available.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { GenericCoinIcon } from '../ui/icons';\nimport { Skeleton } from '../ui/Skeleton';\nimport type { Quote, QuotesResponse } from '@nowramp/sdk';\n\nexport interface ChooseRampModalProps {\n\tonClose: () => void;\n\tonSelect: (quote: Quote) => void;\n\t/** Real quotes from the aggregation engine */\n\tquotes: QuotesResponse | null;\n\t/** Whether quotes are still loading */\n\tquotesLoading: boolean;\n\t/** The selected crypto currency code (for display) */\n\tcryptoCurrency: string;\n}\n\nfunction QuoteTag({ quote }: { quote: Quote }) {\n\tif (quote.isBestRate) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\tBest price\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.isRecommended) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\tRecommended\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.rank && quote.rank <= 3) {\n\t\treturn (\n\t\t\t<div className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t#{quote.rank}\n\t\t\t</div>\n\t\t);\n\t}\n\treturn null;\n}\n\nfunction ProviderIcon({ quote }: { quote: Quote }) {\n\tif (quote.gatewayLogo) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tsrc={quote.gatewayLogo}\n\t\t\t\talt={quote.gatewayName}\n\t\t\t\twidth={36}\n\t\t\t\theight={36}\n\t\t\t\tclassName=\"rounded-full shrink-0\"\n\t\t\t\tstyle={{ width: 36, height: 36 }}\n\t\t\t/>\n\t\t);\n\t}\n\treturn <GenericCoinIcon size={36} />;\n}\n\nfunction LoadingSkeletons() {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={i}\n\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\theight: 64,\n\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Skeleton w={36} h={36} className=\"rounded-full shrink-0\" />\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Skeleton w={90} h={14} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={60} h={12} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-right\">\n\t\t\t\t\t\t<Skeleton w={40} h={10} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={80} h={14} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function ChooseRampModal({\n\tonClose,\n\tonSelect,\n\tquotes,\n\tquotesLoading,\n\tcryptoCurrency,\n}: ChooseRampModalProps) {\n\tconst [search, setSearch] = useState('');\n\n\tconst filteredQuotes = useMemo(() => {\n\t\tif (!quotes?.quotes) return [];\n\t\tconst raw = search.trim().toLowerCase();\n\t\tif (!raw) return quotes.quotes;\n\t\treturn quotes.quotes.filter((q) => q.gatewayName.toLowerCase().includes(raw));\n\t}, [quotes, search]);\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\tChoose Ramp\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5 space-y-2\">\n\t\t\t\t{quotesLoading ? (\n\t\t\t\t\t<LoadingSkeletons />\n\t\t\t\t) : filteredQuotes.length === 0 ? (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{quotes && quotes.quotes.length === 0\n\t\t\t\t\t\t\t? 'No quotes available for this request'\n\t\t\t\t\t\t\t: 'No providers found'}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\tfilteredQuotes.map((quote, i) => {\n\t\t\t\t\t\tconst isBest = i === 0;\n\t\t\t\t\t\tconst receiveAmount = parseFloat(quote.cryptoAmount);\n\t\t\t\t\t\tconst displayAmount =\n\t\t\t\t\t\t\treceiveAmount >= 1 ? receiveAmount.toFixed(4) : receiveAmount.toPrecision(6);\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={quote.gatewayId}\n\t\t\t\t\t\t\t\tonClick={() => onSelect(quote)}\n\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5 transition-colors\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: isBest ? 4.5 : 5,\n\t\t\t\t\t\t\t\t\theight: isBest ? 63 : 64,\n\t\t\t\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\t\t\t\tborder: isBest ? '1px solid var(--t-border)' : '1px solid transparent',\n\t\t\t\t\t\t\t\t\tbackground: isBest ? 'transparent' : 'var(--t-surface)',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon quote={quote} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{quote.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<QuoteTag quote={quote} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-[11px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\tYou get\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{cryptoCurrency} {displayAmount}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)}\n\n\t\t\t\t{/* Unavailable gateways info */}\n\t\t\t\t{!quotesLoading && quotes?.unavailableGateways && quotes.unavailableGateways.length > 0 && (\n\t\t\t\t\t<div className=\"pt-3\">\n\t\t\t\t\t\t{quotes.unavailableGateways.map((g) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={g.gatewayId}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between py-2 text-[12px]\"\n\t\t\t\t\t\t\t\tstyle={{ color: 'var(--t-text-muted)' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{g.gatewayName}</span>\n\t\t\t\t\t\t\t\t<span>{g.reason}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],"names":["useRampConfig","config","orderType","country","data","setData","useState","loading","setLoading","error","setError","apiRef","useRef","RampApi","fetchConfig","useCallback","supportedParams","result","err","useEffect","useQuotes","params","configKeyRef","configKey","fetchIdRef","id","refetch","useCheckoutIntent","order","setOrder","createOrder","reset","useTransaction","transactionId","options","status","setStatus","fetchStatus","delay","timer","interval","COUNTRIES","COUNTRY_MAP","c","getDefaultFiatForCountry","countryCode","supportedFiats","preferredFiat","PROVIDERS_WILDCARD_COMPAT","providersOverlap","a","b","compat","p","filterAvailableFiats","fiats","networkProviders","f","filterAvailableCryptos","cryptos","fiatProviders","crypto","filteredNetworks","n","filterAvailablePaymentMethods","methods","fiatCurrency","m","reconcileSelections","state","filtered","locks","changed","first","net","compatible","lockedCrypto","target","isSelectionUnsupported","_a","network","_b","fiat","_c","normalizeAmount","value","maxDecimals","dotIndex","initialState","rampReducer","action","_d","_f","_e","_h","_g","RampContext","createContext","RampProvider","projectId","apiUrl","assetBaseUrl","flowType","customerId","brandId","defaultFiatCurrency","defaultCryptoCurrency","defaultNetworkProp","defaultFiatAmount","defaultCryptoAmount","defaultWalletAddress","defaultGateway","defaultCountry","fieldLocks","statusPollInterval","onComplete","onError","children","apiConfig","useMemo","defaultNetwork","initialIsSell","hasAmount","initialStep","effectiveFiatAmount","dispatch","useReducer","isSell","configLoading","configError","geoAppliedRef","React","detected","defaultCountryAppliedRef","prevCountryRef","geoFallbackAppliedRef","prevFiatRef","currentAmount","minAmount","availableFiats","availableCryptos","availablePaymentMethods","selectionUnsupported","corrections","amountError","amount","min","max","quoteParams","quotes","quotesLoading","quotesError","fetchQuotes","orderLoading","orderError","createOrderApi","CHECKOUT_POLL_INITIAL_DELAY","orderStatus","orderStatusLoading","effectiveDefaultGateway","gatewayRef","quotesRef","brandIdRef","gateway","missing","message","goToStep","step","goBack","stepOrder","currentIndex","canProceed","jsx","useRamp","context","useContext","BLOCKCHAINS","CRYPTO_CURRENCIES","CRYPTO_NAMES","FIAT_TO_COUNTRY","getCryptoIconUrl","ticker","baseUrl","getFiatFlagUrl","currencyCode","getChainInfo","chainCode","getChainIconUrl","chain","FIAT_CURRENCIES","SKINS","MOCK_RATES","STABLECOINS","isStablecoin","code","getMockRate","parseAmount","str","formatOutput","num","s","isValidHex","MIN_FIAT_AMOUNT","MIN_CRYPTO_AMOUNT","CRYPTO_CHAIN_COMBOS","list","LazyIcon","src","alt","size","className","background","loaded","setLoaded","currentSrc","handleLoad","handleError","jsxs","CryptoIcon","FiatFlag","GenericCoinIcon","color","BankIcon","RevolutIcon","ApplePayIcon","GooglePayIcon","PayPalIcon","VisaIcon","MastercardIcon","CardIcon","markW","markH","overlap","CoinifyIcon","ChevronDown","ChevronRight","MenuIcon","onClick","DarkModeIcon","getPaymentIcon","type","ICON_KEY_MAP","SHORT_NAME_MAP","getMethodDisplayName","fullName","getMethodIcon","methodId","icon","iconKey","PaymentMethodSelector","selectedId","onOpenModal","selected","Fragment","e","CheckoutStep","autoRedirect","redirectDelay","iframeLoaded","setIframeLoaded","redirectCountdown","setRedirectCountdown","isExpired","countdownInterval","prev","iframeSrc","allowAttr","createPortal","widgetUrl","buildWidgetUrl","url","key","ProcessingStep","getStatusMessage","DetailRow","label","mono","CompleteStep","explorerUrl","onDone","doneButtonText","getExplorerUrl","defaultExplorers","handleDone","explorerLink","highlight","ErrorStep","onRetry","supportEmail","getErrorTitle","getErrorMessage","handleRetry","handleStartOver","truncateAddress","address","ConfirmStep","stablecoinParity","partnerName","gatewayInfo","g","exchangeRate","fiatNumeric","confirmParityActive","confirmSamePeg","confirmParityAmount","handleConfirm","Modal","isOpen","onClose","mounted","setMounted","animating","setAnimating","t","handleClose","onKey","AnimatedDigit","char","height","digits","idx","d","AnimatedNumber","style","ch","i","Skeleton","w","h","FormSkeleton","CloseButton","SearchInput","onChange","placeholder","focused","setFocused","FiatCurrencyModal","onSelect","currencies","selectedCode","search","setSearch","currencyList","staticMap","raw","rest","displayName","isSelected","CryptoImage","CryptoCurrencyModal","selectedChain","comboList","networks","cryptoName","terms","scored","chainName","chainShort","name","fields","score","itemSelected","PaymentMethodModal","shortName","ToggleSwitch","checked","accentColor","SETTINGS_LINKS","SettingsScreen","darkMode","onToggleDarkMode","_skinId","_onSelectSkin","showThemeToggle","countryName","onLocationPress","flagError","setFlagError","GlobeIcon","item","CountryPickerModal","normalizedCode","CountryFlag","InnerForm","theme","skinIdProp","accentColorProp","bgColorProp","bgImageProp","borderColorProp","borderRadiusProp","surfaceColorProp","inputBgColorProp","textColorProp","textSecondaryColorProp","textMutedColorProp","successColorProp","showFlowToggle","showSettings","setDarkMode","skinId","setSkinId","modal","setModal","amountTouched","setAmountTouched","walletTouched","setWalletTouched","walletFocused","setWalletFocused","walletValidating","setWalletValidating","walletServerValid","setWalletServerValid","switching","setSwitching","autoSelectPending","setAutoSelectPending","inputRef","walletValidationTimer","prevTabRef","tab","isBuy","cryptoCode","fiatCode","spendAmount","spendNumeric","quoteRate","lastRateRef","receiveAmount","amt","parityActive","isSamePeg","parityAmount","displayReceiveAmount","displayRate","r","cc","fc","addr","abortController","msg","amountIsEmpty","amountBelowMin","hasAmountError","isAmountValid","isWalletValid","isFormValid","handleAmountChange","handleTabSwitch","newTab","handleFiatSelect","handleCryptoSelect","handlePaymentMethodSelect","handleCountrySelect","handleLocationPress","handleCtaClick","reasons","themeClass","activeSkin","isMono","hasCustomAccent","getCtaTextColor","hex","accentStyle","themeOverrides","backgroundStyle","pillTextColor","borderStyle","postFormStep","chainInfo","chainDisplay","_i","close","v","RampForm","bgColor","bgImage","borderColor","borderRadius","surfaceColor","inputBgColor","textColor","textSecondaryColor","textMutedColor","successColor","CheckoutForm","_submitButtonText","_rateRefreshInterval","props","SkinSwatch","skin","active","dimmed","QuoteTag","quote","ProviderIcon","LoadingSkeletons","ChooseRampModal","cryptoCurrency","filteredQuotes","q","isBest","displayAmount"],"mappings":"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"}
|