@liberfi.io/ui-trade 0.1.2 → 0.1.4

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useSwap.ts","../src/hooks/useSwapRoutePolling.ts","../src/hooks/useTxConfirmation.ts","../src/components/swap/swap.script.ts","../src/components/swap/swap-preview-modal.tsx","../src/components/swap/swap.ui.tsx","../src/components/swap/swap.widget.tsx","../src/version.ts"],"names":["base64ToUint8Array","base64","binary","bytes","uint8ArrayToBase64","i","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","chain","rest","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_INTERVAL","useSwapRoutePolling","params","interval","paused","enabled","query","useSwapRouteQuery","useEffect","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","SOLANA_CHAINS","Chain","chainNamespace","ChainNamespace","TOKEN_POLL_MS","BALANCE_POLL_MS","formatOutputAmount","plans","decimals","raw","padded","intPart","trimmed","useSwapScript","wallets","useWallets","ns","w","walletAddress","fromTokenAddress","setFromTokenAddress","toTokenAddress","setToTokenAddress","fromRef","toRef","tokenAddresses","tokensQuery","useTokensQuery","fromToken","t","toToken","balancesQuery","useWalletPortfoliosByTokensQuery","fromBalance","p","toBalance","amount","setAmount","amountInDecimals","parts","amountInUsd","price","value","setHalfAmount","bal","half","setMaxAmount","routeParams","isSwappingRef","isRouting","routeError","outputAmount","outputAmountInUsd","rawSwap","onCompleteRef","latestTxStatus","entries","isLoading","SwapPreviewModal","isOpen","onOpenChange","inputAmount","inputAmountInUsd","onConfirm","expanded","setExpanded","toggleExpanded","plan","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalBody","Avatar","WalletBalanceIcon","formatNumber","formatUsd","truncateAddress","formatSmallAmount","TradeIcon","Button","ChevronUpIcon","ChevronDownIcon","ModalFooter","n","addr","SwapUI","onAmountChange","onHalfAmount","onMaxAmount","onFromTokenSelect","onToTokenSelect","onPreview","className","cn","Input","SwapWidget","from","to","onComplete","script","onOpen","onClose","useDisclosure","handleConfirm","Fragment","version_default"],"mappings":"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","file":"index.js","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useSwapRouteQuery } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { UseSwapRoutePollingOptions } from \"../types\";\n\nconst DEFAULT_INTERVAL = 12_000;\n\n/**\n * Hook that polls for swap route quotes at a configurable interval.\n *\n * Built on top of `useSwapRouteQuery` (TanStack Query) — automatically\n * deduplicates requests, caches results, and invalidates when params change.\n *\n * Polling pauses when `paused` is true (e.g. during swap execution) or\n * when required params are missing.\n */\nexport function useSwapRoutePolling(\n params: Partial<API.SwapParams>,\n options?: UseSwapRoutePollingOptions,\n) {\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n const paused = options?.paused ?? false;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const hasRequiredParams =\n !!params.chain &&\n !!params.userAddress &&\n !!params.input &&\n !!params.output &&\n !!params.amount;\n\n const enabled = hasRequiredParams && !paused;\n\n const query = useSwapRouteQuery(params as API.SwapParams, {\n enabled,\n refetchInterval: enabled ? interval : false,\n retry: false,\n });\n\n useEffect(() => {\n if (query.error) {\n optionsRef.current?.onError?.(query.error);\n }\n }, [query.error]);\n\n return useMemo(\n () => ({\n route: query.data,\n isRouting: query.isFetching,\n error: query.error,\n }),\n [query.data, query.isFetching, query.error],\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { API, Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { useSwapRoutePolling } from \"../../hooks/useSwapRoutePolling\";\nimport { useTxConfirmation } from \"../../hooks/useTxConfirmation\";\nimport type { UseSwapScriptParams, UseSwapScriptResult } from \"./types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst TOKEN_POLL_MS = 10_000;\nconst BALANCE_POLL_MS = 15_000;\n\n/**\n * Computes the total output amount from route plans.\n * Each plan has an outputAmount in smallest units — we take the last plan's\n * output (the final token) and shift by decimals.\n */\nfunction formatOutputAmount(\n plans: Array<{ outputAmount: string }>,\n decimals: number,\n): string | undefined {\n if (plans.length === 0) return undefined;\n const lastPlan = plans[plans.length - 1]!;\n const raw = lastPlan.outputAmount;\n if (!raw || raw === \"0\") return \"0\";\n\n const padded = raw.padStart(decimals + 1, \"0\");\n const intPart = padded.slice(0, padded.length - decimals) || \"0\";\n const fracPart = padded.slice(padded.length - decimals);\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Script hook that encapsulates all data fetching and state management\n * for the swap form.\n *\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useSwapScript(\n params: UseSwapScriptParams,\n): UseSwapScriptResult {\n const { chain } = params;\n\n // ── Wallet ────────────────────────────────────────────────────────────────\n\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // ── Token selection state ─────────────────────────────────────────────────\n\n const [fromTokenAddress, setFromTokenAddress] = useState(params.from ?? \"\");\n const [toTokenAddress, setToTokenAddress] = useState(params.to ?? \"\");\n\n const fromRef = useRef(params.from);\n const toRef = useRef(params.to);\n useEffect(() => {\n if (params.from !== fromRef.current) {\n fromRef.current = params.from;\n if (params.from) setFromTokenAddress(params.from);\n }\n }, [params.from]);\n useEffect(() => {\n if (params.to !== toRef.current) {\n toRef.current = params.to;\n if (params.to) setToTokenAddress(params.to);\n }\n }, [params.to]);\n\n // ── Token metadata ────────────────────────────────────────────────────────\n\n const tokenAddresses = useMemo(\n () => [fromTokenAddress, toTokenAddress].filter(Boolean),\n [fromTokenAddress, toTokenAddress],\n );\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const fromToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === fromTokenAddress) ?? null,\n [tokensQuery.data, fromTokenAddress],\n );\n const toToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === toTokenAddress) ?? null,\n [tokensQuery.data, toTokenAddress],\n );\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const fromBalance = useMemo(\n () =>\n balancesQuery.data?.find((p) => p.address === fromTokenAddress) ?? null,\n [balancesQuery.data, fromTokenAddress],\n );\n const toBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === toTokenAddress) ?? null,\n [balancesQuery.data, toTokenAddress],\n );\n\n // ── Amount ────────────────────────────────────────────────────────────────\n\n const [amount, setAmount] = useState<string | undefined>(undefined);\n\n const amountInDecimals = useMemo(() => {\n if (!amount || fromToken?.decimals == null) return undefined;\n const parts = amount.split(\".\");\n const intPart = parts[0] ?? \"0\";\n const fracPart = (parts[1] ?? \"\").slice(0, fromToken.decimals);\n const padded = fracPart.padEnd(fromToken.decimals, \"0\");\n const raw = intPart + padded;\n return raw.replace(/^0+/, \"\") || \"0\";\n }, [amount, fromToken?.decimals]);\n\n const amountInUsd = useMemo(() => {\n if (!amount || !fromToken?.marketData?.priceInUsd) return undefined;\n const price = Number(fromToken.marketData.priceInUsd);\n const value = Number(amount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [amount, fromToken?.marketData?.priceInUsd]);\n\n // ── Half / Max helpers ────────────────────────────────────────────────────\n\n const setHalfAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const half = bal / 2;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n half.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n const setMaxAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n bal.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n // ── Route polling ─────────────────────────────────────────────────────────\n\n const routeParams = useMemo<Partial<API.SwapParams>>(\n () => ({\n chain,\n userAddress: walletAddress || undefined,\n input: fromTokenAddress || undefined,\n output: toTokenAddress || undefined,\n mode: API.SwapMode.EXACT_IN,\n amount: amountInDecimals,\n }),\n [chain, walletAddress, fromTokenAddress, toTokenAddress, amountInDecimals],\n );\n\n const isSwappingRef = useRef(false);\n\n const {\n route,\n isRouting,\n error: routeError,\n } = useSwapRoutePolling(routeParams, { paused: isSwappingRef.current });\n\n // ── Output amount ─────────────────────────────────────────────────────────\n\n const outputAmount = useMemo(\n () =>\n route && toToken\n ? formatOutputAmount(route.plans, toToken.decimals)\n : undefined,\n [route, toToken],\n );\n\n const outputAmountInUsd = useMemo(() => {\n if (!outputAmount || !toToken?.marketData?.priceInUsd) return undefined;\n const price = Number(toToken.marketData.priceInUsd);\n const value = Number(outputAmount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [outputAmount, toToken?.marketData?.priceInUsd]);\n\n // ── Swap execution ────────────────────────────────────────────────────────\n\n const { swap: rawSwap, isSwapping } = useSwap();\n isSwappingRef.current = isSwapping;\n\n const onCompleteRef = useRef(params.onComplete);\n onCompleteRef.current = params.onComplete;\n\n const { track, transactions } = useTxConfirmation({\n onConfirmed: (txHash) => {\n onCompleteRef.current?.({ success: true, txHash });\n },\n onFailed: (txHash) => {\n onCompleteRef.current?.({ success: false, txHash });\n },\n });\n\n const latestTxStatus = useMemo(() => {\n if (transactions.size === 0) return \"idle\" as const;\n const entries = Array.from(transactions.values());\n return entries[entries.length - 1]!.status;\n }, [transactions]);\n\n const swap = useCallback(async () => {\n if (\n !wallet ||\n !route ||\n !fromTokenAddress ||\n !toTokenAddress ||\n !amountInDecimals\n ) {\n return;\n }\n\n try {\n const result = await rawSwap({\n chain,\n wallet,\n input: fromTokenAddress,\n output: toTokenAddress,\n amount: amountInDecimals,\n mode: API.SwapMode.EXACT_IN,\n });\n track(chain, result.txHash);\n } catch {\n // Error is already reported via useSwap's onError callback\n }\n }, [\n wallet,\n route,\n chain,\n fromTokenAddress,\n toTokenAddress,\n amountInDecimals,\n rawSwap,\n track,\n ]);\n\n // ── Loading state ─────────────────────────────────────────────────────────\n\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return useMemo(\n () => ({\n fromTokenAddress,\n toTokenAddress,\n setFromTokenAddress,\n setToTokenAddress,\n\n fromToken,\n toToken,\n\n fromBalance,\n toBalance,\n\n amount,\n setAmount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n\n outputAmount,\n outputAmountInUsd,\n\n route,\n isRouting,\n routeError,\n\n swap,\n isSwapping,\n\n txStatus: latestTxStatus,\n\n isLoading,\n }),\n [\n fromTokenAddress,\n toTokenAddress,\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n swap,\n isSwapping,\n latestTxStatus,\n isLoading,\n ],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cn,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n TradeIcon,\n} from \"@liberfi.io/ui\";\nimport type { SwapPreviewModalProps } from \"./types\";\n\n/**\n * Modal that previews swap details before confirmation.\n *\n * Pure presentational — all data and callbacks received via props.\n * Shows from/to token cards, expandable route plan details,\n * and a confirm button.\n */\nexport function SwapPreviewModal({\n isOpen,\n onOpenChange,\n fromToken,\n toToken,\n fromBalance,\n inputAmount,\n inputAmountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n onConfirm,\n isSwapping,\n}: SwapPreviewModalProps) {\n const [expanded, setExpanded] = useState(false);\n const toggleExpanded = useCallback(() => setExpanded((prev) => !prev), []);\n\n const plans = useMemo(() => {\n if (!route) return [];\n return route.plans.map((plan, i) => ({\n key: `plan-${i}`,\n name: plan.name,\n input: plan.input,\n inputAmount: plan.inputAmount,\n output: plan.output,\n outputAmount: plan.outputAmount,\n feeQuote: plan.feeQuote,\n feeAmount: plan.feeAmount,\n }));\n }, [route]);\n\n return (\n <Modal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n hideCloseButton\n scrollBehavior=\"inside\"\n backdrop=\"blur\"\n >\n <ModalContent className=\"bg-content2 rounded-lg\">\n <ModalHeader>Preview</ModalHeader>\n <ModalBody>\n <div className=\"flex w-full max-h-[70vh] flex-1 flex-col overflow-y-auto py-2\">\n {/* ── From preview ─────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n From\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {fromToken?.image && (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {fromToken?.symbol ?? \"—\"}\n </div>\n {fromBalance && (\n <div className=\"text-neutral flex items-center gap-1 text-[10px]\">\n <WalletBalanceIcon />\n <span>\n {formatNumber(fromBalance.amount)} {fromToken?.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(inputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(inputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── To preview ───────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Estimated Receive\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {toToken?.image && (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {toToken?.symbol ?? \"—\"}\n </div>\n <div className=\"text-neutral text-[10px]\">\n {truncateAddress(toToken?.address)}\n </div>\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(outputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(outputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Route plan details ───────────────────────────────────── */}\n {expanded && plans.length > 0 && (\n <div className=\"my-3\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Route Details\n </div>\n <div className=\"mt-3 flex flex-col gap-3\">\n {plans.map((plan) => (\n <div\n key={plan.key}\n className=\"bg-content3 flex w-full flex-col items-center gap-2 rounded-lg px-4 py-3\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">DEX</div>\n <div className=\"text-foreground text-xs\">\n {plan.name}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Swap</div>\n <div className=\"text-foreground flex items-center gap-2 text-xs\">\n <span>\n {formatSmallAmount(plan.inputAmount)}{\" \"}\n {truncateAddress(plan.input)}\n </span>\n <TradeIcon\n width={12}\n height={12}\n className=\"text-foreground\"\n />\n <span>\n {formatSmallAmount(plan.outputAmount)}{\" \"}\n {truncateAddress(plan.output)}\n </span>\n </div>\n </div>\n {plan.feeAmount && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Fee</div>\n <div className=\"text-foreground text-xs\">\n {formatSmallAmount(plan.feeAmount)}{\" \"}\n {truncateAddress(plan.feeQuote)}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* ── Expand / collapse toggle ─────────────────────────────── */}\n {plans.length > 0 && (\n <div className=\"flex justify-center\">\n <Button\n size=\"sm\"\n className=\"text-neutral flex bg-transparent text-xs\"\n endContent={\n expanded ? (\n <ChevronUpIcon width={12} height={12} />\n ) : (\n <ChevronDownIcon width={12} height={12} />\n )\n }\n disableRipple\n onPress={toggleExpanded}\n >\n {expanded ? \"Show Less\" : \"Show More\"}\n </Button>\n </div>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button\n fullWidth\n color=\"primary\"\n className=\"flex rounded-lg\"\n disableRipple\n isDisabled={!route || !!routeError}\n isLoading={(!route && isRouting) || isSwapping}\n onPress={onConfirm}\n >\n Confirm\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n }) + \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n\n/** Render raw smallest-unit amounts in abbreviated form. */\nfunction formatSmallAmount(value: string | undefined): string {\n if (!value || value === \"0\") return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return value;\n if (n >= 1e12) return (n / 1e12).toFixed(2) + \"T\";\n if (n >= 1e9) return (n / 1e9).toFixed(2) + \"B\";\n if (n >= 1e6) return (n / 1e6).toFixed(2) + \"M\";\n if (n >= 1e3) return (n / 1e3).toFixed(2) + \"K\";\n return value;\n}\n\nfunction truncateAddress(addr: string | undefined): string {\n if (!addr) return \"—\";\n if (addr.length <= 10) return addr;\n return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n","import { Avatar, Button, ChevronDownIcon, cn, Input } from \"@liberfi.io/ui\";\nimport type { SwapUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the swap form.\n *\n * Receives all data and callbacks via props — no API calls, no subscriptions.\n * Consumers can replace this component entirely while reusing `useSwapScript`.\n */\nexport function SwapUI({\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n amountInUsd,\n onAmountChange,\n onHalfAmount,\n onMaxAmount,\n outputAmount,\n outputAmountInUsd,\n onFromTokenSelect,\n onToTokenSelect,\n route,\n isRouting,\n routeError,\n onPreview,\n isSwapping,\n className,\n}: SwapUIProps) {\n return (\n <div className={cn(\"px-4 pb-4 lg:pb-8\", className)}>\n {/* ── From token section ─────────────────────────────────────────── */}\n <div className=\"space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">From</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={amount ?? \"\"}\n onChange={(e) => onAmountChange(e.target.value || undefined)}\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n fromToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n fromToken?.image ? (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onFromTokenSelect(\"\")}\n >\n {fromToken ? fromToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(amountInUsd)}\n </div>\n {fromBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(fromBalance.amount)} {fromBalance.symbol}\n </span>\n {onHalfAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onHalfAmount}\n >\n Half\n </span>\n )}\n {onMaxAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onMaxAmount}\n >\n Max\n </span>\n )}\n </div>\n )}\n </div>\n\n {routeError && (\n <p className=\"mt-1 break-words text-xs text-danger-500\">\n {routeError.message}\n </p>\n )}\n </div>\n </div>\n\n {/* ── To token section ───────────────────────────────────────────── */}\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">To</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={outputAmount ?? \"\"}\n disabled\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n toToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n toToken?.image ? (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onToTokenSelect(\"\")}\n >\n {toToken ? toToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(outputAmountInUsd)}\n </div>\n {toBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(toBalance.amount)} {toBalance.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Submit button ──────────────────────────────────────────────── */}\n <Button\n fullWidth\n color=\"primary\"\n className=\"mt-8 flex rounded-lg\"\n disableRipple\n isDisabled={!route}\n isLoading={!route && isRouting}\n onPress={onPreview}\n >\n {isSwapping ? \"Swapping...\" : isRouting ? \"Finding route...\" : \"Swap\"}\n </Button>\n </div>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) +\n \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n","import { useCallback } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport { SwapPreviewModal } from \"./swap-preview-modal\";\nimport { useSwapScript } from \"./swap.script\";\nimport { SwapUI } from \"./swap.ui\";\nimport type { SwapWidgetProps } from \"./types\";\n\n/**\n * Swap widget — thin orchestration layer.\n *\n * Calls `useSwapScript` to fetch all data, renders `SwapUI` for the form\n * and `SwapPreviewModal` for pre-swap confirmation.\n *\n * For custom UIs, use `useSwapScript` directly with your own presentation.\n */\nexport function SwapWidget({\n chain,\n from,\n to,\n onComplete,\n className,\n}: SwapWidgetProps) {\n const script = useSwapScript({ chain, from, to, onComplete });\n const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure();\n\n const handleConfirm = useCallback(async () => {\n await script.swap();\n onClose();\n }, [script, onClose]);\n\n return (\n <>\n <SwapUI\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n toBalance={script.toBalance}\n amount={script.amount}\n amountInUsd={script.amountInUsd}\n onAmountChange={script.setAmount}\n onHalfAmount={script.setHalfAmount}\n onMaxAmount={script.setMaxAmount}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n onFromTokenSelect={script.setFromTokenAddress}\n onToTokenSelect={script.setToTokenAddress}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onPreview={onOpen}\n isSwapping={script.isSwapping}\n className={className}\n />\n <SwapPreviewModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n inputAmount={script.amount}\n inputAmountInUsd={script.amountInUsd}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onConfirm={handleConfirm}\n isSwapping={script.isSwapping}\n />\n </>\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.2\";\n}\n\nexport default \"0.1.2\";\n"]}
1
+ {"version":3,"sources":["../src/hooks/useSwap.ts","../src/hooks/useSwapRoutePolling.ts","../src/hooks/useTxConfirmation.ts","../src/components/swap/swap.script.ts","../src/components/swap/swap-preview-modal.tsx","../src/components/swap/swap.ui.tsx","../src/components/swap/swap.widget.tsx","../src/types.ts","../src/components/instant-trade/chain-features.ts","../src/components/instant-trade/instant-trade.context.tsx","../src/components/instant-trade/instant-trade.script.ts","../src/components/instant-trade/preset-form.ui.tsx","../src/components/instant-trade/instant-trade.ui.tsx","../src/components/instant-trade/instant-trade.widget.tsx","../src/components/instant-trade/preset-form.widget.tsx","../src/components/instant-trade/instant-trade-amount-input.tsx","../src/components/instant-trade/instant-trade-button.tsx","../src/version.ts"],"names":["base64ToUint8Array","base64","binary","bytes","i","uint8ArrayToBase64","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","chain","rest","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_INTERVAL","useSwapRoutePolling","params","interval","paused","enabled","query","useSwapRouteQuery","useEffect","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","SOLANA_CHAINS","Chain","chainNamespace","ChainNamespace","TOKEN_POLL_MS","BALANCE_POLL_MS","formatOutputAmount","plans","decimals","raw","padded","intPart","trimmed","useSwapScript","wallets","useWallets","ns","walletAddress","fromTokenAddress","setFromTokenAddress","toTokenAddress","setToTokenAddress","fromRef","toRef","tokenAddresses","tokensQuery","useTokensQuery","fromToken","t","toToken","balancesQuery","useWalletPortfoliosByTokensQuery","fromBalance","p","toBalance","amount","setAmount","amountInDecimals","parts","amountInUsd","price","value","setHalfAmount","bal","half","setMaxAmount","routeParams","isSwappingRef","isRouting","routeError","outputAmount","outputAmountInUsd","rawSwap","onCompleteRef","latestTxStatus","entries","isLoading","SwapPreviewModal","isOpen","onOpenChange","inputAmount","inputAmountInUsd","onConfirm","expanded","setExpanded","toggleExpanded","plan","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalBody","Avatar","WalletBalanceIcon","formatNumber","formatUsd","truncateAddress","formatSmallAmount","TradeIcon","Button","ChevronUpIcon","ChevronDownIcon","ModalFooter","n","addr","SwapUI","onAmountChange","onHalfAmount","onMaxAmount","onFromTokenSelect","onToTokenSelect","onPreview","className","cn","Input","SwapWidget","from","to","onComplete","script","onOpen","onClose","useDisclosure","handleConfirm","Fragment","DEFAULT_TRADE_PRESET","DEFAULT_EVM_TRADE_PRESET","DEFAULT_BSC_TRADE_PRESET","DEFAULT_BUY_AMOUNTS","DEFAULT_SELL_PERCENTAGES","BSC_CHAINS","getChainPresetFeatures","nativeSymbol","isSolanaChain","getDefaultPresetForChain","buildDefaultSettings","preset","DEFAULT_INSTANT_TRADE_SETTINGS","storageKey","readStoredSettings","fallback","writeStoredSettings","settings","InstantTradeContext","createContext","useInstantTrade","ctx","useContext","InstantTradeProvider","tokenAddress","controlledSettings","onSettingsChange","children","nativeToken","getNativeToken","isControlled","chainDefaults","localSettings","setLocalSettings","setSettings","updateBuySettings","buy","updateSellSettings","sell","direction","setDirection","buyPreset","setBuyPreset","sellPreset","setSellPreset","defaultPreset","currentPresetValues","idx","useInstantTradeScript","onSwapSubmitted","onSwapError","wrappedToken","getWrappedToken","w","addrs","tokenInfo","nativeAddr","nativeBalance","tokenBalance","showSettings","setShowSettings","lastClickedPreset","handlePresetClick","last","onSubmittedRef","onErrorRef","phase","nativeDecimals","inputAddress","isBuy","BigNumber","chainDefault","priorityFeeStr","tipFeeStr","submitText","dir","symbol","nativePrice","usd","formatAmountUSD","isDisabled","PresetFormUI","onChange","update","patch","features","SlippageRow","v","PriorityFeeRow","TipFeeRow","AutoFeeRow","MaxAutoFeeRow","AntiMEVRow","CustomRPCRow","numberInputClassNames","useNumberHandler","handle","NumberInput","label","Tooltip","InfoIcon","Switch","ANTI_MEV_LABELS","Tabs","opt","Tab","InstantTradeUI","onDirectionChange","customAmounts","customPercentages","onQuickAmountClick","onQuickPercentageClick","onCustomAmountsEdit","onCustomPercentagesEdit","tokenSymbol","amountConversion","onPresetChange","presetValues","onPresetSettingsChange","onPresetClick","onSubmit","headerExtra","BuyAmountSection","SellAmountSection","PresetOverview","key","handleChange","QuickButtons","values","onSelect","onEdit","suffix","isEditing","setIsEditing","tempValues","setTempValues","handleStartEdit","handleSave","_","val","CheckIcon","EditIcon","SlippageIcon","formatPercent","ZapFastIcon","formatPrice","CoinsIcon","ShieldOffIcon","ShieldIcon","ShieldPlusIcon","InstantTradeWidget","InstantTradeWidgetInner","handleQuickAmountClick","handleQuickPercentageClick","pct","handleCustomAmountsEdit","amounts","handleCustomPercentagesEdit","pcts","handlePresetSettingsChange","presets","handlePresetChange","currentPreset","PresetFormWidget","stableOnChange","useCallbackRef","local","setLocal","InstantTradeAmountInput","variant","radius","size","fullWidth","handleAmountChange","handlePresetPress","LightningIcon","index","PresetTooltip","InstantTradeButton","handleSwap","native","version_default"],"mappings":"gcAKA,SAASA,EAAAA,CAAmBC,CAAAA,CAA4B,CACtD,IAAMC,CAAAA,CAAS,IAAA,CAAKD,CAAM,CAAA,CACpBE,CAAAA,CAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAO,MAAM,CAAA,CAC1C,IAAA,IAASE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAO,MAAA,CAAQE,CAAAA,EAAAA,CACjCD,CAAAA,CAAMC,CAAC,CAAA,CAAIF,EAAO,UAAA,CAAWE,CAAC,CAAA,CAEhC,OAAOD,CACT,CAEA,SAASE,EAAAA,CAAmBF,CAAAA,CAA2B,CACrD,IAAID,CAAAA,CAAS,EAAA,CACb,IAAA,IAASE,EAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAM,MAAA,CAAQC,CAAAA,EAAAA,CAChCF,CAAAA,EAAU,MAAA,CAAO,YAAA,CAAaC,CAAAA,CAAMC,CAAC,CAAC,CAAA,CAExC,OAAO,IAAA,CAAKF,CAAM,CACpB,CAYO,SAASI,EAAAA,CAAQC,CAAAA,CAA0B,CAChD,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAIC,oBAAAA,EAAa,CAC1B,CAACC,EAAYC,CAAa,CAAA,CAAIC,cAAAA,CAAS,KAAK,CAAA,CAC5CC,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,CAAAA,CAAW,OAAA,CAAUN,CAAAA,CAErB,IAAMQ,CAAAA,CAAOC,kBACX,MAAOC,CAAAA,EAA0C,CAC/C,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,KAAA,CAAAC,CAAAA,CAAO,GAAGC,CAAK,CAAA,CAAIH,CAAAA,CAEnCN,CAAAA,CAAc,IAAI,CAAA,CAClB,GAAI,CAEF,IAAIU,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,MAAMb,CAAAA,CAAO,SAAA,CAAU,CAC7B,KAAA,CAAAW,EACA,WAAA,CAAaD,CAAAA,CAAO,OAAA,CACpB,KAAA,CAAOE,CAAAA,CAAK,KAAA,CACZ,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,IAAA,CAAMA,CAAAA,CAAK,IAAA,EAAQE,SAAAA,CAAI,QAAA,CAAS,SAChC,MAAA,CAAQF,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,SAAA,CAAWA,CAAAA,CAAK,UAChB,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,QACjB,CAAC,EACH,CAAA,MAASG,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,MAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,CAAA,CACxD,MAAAV,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUW,CAAAA,CAAK,OAAO,CAAA,CACpCA,CACR,CAGA,IAAIC,CAAAA,CACJ,GAAI,CACF,IAAMC,CAAAA,CAAgB1B,EAAAA,CAAmBqB,CAAAA,CAAM,YAAY,CAAA,CAC3DI,CAAAA,CAAc,MAAMP,CAAAA,CAAO,gBAAgBQ,CAAa,EAC1D,CAAA,MAASH,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,CAAA,CACxD,MAAAV,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUW,CAAAA,CAAK,MAAM,CAAA,CACnCA,CACR,CAGA,IAAIG,CAAAA,CACJ,GAAI,CACF,IAAMC,CAAAA,CAAevB,EAAAA,CAAmBoB,CAAW,CAAA,CACnDE,CAAAA,CAAa,MAAMnB,EAAO,MAAA,CAAO,CAC/B,KAAA,CAAAW,CAAAA,CACA,YAAA,CAAcS,CAChB,CAAC,EACH,CAAA,MAASL,CAAAA,CAAG,CACV,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,EACxD,MAAAV,CAAAA,CAAW,OAAA,EAAS,OAAA,GAAUW,CAAAA,CAAK,MAAM,CAAA,CACnCA,CACR,CAEA,IAAMK,CAAAA,CAAqB,CACzB,MAAA,CAAQF,CAAAA,CAAW,OACnB,KAAA,CAAOA,CAAAA,CAAW,KACpB,CAAA,CAEA,OAAAd,CAAAA,CAAW,OAAA,EAAS,WAAA,GAAcgB,CAAM,CAAA,CACjCA,CACT,CAAA,OAAE,CACAlB,CAAAA,CAAc,KAAK,EACrB,CACF,CAAA,CACA,CAACH,CAAM,CACT,CAAA,CAEA,OAAOsB,aAAAA,CAAQ,KAAO,CAAE,IAAA,CAAAf,CAAAA,CAAM,UAAA,CAAAL,CAAW,CAAA,CAAA,CAAI,CAACK,CAAAA,CAAML,CAAU,CAAC,CACjE,CCtGA,IAAMqB,EAAAA,CAAmB,IAAA,CAWlB,SAASC,EAAAA,CACdC,CAAAA,CACA1B,CAAAA,CACA,CACA,IAAM2B,CAAAA,CAAW3B,GAAS,QAAA,EAAYwB,EAAAA,CAChCI,CAAAA,CAAS5B,CAAAA,EAAS,MAAA,EAAU,KAAA,CAC5BM,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,CAAAA,CAAW,OAAA,CAAUN,CAAAA,CASrB,IAAM6B,EANJ,CAAC,CAACH,CAAAA,CAAO,KAAA,EACT,CAAC,CAACA,EAAO,WAAA,EACT,CAAC,CAACA,CAAAA,CAAO,KAAA,EACT,CAAC,CAACA,CAAAA,CAAO,MAAA,EACT,CAAC,CAACA,CAAAA,CAAO,MAAA,EAE0B,CAACE,CAAAA,CAEhCE,CAAAA,CAAQC,yBAAAA,CAAkBL,CAAAA,CAA0B,CACxD,OAAA,CAAAG,CAAAA,CACA,gBAAiBA,CAAAA,CAAUF,CAAAA,CAAW,KAAA,CACtC,KAAA,CAAO,KACT,CAAC,CAAA,CAED,OAAAK,eAAAA,CAAU,IAAM,CACVF,CAAAA,CAAM,KAAA,EACRxB,CAAAA,CAAW,SAAS,OAAA,GAAUwB,CAAAA,CAAM,KAAK,EAE7C,CAAA,CAAG,CAACA,CAAAA,CAAM,KAAK,CAAC,CAAA,CAETP,aAAAA,CACL,KAAO,CACL,KAAA,CAAOO,EAAM,IAAA,CACb,SAAA,CAAWA,CAAAA,CAAM,UAAA,CACjB,KAAA,CAAOA,CAAAA,CAAM,KACf,CAAA,CAAA,CACA,CAACA,CAAAA,CAAM,IAAA,CAAMA,CAAAA,CAAM,UAAA,CAAYA,CAAAA,CAAM,KAAK,CAC5C,CACF,CC3CA,IAAMG,EAAAA,CAAkB,GAAA,CAiBjB,SAASC,EAAAA,CAAkBlC,CAAAA,CAAoC,CACpE,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAIC,sBAAa,CAC1B,CAACiC,CAAAA,CAAcC,CAAe,CAAA,CAAI/B,cAAAA,CACtC,IAAM,IAAI,GACZ,CAAA,CACMC,CAAAA,CAAaC,YAAAA,CAAOP,CAAO,CAAA,CACjCM,EAAW,OAAA,CAAUN,CAAAA,CAErB,IAAMqC,CAAAA,CAAW5B,iBAAAA,CACf,CAAC6B,EAAgBC,CAAAA,GAAiC,CAChDH,CAAAA,CAAiBI,CAAAA,EAAS,CACxB,IAAMC,EAAWD,CAAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAEhC,GADI,CAACG,CAAAA,EACDA,CAAAA,CAAS,MAAA,GAAWF,CAAAA,CAAQ,OAAOC,CAAAA,CACvC,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,CAAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAQ,CAAE,GAAGG,CAAAA,CAAU,MAAA,CAAAF,CAAO,CAAC,CAAA,CACjCG,CACT,CAAC,EACH,CAAA,CACA,EACF,CAAA,CAEMC,CAAAA,CAAQlC,iBAAAA,CACZ,CAACG,CAAAA,CAAc0B,CAAAA,GAAmB,CAChCF,CAAAA,CAAiBI,CAAAA,EAAS,CACxB,GAAIA,CAAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,OAAOE,CAAAA,CAC7B,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,EAAK,GAAA,CAAIJ,CAAAA,CAAQ,CAAE,KAAA,CAAA1B,CAAAA,CAAO,MAAA,CAAA0B,CAAAA,CAAQ,MAAA,CAAQ,SAAU,CAAC,CAAA,CAC9CI,CACT,CAAC,CAAA,CAED,IAAME,CAAAA,CAAUtC,CAAAA,CAAW,OAAA,EAAS,OAAA,EAAW2B,EAAAA,CAE/ChC,CAAAA,CACG,cAAA,CAAeW,CAAAA,CAAO0B,CAAAA,CAAQM,CAAO,CAAA,CACrC,IAAA,CAAMC,CAAAA,EAAY,CACjB,GAAIA,CAAAA,CACFR,CAAAA,CAASC,CAAAA,CAAQ,WAAW,CAAA,CAC5BhC,CAAAA,CAAW,OAAA,EAAS,WAAA,GAAcgC,CAAM,CAAA,CAAA,KACnC,CACL,IAAMrB,CAAAA,CAAM,IAAI,MAAM,6BAA6B,CAAA,CACnDoB,CAAAA,CAASC,CAAAA,CAAQ,QAAQ,CAAA,CACzBhC,EAAW,OAAA,EAAS,QAAA,GAAWgC,CAAAA,CAAQrB,CAAG,EAC5C,CACF,CAAC,CAAA,CACA,KAAA,CAAOD,CAAAA,EAAM,CACZ,IAAMC,CAAAA,CAAMD,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAI,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAC,CAAC,EACxDqB,CAAAA,CAASC,CAAAA,CAAQ,QAAQ,CAAA,CACzBhC,CAAAA,CAAW,OAAA,EAAS,QAAA,GAAWgC,CAAAA,CAAQrB,CAAG,EAC5C,CAAC,EACL,CAAA,CACA,CAAChB,EAAQoC,CAAQ,CACnB,CAAA,CAEMS,CAAAA,CAAQrC,iBAAAA,CAAa6B,CAAAA,EAAmB,CAC5CF,CAAAA,CAAiBI,CAAAA,EAAS,CACxB,GAAI,CAACA,CAAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,OAAOE,CAAAA,CAC9B,IAAME,CAAAA,CAAO,IAAI,GAAA,CAAIF,CAAI,CAAA,CACzB,OAAAE,CAAAA,CAAK,MAAA,CAAOJ,CAAM,CAAA,CACXI,CACT,CAAC,EACH,CAAA,CAAG,EAAE,CAAA,CAECK,CAAAA,CAAWtC,iBAAAA,CAAY,IAAM,CACjC2B,CAAAA,CAAiBI,CAAAA,EAAUA,CAAAA,CAAK,IAAA,GAAS,EAAIA,CAAAA,CAAO,IAAI,GAAM,EAChE,CAAA,CAAG,EAAE,CAAA,CAEL,OAAOjB,aAAAA,CACL,KAAO,CAAE,KAAA,CAAAoB,CAAAA,CAAO,MAAAG,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,YAAA,CAAAZ,CAAa,CAAA,CAAA,CAC9C,CAACQ,CAAAA,CAAOG,CAAAA,CAAOC,CAAAA,CAAUZ,CAAY,CACvC,CACF,CCvFA,IAAMa,EAAAA,CAAoC,IAAI,GAAA,CAAI,CAChDC,WAAAA,CAAM,MAAA,CACNA,WAAAA,CAAM,cAAA,CACNA,WAAAA,CAAM,aACR,CAAC,CAAA,CAED,SAASC,GAAetC,CAAAA,CAA8B,CACpD,OAAOoC,EAAAA,CAAc,GAAA,CAAIpC,CAAK,CAAA,CAAIuC,oBAAAA,CAAe,MAAA,CAASA,oBAAAA,CAAe,GAC3E,CAEA,IAAMC,EAAAA,CAAgB,IAChBC,EAAAA,CAAkB,IAAA,CAOxB,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACoB,CACpB,GAAID,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAExB,IAAME,CAAAA,CADWF,EAAMA,CAAAA,CAAM,MAAA,CAAS,CAAC,CAAA,CAClB,YAAA,CACrB,GAAI,CAACE,CAAAA,EAAOA,CAAAA,GAAQ,GAAA,CAAK,OAAO,GAAA,CAEhC,IAAMC,CAAAA,CAASD,EAAI,QAAA,CAASD,CAAAA,CAAW,CAAA,CAAG,GAAG,CAAA,CACvCG,CAAAA,CAAUD,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAGA,CAAAA,CAAO,MAAA,CAASF,CAAQ,CAAA,EAAK,GAAA,CAEvDI,EADWF,CAAAA,CAAO,KAAA,CAAMA,CAAAA,CAAO,MAAA,CAASF,CAAQ,CAAA,CAC7B,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAC1C,OAAOI,CAAAA,CAAU,CAAA,EAAGD,CAAO,IAAIC,CAAO,CAAA,CAAA,CAAKD,CAC7C,CAQO,SAASE,EAAAA,CACdnC,CAAAA,CACqB,CACrB,GAAM,CAAE,KAAA,CAAAd,CAAM,CAAA,CAAIc,CAAAA,CAIZoC,EAAUC,0BAAAA,EAAW,CACrBC,CAAAA,CAAKd,EAAAA,CAAetC,CAAK,CAAA,CACzBD,CAAAA,CAASY,aAAAA,CACb,IAAMuC,CAAAA,CAAQ,IAAA,CAAM,CAAA,EAAM,CAAA,CAAE,cAAA,GAAmBE,GAAM,CAAA,CAAE,WAAW,CAAA,CAClE,CAACF,CAAAA,CAASE,CAAE,CACd,CAAA,CACMC,CAAAA,CAAgBtD,CAAAA,EAAQ,OAAA,EAAW,EAAA,CAInC,CAACuD,CAAAA,CAAkBC,CAAmB,CAAA,CAAI9D,cAAAA,CAASqB,CAAAA,CAAO,IAAA,EAAQ,EAAE,CAAA,CACpE,CAAC0C,CAAAA,CAAgBC,CAAiB,CAAA,CAAIhE,cAAAA,CAASqB,CAAAA,CAAO,EAAA,EAAM,EAAE,EAE9D4C,CAAAA,CAAU/D,YAAAA,CAAOmB,CAAAA,CAAO,IAAI,CAAA,CAC5B6C,CAAAA,CAAQhE,YAAAA,CAAOmB,CAAAA,CAAO,EAAE,CAAA,CAC9BM,eAAAA,CAAU,IAAM,CACVN,CAAAA,CAAO,OAAS4C,CAAAA,CAAQ,OAAA,GAC1BA,CAAAA,CAAQ,OAAA,CAAU5C,CAAAA,CAAO,IAAA,CACrBA,CAAAA,CAAO,IAAA,EAAMyC,CAAAA,CAAoBzC,CAAAA,CAAO,IAAI,CAAA,EAEpD,CAAA,CAAG,CAACA,EAAO,IAAI,CAAC,CAAA,CAChBM,eAAAA,CAAU,IAAM,CACVN,CAAAA,CAAO,EAAA,GAAO6C,CAAAA,CAAM,OAAA,GACtBA,CAAAA,CAAM,OAAA,CAAU7C,CAAAA,CAAO,EAAA,CACnBA,EAAO,EAAA,EAAI2C,CAAAA,CAAkB3C,CAAAA,CAAO,EAAE,CAAA,EAE9C,CAAA,CAAG,CAACA,CAAAA,CAAO,EAAE,CAAC,CAAA,CAId,IAAM8C,CAAAA,CAAiBjD,aAAAA,CACrB,IAAM,CAAC2C,CAAAA,CAAkBE,CAAc,CAAA,CAAE,MAAA,CAAO,OAAO,EACvD,CAACF,CAAAA,CAAkBE,CAAc,CACnC,CAAA,CAEMK,CAAAA,CAAcC,uBAClB,CAAE,KAAA,CAAA9D,CAAAA,CAAO,SAAA,CAAW4D,CAAe,CAAA,CACnC,CAAE,OAAA,CAASA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAAG,eAAA,CAAiBpB,EAAc,CACvE,EAEMuB,CAAAA,CAAYpD,aAAAA,CAChB,IAAMkD,CAAAA,CAAY,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYV,CAAgB,CAAA,EAAK,IAAA,CACvE,CAACO,CAAAA,CAAY,KAAMP,CAAgB,CACrC,CAAA,CACMW,CAAAA,CAAUtD,aAAAA,CACd,IAAMkD,CAAAA,CAAY,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYR,CAAc,CAAA,EAAK,KACrE,CAACK,CAAAA,CAAY,IAAA,CAAML,CAAc,CACnC,CAAA,CAIMU,CAAAA,CAAgBC,wCAAAA,CACpB,CAAE,KAAA,CAAAnE,CAAAA,CAAO,OAAA,CAASqD,CAAAA,CAAe,cAAA,CAAAO,CAAe,CAAA,CAChD,CACE,OAAA,CAAS,CAAC,CAACP,CAAAA,EAAiBO,CAAAA,CAAe,MAAA,CAAS,CAAA,CACpD,eAAA,CAAiBnB,EACnB,CACF,CAAA,CAEM2B,CAAAA,CAAczD,cAClB,IACEuD,CAAAA,CAAc,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYf,CAAgB,CAAA,EAAK,IAAA,CACrE,CAACY,CAAAA,CAAc,IAAA,CAAMZ,CAAgB,CACvC,CAAA,CACMgB,CAAAA,CAAY3D,aAAAA,CAChB,IAAMuD,CAAAA,CAAc,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYb,CAAc,CAAA,EAAK,IAAA,CACvE,CAACU,EAAc,IAAA,CAAMV,CAAc,CACrC,CAAA,CAIM,CAACe,CAAAA,CAAQC,CAAS,CAAA,CAAI/E,cAAAA,CAA6B,MAAS,CAAA,CAE5DgF,CAAAA,CAAmB9D,aAAAA,CAAQ,IAAM,CACrC,GAAI,CAAC4D,CAAAA,EAAUR,CAAAA,EAAW,QAAA,EAAY,IAAA,CAAM,OAC5C,IAAMW,CAAAA,CAAQH,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CACxBxB,EAAU2B,CAAAA,CAAM,CAAC,CAAA,EAAK,GAAA,CAEtB5B,EAAAA,CAAAA,CADY4B,CAAAA,CAAM,CAAC,CAAA,EAAK,EAAA,EAAI,KAAA,CAAM,CAAA,CAAGX,CAAAA,CAAU,QAAQ,CAAA,CACrC,OAAOA,CAAAA,CAAU,QAAA,CAAU,GAAG,CAAA,CAEtD,OAAA,CADYhB,CAAAA,CAAUD,EAAAA,EACX,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,EAAK,GACnC,CAAA,CAAG,CAACyB,EAAQR,CAAAA,EAAW,QAAQ,CAAC,CAAA,CAE1BY,CAAAA,CAAchE,aAAAA,CAAQ,IAAM,CAChC,GAAI,CAAC4D,CAAAA,EAAU,CAACR,CAAAA,EAAW,UAAA,EAAY,WAAY,OACnD,IAAMa,CAAAA,CAAQ,MAAA,CAAOb,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CAC9Cc,CAAAA,CAAQ,MAAA,CAAON,CAAM,CAAA,CAAIK,CAAAA,CAC/B,OAAO,OAAO,QAAA,CAASC,CAAK,CAAA,CAAIA,CAAAA,CAAM,QAAA,EAAS,CAAI,MACrD,CAAA,CAAG,CAACN,CAAAA,CAAQR,CAAAA,EAAW,UAAA,EAAY,UAAU,CAAC,EAIxCe,CAAAA,CAAgBjF,iBAAAA,CAAY,IAAM,CACtC,GAAI,CAACuE,CAAAA,CAAa,OAClB,IAAMW,CAAAA,CAAM,MAAA,CAAOX,CAAAA,CAAY,MAAM,CAAA,CACrC,GAAI,CAAC,MAAA,CAAO,QAAA,CAASW,CAAG,CAAA,EAAKA,CAAAA,EAAO,EAAG,OACvC,IAAMC,CAAAA,CAAOD,CAAAA,CAAM,CAAA,CACbnC,EAAAA,CAAWmB,GAAW,QAAA,EAAY,CAAA,CACxCS,CAAAA,CACEQ,CAAAA,CAAK,cAAA,CAAe,OAAA,CAAS,CAC3B,WAAA,CAAa,KAAA,CACb,qBAAA,CAAuBpC,EACzB,CAAC,CACH,EACF,EAAG,CAACwB,CAAAA,CAAaL,CAAAA,EAAW,QAAQ,CAAC,CAAA,CAE/BkB,CAAAA,CAAepF,iBAAAA,CAAY,IAAM,CACrC,GAAI,CAACuE,CAAAA,CAAa,OAClB,IAAMW,CAAAA,CAAM,MAAA,CAAOX,CAAAA,CAAY,MAAM,CAAA,CACrC,GAAI,CAAC,MAAA,CAAO,QAAA,CAASW,CAAG,CAAA,EAAKA,CAAAA,EAAO,CAAA,CAAG,OACvC,IAAMnC,CAAAA,CAAWmB,CAAAA,EAAW,QAAA,EAAY,CAAA,CACxCS,CAAAA,CACEO,CAAAA,CAAI,cAAA,CAAe,OAAA,CAAS,CAC1B,WAAA,CAAa,KAAA,CACb,qBAAA,CAAuBnC,CACzB,CAAC,CACH,EACF,CAAA,CAAG,CAACwB,CAAAA,CAAaL,CAAAA,EAAW,QAAQ,CAAC,CAAA,CAI/BmB,CAAAA,CAAcvE,aAAAA,CAClB,KAAO,CACL,KAAA,CAAAX,CAAAA,CACA,YAAaqD,CAAAA,EAAiB,MAAA,CAC9B,KAAA,CAAOC,CAAAA,EAAoB,MAAA,CAC3B,MAAA,CAAQE,CAAAA,EAAkB,MAAA,CAC1B,IAAA,CAAMrD,SAAAA,CAAI,QAAA,CAAS,QAAA,CACnB,MAAA,CAAQsE,CACV,GACA,CAACzE,CAAAA,CAAOqD,CAAAA,CAAeC,CAAAA,CAAkBE,CAAAA,CAAgBiB,CAAgB,CAC3E,CAAA,CAEMU,CAAAA,CAAgBxF,YAAAA,CAAO,KAAK,CAAA,CAE5B,CACJ,KAAA,CAAAO,EACA,SAAA,CAAAkF,CAAAA,CACA,KAAA,CAAOC,CACT,CAAA,CAAIxE,EAAAA,CAAoBqE,CAAAA,CAAa,CAAE,MAAA,CAAQC,CAAAA,CAAc,OAAQ,CAAC,CAAA,CAIhEG,CAAAA,CAAe3E,cACnB,IACET,CAAAA,EAAS+D,CAAAA,CACLvB,EAAAA,CAAmBxC,CAAAA,CAAM,KAAA,CAAO+D,CAAAA,CAAQ,QAAQ,CAAA,CAChD,MAAA,CACN,CAAC/D,CAAAA,CAAO+D,CAAO,CACjB,EAEMsB,CAAAA,CAAoB5E,aAAAA,CAAQ,IAAM,CACtC,GAAI,CAAC2E,CAAAA,EAAgB,CAACrB,CAAAA,EAAS,UAAA,EAAY,UAAA,CAAY,OACvD,IAAMW,CAAAA,CAAQ,OAAOX,CAAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,CAC5CY,CAAAA,CAAQ,MAAA,CAAOS,CAAY,CAAA,CAAIV,CAAAA,CACrC,OAAO,MAAA,CAAO,QAAA,CAASC,CAAK,CAAA,CAAIA,EAAM,QAAA,EAAS,CAAI,MACrD,CAAA,CAAG,CAACS,CAAAA,CAAcrB,CAAAA,EAAS,UAAA,EAAY,UAAU,CAAC,CAAA,CAI5C,CAAE,IAAA,CAAMuB,CAAAA,CAAS,WAAAjG,CAAW,CAAA,CAAIJ,EAAAA,EAAQ,CAC9CgG,CAAAA,CAAc,OAAA,CAAU5F,CAAAA,CAExB,IAAMkG,CAAAA,CAAgB9F,YAAAA,CAAOmB,CAAAA,CAAO,UAAU,CAAA,CAC9C2E,CAAAA,CAAc,QAAU3E,CAAAA,CAAO,UAAA,CAE/B,GAAM,CAAE,KAAA,CAAAiB,EAAAA,CAAO,YAAA,CAAAR,CAAa,CAAA,CAAID,EAAAA,CAAkB,CAChD,WAAA,CAAcI,CAAAA,EAAW,CACvB+D,EAAc,OAAA,GAAU,CAAE,OAAA,CAAS,IAAA,CAAM,MAAA,CAAA/D,CAAO,CAAC,EACnD,CAAA,CACA,QAAA,CAAWA,CAAAA,EAAW,CACpB+D,CAAAA,CAAc,OAAA,GAAU,CAAE,OAAA,CAAS,KAAA,CAAO,MAAA,CAAA/D,CAAO,CAAC,EACpD,CACF,CAAC,CAAA,CAEKgE,CAAAA,CAAiB/E,aAAAA,CAAQ,IAAM,CACnC,GAAIY,CAAAA,CAAa,IAAA,GAAS,CAAA,CAAG,OAAO,MAAA,CACpC,IAAMoE,CAAAA,CAAU,KAAA,CAAM,IAAA,CAAKpE,CAAAA,CAAa,MAAA,EAAQ,CAAA,CAChD,OAAOoE,EAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,CAAG,MACtC,CAAA,CAAG,CAACpE,CAAY,CAAC,CAAA,CAEX3B,CAAAA,CAAOC,iBAAAA,CAAY,SAAY,CACnC,GACE,EAAA,CAACE,CAAAA,EACD,CAACG,CAAAA,EACD,CAACoD,CAAAA,EACD,CAACE,CAAAA,EACD,CAACiB,CAAAA,CAAAA,CAKH,GAAI,CACF,IAAM/D,CAAAA,CAAS,MAAM8E,CAAAA,CAAQ,CAC3B,KAAA,CAAAxF,CAAAA,CACA,MAAA,CAAAD,CAAAA,CACA,KAAA,CAAOuD,CAAAA,CACP,MAAA,CAAQE,CAAAA,CACR,MAAA,CAAQiB,CAAAA,CACR,IAAA,CAAMtE,SAAAA,CAAI,SAAS,QACrB,CAAC,CAAA,CACD4B,EAAAA,CAAM/B,CAAAA,CAAOU,CAAAA,CAAO,MAAM,EAC5B,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,CACDX,CAAAA,CACAG,EACAF,CAAAA,CACAsD,CAAAA,CACAE,CAAAA,CACAiB,CAAAA,CACAe,CAAAA,CACAzD,EACF,CAAC,CAAA,CAIK6D,EAAAA,CAAY/B,CAAAA,CAAY,SAAA,EAAaK,CAAAA,CAAc,SAAA,CAIzD,OAAOvD,cACL,KAAO,CACL,gBAAA,CAAA2C,CAAAA,CACA,cAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAD,CAAAA,CACA,iBAAA,CAAAE,CAAAA,CAEA,SAAA,CAAAM,CAAAA,CACA,OAAA,CAAAE,CAAAA,CAEA,YAAAG,CAAAA,CACA,SAAA,CAAAE,CAAAA,CAEA,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,EACA,aAAA,CAAAM,CAAAA,CACA,YAAA,CAAAG,CAAAA,CACA,gBAAA,CAAAR,CAAAA,CACA,YAAAE,CAAAA,CAEA,YAAA,CAAAW,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CAEA,KAAA,CAAArF,CAAAA,CACA,SAAA,CAAAkF,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAEA,IAAA,CAAAzF,CAAAA,CACA,UAAA,CAAAL,EAEA,QAAA,CAAUmG,CAAAA,CAEV,SAAA,CAAAE,EACF,CAAA,CAAA,CACA,CACEtC,CAAAA,CACAE,CAAAA,CACAO,CAAAA,CACAE,CAAAA,CACAG,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACAO,CAAAA,CACAG,EACAR,CAAAA,CACAE,CAAAA,CACAW,CAAAA,CACAC,CAAAA,CACArF,CAAAA,CACAkF,CAAAA,CACAC,CAAAA,CACAzF,CAAAA,CACAL,CAAAA,CACAmG,CAAAA,CACAE,EACF,CACF,CACF,CC3TO,SAASC,EAAAA,CAAiB,CAC/B,MAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,SAAA,CAAAhC,CAAAA,CACA,OAAA,CAAAE,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,WAAA,CAAA4B,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,aAAAX,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,KAAA,CAAArF,CAAAA,CACA,SAAA,CAAAkF,EACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAa,CAAAA,CACA,UAAA,CAAA3G,CACF,EAA0B,CACxB,GAAM,CAAC4G,CAAAA,CAAUC,CAAW,CAAA,CAAI3G,cAAAA,CAAS,KAAK,CAAA,CACxC4G,CAAAA,CAAiBxG,iBAAAA,CAAY,IAAMuG,CAAAA,CAAaxE,CAAAA,EAAS,CAACA,CAAI,CAAA,CAAG,EAAE,CAAA,CAEnEe,CAAAA,CAAQhC,aAAAA,CAAQ,IACfT,CAAAA,CACEA,CAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAACoG,CAAAA,CAAMrH,KAAO,CACnC,GAAA,CAAK,CAAA,KAAA,EAAQA,CAAC,CAAA,CAAA,CACd,IAAA,CAAMqH,CAAAA,CAAK,IAAA,CACX,KAAA,CAAOA,CAAAA,CAAK,KAAA,CACZ,WAAA,CAAaA,CAAAA,CAAK,WAAA,CAClB,OAAQA,CAAAA,CAAK,MAAA,CACb,YAAA,CAAcA,CAAAA,CAAK,YAAA,CACnB,QAAA,CAAUA,CAAAA,CAAK,QAAA,CACf,SAAA,CAAWA,CAAAA,CAAK,SAClB,CAAA,CAAE,CAAA,CAViB,GAWlB,CAACpG,CAAK,CAAC,CAAA,CAEV,OACEqG,cAAAA,CAACC,QAAAA,CAAA,CACC,MAAA,CAAQV,CAAAA,CACR,YAAA,CAAcC,CAAAA,CACd,eAAA,CAAe,IAAA,CACf,eAAe,QAAA,CACf,QAAA,CAAS,MAAA,CAET,QAAA,CAAAU,eAAAA,CAACC,eAAAA,CAAA,CAAa,SAAA,CAAU,wBAAA,CACtB,QAAA,CAAA,CAAAH,cAAAA,CAACI,cAAAA,CAAA,CAAY,QAAA,CAAA,SAAA,CAAO,EACpBJ,cAAAA,CAACK,YAAAA,CAAA,CACC,QAAA,CAAAH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CAAqE,QAAA,CAAA,MAAA,CAEpF,CAAA,CACAE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sEAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACZ,UAAA1C,CAAAA,EAAW,KAAA,EACVwC,cAAAA,CAACM,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK9C,CAAAA,CAAU,KAAA,CACf,IAAA,CAAMA,CAAAA,CAAU,MAAA,CAChB,SAAA,CAAU,UACZ,CAAA,CAEF0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAxC,CAAAA,EAAW,MAAA,EAAU,QAAA,CACxB,EACCK,CAAAA,EACCqC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACO,EAAAA,CAAA,EAAkB,CAAA,CACnBL,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAM,EAAAA,CAAa3C,EAAY,MAAM,CAAA,CAAE,GAAA,CAAEL,CAAAA,EAAW,MAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAQ,EAAAA,CAAaf,CAAW,CAAA,CAC3B,CAAA,CACAS,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,CAAA,GAAA,CACtCO,EAAAA,CAAUf,CAAgB,CAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAQ,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CAAqE,6BAEpF,CAAA,CACAE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sEAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACZ,QAAA,CAAA,CAAAxC,CAAAA,EAAS,KAAA,EACRsC,cAAAA,CAACM,UAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK5C,CAAAA,CAAQ,KAAA,CACb,KAAMA,CAAAA,CAAQ,MAAA,CACd,SAAA,CAAU,SAAA,CACZ,CAAA,CAEFwC,eAAAA,CAAC,OAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAtC,CAAAA,EAAS,MAAA,EAAU,QAAA,CACtB,CAAA,CACAsC,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0BAAA,CACZ,QAAA,CAAAU,EAAAA,CAAgBhD,CAAAA,EAAS,OAAO,CAAA,CACnC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAwC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAQ,EAAAA,CAAazB,CAAY,CAAA,CAC5B,CAAA,CACAmB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,CAAA,GAAA,CACtCO,EAAAA,CAAUzB,CAAiB,CAAA,CAAA,CAC/B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGCY,CAAAA,EAAYxD,CAAAA,CAAM,MAAA,CAAS,CAAA,EAC1B8D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oEAAA,CAAqE,QAAA,CAAA,eAAA,CAEpF,CAAA,CACAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAA5D,CAAAA,CAAM,GAAA,CAAK2D,CAAAA,EACVG,eAAAA,CAAC,OAEC,SAAA,CAAU,0EAAA,CAEV,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,KAAA,CAAG,CAAA,CACzCA,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAAD,CAAAA,CAAK,IAAA,CACR,CAAA,CAAA,CACF,CAAA,CACAG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,MAAA,CAAI,CAAA,CAC1CE,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAS,EAAAA,CAAkBZ,EAAK,WAAW,CAAA,CAAG,GAAA,CACrCW,EAAAA,CAAgBX,CAAAA,CAAK,KAAK,CAAA,CAAA,CAC7B,CAAA,CACAC,cAAAA,CAACY,YAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,GACR,SAAA,CAAU,iBAAA,CACZ,CAAA,CACAV,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAS,EAAAA,CAAkBZ,CAAAA,CAAK,YAAY,CAAA,CAAG,GAAA,CACtCW,EAAAA,CAAgBX,CAAAA,CAAK,MAAM,GAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACCA,CAAAA,CAAK,SAAA,EACJG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,eAAG,CAAA,CACzCE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAA,CAAAS,EAAAA,CAAkBZ,CAAAA,CAAK,SAAS,CAAA,CAAG,GAAA,CACnCW,EAAAA,CAAgBX,CAAAA,CAAK,QAAQ,GAChC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAlCGA,CAAAA,CAAK,GAoCZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAID3D,CAAAA,CAAM,MAAA,CAAS,CAAA,EACd4D,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBACb,QAAA,CAAAA,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,0CAAA,CACV,UAAA,CACEjB,CAAAA,CACEI,cAAAA,CAACc,gBAAAA,CAAA,CAAc,KAAA,CAAO,GAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAEtCd,cAAAA,CAACe,kBAAAA,CAAA,CAAgB,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAG5C,aAAA,CAAa,IAAA,CACb,OAAA,CAASjB,EAER,QAAA,CAAAF,CAAAA,CAAW,WAAA,CAAc,WAAA,CAC5B,CAAA,CACF,CAAA,CAAA,CAEJ,EACF,CAAA,CACAI,cAAAA,CAACgB,cAAAA,CAAA,CACC,QAAA,CAAAhB,cAAAA,CAACa,UAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAM,SAAA,CACN,SAAA,CAAU,iBAAA,CACV,aAAA,CAAa,IAAA,CACb,UAAA,CAAY,CAAClH,CAAAA,EAAS,CAAC,CAACmF,EACxB,SAAA,CAAY,CAACnF,CAAAA,EAASkF,CAAAA,EAAc7F,CAAAA,CACpC,OAAA,CAAS2G,CAAAA,CACV,QAAA,CAAA,SAAA,CAED,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,SAASY,IAAoB,CAC3B,OACEL,eAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAM,4BAAA,CACN,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,OAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,SAAA,CAAU,cAAA,CAEV,QAAA,CAAA,CAAAF,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,+BAAA,CAAgC,EACxCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6BAAA,CAA8B,CAAA,CACtCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4BAAA,CAA6B,CAAA,CAAA,CACvC,CAEJ,CAEA,SAASS,EAAAA,CAAUnC,EAAmC,CACpD,GAAI,CAACA,CAAAA,CAAO,OAAO,MAAA,CACnB,IAAM2C,CAAAA,CAAI,MAAA,CAAO3C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS2C,CAAC,CAAA,CACfA,CAAAA,CAAE,cAAA,CAAe,OAAA,CAAS,CAC/B,qBAAA,CAAuB,CAAA,CACvB,qBAAA,CAAuB,CACzB,CAAC,CAAA,CAJ+B,MAKlC,CAEA,SAAST,GAAalC,CAAAA,CAAmC,CACvD,GAAI,CAACA,CAAAA,CAAO,OAAO,IACnB,IAAM2C,CAAAA,CAAI,MAAA,CAAO3C,CAAK,CAAA,CACtB,OAAK,OAAO,QAAA,CAAS2C,CAAC,CAAA,CAClBA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAW,cAAA,CAAe,OAAA,CAAS,CACtC,qBAAA,CAAuB,CACzB,CAAC,CAAA,CAAI,IAELA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAO,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAAI,GAAA,CAEjEA,CAAAA,CAAE,cAAA,CAAe,QAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAX7B,GAYlC,CAGA,SAASN,EAAAA,CAAkBrC,CAAAA,CAAmC,CAC5D,GAAI,CAACA,CAAAA,EAASA,IAAU,GAAA,CAAK,OAAO,GAAA,CACpC,IAAM2C,CAAAA,CAAI,MAAA,CAAO3C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS2C,CAAC,CAAA,CAClBA,CAAAA,EAAK,MAAcA,CAAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CAC1CA,CAAAA,EAAK,GAAA,CAAA,CAAaA,CAAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CACxCA,GAAK,GAAA,CAAA,CAAaA,CAAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,GAAA,CACxCA,CAAAA,EAAK,GAAA,CAAA,CAAaA,CAAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAI,IACrC3C,CAAAA,CALyBA,CAMlC,CAEA,SAASoC,EAAAA,CAAgBQ,CAAAA,CAAkC,CACzD,OAAKA,CAAAA,CACDA,CAAAA,CAAK,MAAA,EAAU,EAAA,CAAWA,CAAAA,CACvB,CAAA,EAAGA,EAAK,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,GAAA,EAAMA,CAAAA,CAAK,MAAM,EAAE,CAAC,CAAA,CAAA,CAF5B,QAGpB,CCjSO,SAASC,EAAAA,CAAO,CACrB,SAAA,CAAA3D,CAAAA,CACA,OAAA,CAAAE,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,SAAA,CAAAE,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,WAAA,CAAAI,EACA,cAAA,CAAAgD,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAvC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAuC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,MAAA7H,CAAAA,CACA,SAAA,CAAAkF,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAA2C,CAAAA,CACA,UAAA,CAAAzI,CAAAA,CACA,SAAA,CAAA0I,CACF,CAAA,CAAgB,CACd,OACExB,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAWyB,KAAAA,CAAG,mBAAA,CAAqBD,CAAS,CAAA,CAE/C,QAAA,CAAA,CAAAxB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,kCAAA,CAAmC,QAAA,CAAA,MAAA,CAAI,CAAA,CACpDE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,cAAAA,CAAC4B,QAAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO5D,CAAAA,EAAU,EAAA,CACjB,QAAA,CAAWnE,CAAAA,EAAMuH,CAAAA,CAAevH,EAAE,MAAA,CAAO,KAAA,EAAS,MAAS,CAAA,CAC3D,WAAA,CAAY,GAAA,CACZ,WAAY,CACV,YAAA,CAAc8H,KAAAA,CACZ,yBAAA,CACA,yEAAA,CACA,0GACF,EACA,KAAA,CAAOA,KAAAA,CACL,kDAAA,CACA,2EAAA,CACA,gEACF,CACF,CAAA,CACF,CAAA,CACF,CAAA,CACA3B,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAAA,eAACa,SAAAA,CAAA,CACC,SAAA,CAAWc,KAAAA,CACT,6DAAA,CACAnE,CAAAA,CAAY,iBAAA,CAAoB,cAClC,CAAA,CACA,aAAA,CAAa,IAAA,CACb,YAAA,CACEA,CAAAA,EAAW,KAAA,CACTwC,eAACM,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK9C,CAAAA,CAAU,KAAA,CACf,IAAA,CAAMA,CAAAA,CAAU,MAAA,CAChB,SAAA,CAAU,SAAA,CACZ,CAAA,CACE,IAAA,CAEN,WACEwC,cAAAA,CAACe,kBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEF,OAAA,CAAS,IAAMQ,CAAAA,CAAkB,EAAE,EAElC,QAAA,CAAA/D,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAS,cAAA,CAClC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEA0C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CAA8B,QAAA,CAAA,CAAA,UAAA,CACvCO,EAAAA,CAAUrC,CAAW,CAAA,CAAA,CAC3B,CAAA,CACCP,CAAAA,EACCqC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACO,GAAA,EAAkB,CAAA,CACnBL,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAM,EAAAA,CAAa3C,CAAAA,CAAY,MAAM,CAAA,CAAE,GAAA,CAAEA,CAAAA,CAAY,MAAA,CAAA,CAClD,EACCwD,CAAAA,EACCrB,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,6BAAA,CACV,OAAA,CAASqB,EACV,QAAA,CAAA,MAAA,CAED,CAAA,CAEDC,CAAAA,EACCtB,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,8BACV,OAAA,CAASsB,CAAAA,CACV,QAAA,CAAA,KAAA,CAED,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CAECxC,CAAAA,EACCkB,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,0CAAA,CACV,QAAA,CAAAlB,CAAAA,CAAW,OAAA,CACd,GAEJ,CAAA,CAAA,CACF,CAAA,CAGAoB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,kCAAA,CAAmC,QAAA,CAAA,IAAA,CAAE,CAAA,CAClDE,eAAAA,CAAC,OAAI,SAAA,CAAU,yDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,cAAAA,CAAC4B,SAAA,CACC,IAAA,CAAK,QAAA,CACL,KAAA,CAAO7C,CAAAA,EAAgB,EAAA,CACvB,QAAA,CAAQ,IAAA,CACR,WAAA,CAAY,GAAA,CACZ,UAAA,CAAY,CACV,YAAA,CAAc4C,KAAAA,CACZ,0BACA,yEAAA,CACA,0GACF,CAAA,CACA,KAAA,CAAOA,KAAAA,CACL,kDAAA,CACA,2EAAA,CACA,gEACF,CACF,CAAA,CACF,CAAA,CACF,CAAA,CACA3B,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gDAAA,CACb,QAAA,CAAAA,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAWc,KAAAA,CACT,6DAAA,CACAjE,CAAAA,CAAU,iBAAA,CAAoB,cAChC,CAAA,CACA,aAAA,CAAa,IAAA,CACb,aACEA,CAAAA,EAAS,KAAA,CACPsC,cAAAA,CAACM,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,GAAA,CAAK5C,CAAAA,CAAQ,KAAA,CACb,IAAA,CAAMA,CAAAA,CAAQ,MAAA,CACd,SAAA,CAAU,UACZ,CAAA,CACE,IAAA,CAEN,UAAA,CACEsC,cAAAA,CAACe,kBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEF,OAAA,CAAS,IAAMS,CAAAA,CAAgB,EAAE,CAAA,CAEhC,QAAA,CAAA9D,CAAAA,CAAUA,CAAAA,CAAQ,MAAA,CAAS,cAAA,CAC9B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEAwC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CAA8B,QAAA,CAAA,CAAA,UAAA,CACvCO,EAAAA,CAAUzB,CAAiB,CAAA,CAAA,CACjC,CAAA,CACCjB,CAAAA,EACCmC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CACb,QAAA,CAAA,CAAAF,cAAAA,CAACO,EAAAA,CAAA,EAAkB,CAAA,CACnBL,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAM,EAAAA,CAAazC,CAAAA,CAAU,MAAM,CAAA,CAAE,IAAEA,CAAAA,CAAU,MAAA,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAiC,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAM,SAAA,CACN,UAAU,sBAAA,CACV,aAAA,CAAa,IAAA,CACb,UAAA,CAAY,CAAClH,CAAAA,CACb,SAAA,CAAW,CAACA,CAAAA,EAASkF,CAAAA,CACrB,OAAA,CAAS4C,CAAAA,CAER,QAAA,CAAAzI,CAAAA,CAAa,cAAgB6F,CAAAA,CAAY,kBAAA,CAAqB,MAAA,CACjE,CAAA,CAAA,CACF,CAEJ,CAEA,SAAS0B,EAAAA,EAAoB,CAC3B,OACEL,eAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAM,4BAAA,CACN,MAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,OAAA,CAAQ,WAAA,CACR,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,WAAA,CAAa,CAAA,CACb,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,QACf,SAAA,CAAU,cAAA,CAEV,QAAA,CAAA,CAAAF,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,gCAAgC,CAAA,CACxCA,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,6BAAA,CAA8B,CAAA,CACtCA,eAAC,MAAA,CAAA,CAAK,CAAA,CAAE,4BAAA,CAA6B,CAAA,CAAA,CACvC,CAEJ,CAEA,SAASS,EAAAA,CAAUnC,CAAAA,CAAmC,CACpD,GAAI,CAACA,CAAAA,CAAO,OAAO,OACnB,IAAM2C,CAAAA,CAAI,MAAA,CAAO3C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS2C,CAAC,CAAA,CACfA,CAAAA,CAAE,cAAA,CAAe,OAAA,CAAS,CAC/B,sBAAuB,CAAA,CACvB,qBAAA,CAAuB,CACzB,CAAC,CAAA,CAJ+B,MAKlC,CAEA,SAAST,EAAAA,CAAalC,CAAAA,CAAmC,CACvD,GAAI,CAACA,CAAAA,CAAO,OAAO,GAAA,CACnB,IAAM2C,CAAAA,CAAI,MAAA,CAAO3C,CAAK,CAAA,CACtB,OAAK,MAAA,CAAO,QAAA,CAAS2C,CAAC,CAAA,CAClBA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,KAAW,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CACpE,GAAA,CAEAA,CAAAA,EAAK,GAAA,CAAA,CAEJA,CAAAA,CAAI,GAAA,EAAO,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAAI,GAAA,CAEjEA,CAAAA,CAAE,cAAA,CAAe,OAAA,CAAS,CAAE,qBAAA,CAAuB,CAAE,CAAC,CAAA,CAV7B,GAWlC,CCpPO,SAASY,EAAAA,CAAW,CACzB,KAAA,CAAApI,CAAAA,CACA,IAAA,CAAAqI,CAAAA,CACA,GAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAN,CACF,CAAA,CAAoB,CAClB,IAAMO,CAAAA,CAASvF,EAAAA,CAAc,CAAE,KAAA,CAAAjD,CAAAA,CAAO,KAAAqI,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAI,UAAA,CAAAC,CAAW,CAAC,CAAA,CACtD,CAAE,MAAA,CAAAzC,CAAAA,CAAQ,MAAA,CAAA2C,CAAAA,CAAQ,YAAA,CAAA1C,CAAAA,CAAc,QAAA2C,CAAQ,CAAA,CAAIC,gBAAAA,EAAc,CAE1DC,CAAAA,CAAgB/I,iBAAAA,CAAY,SAAY,CAC5C,MAAM2I,CAAAA,CAAO,IAAA,EAAK,CAClBE,CAAAA,GACF,EAAG,CAACF,CAAAA,CAAQE,CAAO,CAAC,CAAA,CAEpB,OACEjC,eAAAA,CAAAoC,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAtC,cAAAA,CAACmB,EAAAA,CAAA,CACC,SAAA,CAAWc,EAAO,SAAA,CAClB,OAAA,CAASA,CAAAA,CAAO,OAAA,CAChB,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,WAAA,CAAaA,EAAO,WAAA,CACpB,cAAA,CAAgBA,CAAAA,CAAO,SAAA,CACvB,YAAA,CAAcA,CAAAA,CAAO,aAAA,CACrB,WAAA,CAAaA,CAAAA,CAAO,YAAA,CACpB,YAAA,CAAcA,CAAAA,CAAO,YAAA,CACrB,iBAAA,CAAmBA,EAAO,iBAAA,CAC1B,iBAAA,CAAmBA,CAAAA,CAAO,mBAAA,CAC1B,eAAA,CAAiBA,CAAAA,CAAO,iBAAA,CACxB,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,UAAA,CAAYA,EAAO,UAAA,CACnB,SAAA,CAAWC,CAAAA,CACX,UAAA,CAAYD,CAAAA,CAAO,UAAA,CACnB,SAAA,CAAWP,CAAAA,CACb,CAAA,CACA1B,cAAAA,CAACV,EAAAA,CAAA,CACC,MAAA,CAAQC,CAAAA,CACR,aAAcC,CAAAA,CACd,SAAA,CAAWyC,CAAAA,CAAO,SAAA,CAClB,OAAA,CAASA,CAAAA,CAAO,QAChB,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,WAAA,CAAaA,CAAAA,CAAO,MAAA,CACpB,iBAAkBA,CAAAA,CAAO,WAAA,CACzB,YAAA,CAAcA,CAAAA,CAAO,YAAA,CACrB,iBAAA,CAAmBA,CAAAA,CAAO,iBAAA,CAC1B,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,WAAYA,CAAAA,CAAO,UAAA,CACnB,SAAA,CAAWI,CAAAA,CACX,UAAA,CAAYJ,CAAAA,CAAO,UAAA,CACrB,CAAA,CAAA,CACF,CAEJ,CCsBO,IAAMM,EAAAA,CAA0C,CACrD,QAAA,CAAU,EAAA,CACV,WAAA,CAAa,IAAA,CACb,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,KAAA,CACT,UAAA,CAAY,EAAA,CACZ,OAAA,CAAS,MACT,SAAA,CAAW,IACb,CAAA,CAGaC,EAAAA,CAA8C,CACzD,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,CAAA,CACb,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,KAAA,CACT,UAAA,CAAY,KACZ,OAAA,CAAS,KAAA,CACT,SAAA,CAAW,IACb,CAAA,CAGaC,EAAAA,CAA8C,CACzD,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,CAAA,CACb,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,MACT,UAAA,CAAY,IAAA,CACZ,OAAA,CAAS,KAAA,CACT,SAAA,CAAW,IACb,CAAA,CAGaC,EAAAA,CAAgC,CAAC,GAAA,CAAM,EAAA,CAAK,CAAA,CAAG,EAAE,CAAA,CAGjDC,GAAqC,CAAC,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAG,ECzHlE,IAAM9G,EAAAA,CAAoC,IAAI,GAAA,CAAI,CAChDC,WAAAA,CAAM,MAAA,CACNA,WAAAA,CAAM,eACNA,WAAAA,CAAM,aACR,CAAC,CAAA,CAEK8G,EAAAA,CAAiC,IAAI,GAAA,CAAI,CAC7C9G,WAAAA,CAAM,OAAA,CACNA,WAAAA,CAAM,eACR,CAAC,CAAA,CAiCM,SAAS+G,EAAAA,CACdpJ,CAAAA,CACAqJ,CAAAA,CAAe,KAAA,CACM,CACrB,OAAIjH,EAAAA,CAAc,GAAA,CAAIpC,CAAK,CAAA,CAClB,CACL,QAAA,CAAU,cAAA,CACV,OAAA,CAAS,MACT,WAAA,CAAa,CAAA,CACb,UAAA,CAAY,IAAA,CACZ,UAAA,CAAY,KAAA,CACZ,cAAA,CAAgB,CAAA,CAChB,cAAA,CAAgB,CAAC,KAAA,CAAO,SAAA,CAAW,QAAQ,CAC7C,EAGEmJ,EAAAA,CAAW,GAAA,CAAInJ,CAAK,CAAA,CACf,CACL,QAAA,CAAU,SAAA,CACV,OAAA,CAAS,MAAA,CACT,WAAA,CAAa,CAAA,CACb,UAAA,CAAY,IAAA,CACZ,UAAA,CAAY,MACZ,cAAA,CAAgB,CAAA,CAChB,cAAA,CAAgB,CAAC,KAAA,CAAO,QAAQ,CAClC,CAAA,CAIK,CACL,QAAA,CAAU,SAAA,CACV,OAAA,CAAS,MAAA,CACT,WAAA,CAAa,EACb,UAAA,CAAY,KAAA,CACZ,UAAA,CAAYqJ,CAAAA,CACZ,cAAA,CAAgB,CAAA,CAChB,cAAA,CAAgB,CAAC,KAAA,CAAO,QAAQ,CAClC,CACF,CAEO,SAASC,GAActJ,CAAAA,CAAuB,CACnD,OAAOoC,EAAAA,CAAc,GAAA,CAAIpC,CAAK,CAChC,CAGO,SAASuJ,CAAAA,CAAyBvJ,CAAAA,CAAiC,CACxE,OAAIoC,EAAAA,CAAc,IAAIpC,CAAK,CAAA,CAAU8I,EAAAA,CACjCK,EAAAA,CAAW,GAAA,CAAInJ,CAAK,EAAUgJ,EAAAA,CAC3BD,EACT,CC7EA,SAASS,EAAAA,CAAqBxJ,CAAAA,CAAoC,CAChE,IAAMyJ,CAAAA,CAASF,CAAAA,CAAyBvJ,CAAK,CAAA,CAC7C,OAAO,CACL,GAAA,CAAK,CACH,aAAA,CAAe,CAAC,IAAM,EAAA,CAAK,CAAA,CAAG,EAAE,CAAA,CAChC,OAAA,CAAS,CAAC,CAAE,GAAGyJ,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAC,CACvD,CAAA,CACA,IAAA,CAAM,CACJ,iBAAA,CAAmB,CAAC,EAAA,CAAI,EAAA,CAAI,EAAA,CAAI,GAAG,CAAA,CACnC,QAAS,CAAC,CAAE,GAAGA,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAA,CAAG,CAAE,GAAGA,CAAO,CAAC,CACvD,CACF,CACF,CAEO,IAAMC,EAAAA,CACXF,EAAAA,CAAqB,WAAoB,EAM3C,SAASG,EAAAA,CAAW3J,CAAAA,CAAe,CACjC,OAAO,CAAA,+BAAA,EAAkCA,CAAK,EAChD,CAEA,SAAS4J,EAAAA,CACP5J,CAAAA,CACA6J,CAAAA,CACsB,CACtB,GAAI,CACF,IAAMhH,CAAAA,CAAM,YAAA,CAAa,OAAA,CAAQ8G,EAAAA,CAAW,MAAA,CAAO3J,CAAK,CAAC,CAAC,CAAA,CAC1D,GAAI6C,CAAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAG,CAChC,CAAA,KAAQ,CAER,CACA,OAAOgH,CACT,CAEA,SAASC,EAAAA,CAAoB9J,CAAAA,CAAe+J,CAAAA,CAAgC,CAC1E,GAAI,CACF,YAAA,CAAa,OAAA,CAAQJ,EAAAA,CAAW3J,CAAK,CAAA,CAAG,KAAK,SAAA,CAAU+J,CAAQ,CAAC,EAClE,CAAA,KAAQ,CAER,CACF,CAMA,IAAMC,EAAAA,CAAsBC,mBAAAA,CAC1B,IACF,CAAA,CAGO,SAASC,IAA4C,CAC1D,IAAMC,CAAAA,CAAMC,gBAAAA,CAAWJ,EAAmB,CAAA,CAC1C,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,6DACF,CAAA,CAEF,OAAOA,CACT,CAaO,SAASE,EAAAA,CAAqB,CACnC,KAAA,CAAArK,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,QAAA,CAAUC,CAAAA,CACV,gBAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAA8B,CAC5B,IAAMC,CAAAA,CAAc/J,aAAAA,CAAQ,IAAMgK,oBAAAA,CAAe3K,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1D4K,CAAAA,CAAeL,IAAuB,MAAA,CACtCM,CAAAA,CAAgBlK,aAAAA,CAAQ,IAAM6I,EAAAA,CAAqBxJ,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAGlE,CAAC8K,CAAAA,CAAeC,CAAgB,EAAItL,cAAAA,CACxC,IACEmL,CAAAA,CAAeC,CAAAA,CAAgBjB,EAAAA,CAAmB5J,CAAAA,CAAO6K,CAAa,CAC1E,CAAA,CAEMd,CAAAA,CAAWa,CAAAA,CAAeL,CAAAA,CAAqBO,CAAAA,CAE/CE,CAAAA,CAAcnL,kBACjBiC,CAAAA,EAA+B,CAC1B8I,CAAAA,CACFJ,CAAAA,GAAmB1I,CAAI,CAAA,EAEvBiJ,CAAAA,CAAiBjJ,CAAI,CAAA,CACrBgI,EAAAA,CAAoB,MAAA,CAAO9J,CAAK,CAAA,CAAG8B,CAAI,GAE3C,CAAA,CACA,CAAC8I,CAAAA,CAAcJ,CAAAA,CAAkBxK,CAAK,CACxC,EAEMiL,CAAAA,CAAoBpL,iBAAAA,CACvBqL,CAAAA,EAAqBF,CAAAA,CAAY,CAAE,GAAGjB,EAAU,GAAA,CAAAmB,CAAI,CAAC,CAAA,CACtD,CAACnB,CAAAA,CAAUiB,CAAW,CACxB,CAAA,CAEMG,CAAAA,CAAqBtL,iBAAAA,CACxBuL,CAAAA,EAAuBJ,CAAAA,CAAY,CAAE,GAAGjB,CAAAA,CAAU,IAAA,CAAAqB,CAAK,CAAC,CAAA,CACzD,CAACrB,CAAAA,CAAUiB,CAAW,CACxB,CAAA,CAGM,CAACK,CAAAA,CAAWC,CAAY,CAAA,CAAI7L,eAAyB,KAAK,CAAA,CAC1D,CAAC8E,CAAAA,CAAQC,CAAS,CAAA,CAAI/E,cAAAA,EAA6B,CACnD,CAAC8L,CAAAA,CAAWC,CAAY,CAAA,CAAI/L,cAAAA,CAAS,CAAC,EACtC,CAACgM,CAAAA,CAAYC,CAAa,CAAA,CAAIjM,cAAAA,CAAS,CAAC,CAAA,CAExCkM,CAAAA,CAAgBhL,aAAAA,CAAQ,IAAM4I,CAAAA,CAAyBvJ,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEtE4L,CAAAA,CAAsBjL,aAAAA,CAAQ,IAAM,CACxC,IAAMkL,CAAAA,CAAMR,CAAAA,GAAc,KAAA,CAAQE,CAAAA,CAAYE,CAAAA,CAG9C,OAAA,CADEJ,CAAAA,GAAc,MAAQtB,CAAAA,CAAS,GAAA,CAAI,OAAA,CAAUA,CAAAA,CAAS,IAAA,CAAK,OAAA,EAC9C8B,CAAG,CAAA,EAAKF,CACzB,CAAA,CAAG,CAACN,CAAAA,CAAWE,CAAAA,CAAWE,CAAAA,CAAY1B,EAAU4B,CAAa,CAAC,CAAA,CAExD9G,CAAAA,CAAQlE,aAAAA,CACZ,KAAO,CACL,KAAA,CAAAX,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,WAAA,CAAAI,CAAAA,CACA,SAAA,CAAAW,EACA,YAAA,CAAAC,CAAAA,CACA,MAAA,CAAA/G,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAA+G,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,SAAA3B,CAAAA,CACA,iBAAA,CAAAkB,CAAAA,CACA,kBAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAS,CACF,CAAA,CAAA,CACA,CACE5L,CAAAA,CACAsK,CAAAA,CACAI,CAAAA,CACAW,CAAAA,CACA9G,CAAAA,CACAgH,EACAE,CAAAA,CACA1B,CAAAA,CACAkB,CAAAA,CACAE,CAAAA,CACAS,CACF,CACF,CAAA,CAEA,OACErF,cAAAA,CAACyD,EAAAA,CAAoB,QAAA,CAApB,CAA6B,KAAA,CAAOnF,CAAAA,CAClC,SAAA4F,CAAAA,CACH,CAEJ,CCvKA,IAAMrI,EAAAA,CAAoC,IAAI,GAAA,CAAI,CAChDC,WAAAA,CAAM,MAAA,CACNA,WAAAA,CAAM,cAAA,CACNA,WAAAA,CAAM,aACR,CAAC,CAAA,CAED,SAASC,EAAAA,CAAetC,CAAAA,CAA8B,CACpD,OAAOoC,EAAAA,CAAc,IAAIpC,CAAK,CAAA,CAAIuC,oBAAAA,CAAe,MAAA,CAASA,oBAAAA,CAAe,GAC3E,CAEA,IAAME,EAAAA,CAAkB,IAAA,CAClBD,EAAAA,CAAgB,GAAA,CAYf,SAASsJ,EAAAA,CACdhL,EAC6B,CAC7B,GAAM,CAAE,KAAA,CAAAd,CAAAA,CAAO,YAAA,CAAAsK,EAAc,eAAA,CAAAyB,CAAAA,CAAiB,WAAA,CAAAC,CAAY,CAAA,CAAIlL,CAAAA,CAExDqJ,EAAMD,EAAAA,EAAgB,CAEtBQ,CAAAA,CAAc/J,aAAAA,CAAQ,IAAMgK,oBAAAA,CAAe3K,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DiM,CAAAA,CAAetL,aAAAA,CAAQ,IAAMuL,qBAAAA,CAAgBlM,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAG5DkD,CAAAA,CAAUC,0BAAAA,EAAW,CACrBC,CAAAA,CAAKd,EAAAA,CAAetC,CAAK,CAAA,CACzBD,EAASY,aAAAA,CACb,IAAMuC,CAAAA,CAAQ,IAAA,CAAMiJ,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmB/I,CAAAA,EAAM+I,CAAAA,CAAE,WAAW,CAAA,CAClE,CAACjJ,CAAAA,CAASE,CAAE,CACd,CAAA,CACMC,CAAAA,CAAgBtD,CAAAA,EAAQ,OAAA,EAAW,EAAA,CAGnC6D,CAAAA,CAAiBjD,aAAAA,CAAQ,IAAM,CACnC,IAAMyL,CAAAA,CAAQ,CAAC9B,CAAY,CAAA,CAC3B,OAAII,CAAAA,EAAa0B,CAAAA,CAAM,IAAA,CAAK1B,CAAAA,CAAY,OAAO,CAAA,CAC3CuB,CAAAA,EAAcG,CAAAA,CAAM,IAAA,CAAKH,CAAAA,CAAa,OAAO,CAAA,CAC1CG,CAAAA,CAAM,MAAA,CAAO,OAAO,CAC7B,CAAA,CAAG,CAAC9B,CAAAA,CAAcI,CAAAA,CAAauB,CAAY,CAAC,CAAA,CAEtCpI,CAAAA,CAAcC,sBAAAA,CAClB,CAAE,KAAA,CAAA9D,CAAAA,CAAO,SAAA,CAAW4D,CAAe,CAAA,CACnC,CAAE,OAAA,CAASA,CAAAA,CAAe,MAAA,CAAS,CAAA,CAAG,eAAA,CAAiBpB,EAAc,CACvE,CAAA,CAEM6J,CAAAA,CAAY1L,aAAAA,CAChB,IAAMkD,CAAAA,CAAY,MAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYsG,CAAY,CAAA,EAAK,KACnE,CAACzG,CAAAA,CAAY,IAAA,CAAMyG,CAAY,CACjC,CAAA,CAGMpG,EAAgBC,wCAAAA,CACpB,CAAE,KAAA,CAAAnE,CAAAA,CAAO,OAAA,CAASqD,CAAAA,CAAe,cAAA,CAAAO,CAAe,CAAA,CAChD,CACE,OAAA,CAAS,CAAC,CAACP,CAAAA,EAAiBO,EAAe,MAAA,CAAS,CAAA,CACpD,eAAA,CAAiBnB,EACnB,CACF,CAAA,CAEM6J,CAAAA,CAAa5B,CAAAA,EAAa,OAAA,EAAWuB,CAAAA,EAAc,OAAA,EAAW,EAAA,CAC9DM,CAAAA,CAAgB5L,aAAAA,CACpB,IAAMuD,CAAAA,CAAc,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYiI,CAAU,CAAA,EAAK,IAAA,CACnE,CAACpI,CAAAA,CAAc,IAAA,CAAMoI,CAAU,CACjC,EACME,CAAAA,CAAe7L,aAAAA,CACnB,IAAMuD,CAAAA,CAAc,IAAA,EAAM,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYiG,CAAY,CAAA,EAAK,IAAA,CACrE,CAACpG,CAAAA,CAAc,KAAMoG,CAAY,CACnC,CAAA,CAGM,CAACmC,CAAAA,CAAcC,CAAe,CAAA,CAAIjN,cAAAA,CAAS,KAAK,CAAA,CAChDkN,CAAAA,CAAoBhN,YAAAA,CAAsB,IAAI,CAAA,CAE9CiN,EAAoB/M,iBAAAA,CAAa4J,CAAAA,EAAmB,CACxD,IAAMoD,CAAAA,CAAOF,CAAAA,CAAkB,OAAA,CAC/BA,CAAAA,CAAkB,OAAA,CAAUlD,CAAAA,CAC5BiD,CAAAA,CAAiB9K,CAAAA,EACfiL,CAAAA,GAAS,IAAA,EAAQA,IAASpD,CAAAA,CAAS,IAAA,CAAO,CAAC7H,CAC7C,EACF,CAAA,CAAG,EAAE,CAAA,CAGCkL,CAAAA,CAAiBnN,YAAAA,CAAOoM,CAAe,CAAA,CAC7Ce,CAAAA,CAAe,QAAUf,CAAAA,CACzB,IAAMgB,CAAAA,CAAapN,YAAAA,CAAOqM,CAAW,CAAA,CACrCe,EAAW,OAAA,CAAUf,CAAAA,CAErB,GAAM,CAAE,IAAA,CAAMxG,CAAAA,CAAS,WAAAjG,CAAW,CAAA,CAAIJ,EAAAA,CAAQ,CAC5C,WAAA,CAAcuB,CAAAA,EAAWoM,CAAAA,CAAe,OAAA,GAAUpM,CAAM,CAAA,CACxD,OAAA,CAAS,CAACL,CAAAA,CAAK2M,CAAAA,GAAUD,EAAW,OAAA,GAAU1M,CAAAA,CAAK2M,CAAK,CAC1D,CAAC,CAAA,CAEKpN,CAAAA,CAAOC,iBAAAA,CAAY,SAAY,CACnC,GAAI,CAACsK,CAAAA,CAAI,MAAA,EAAU,CAACpK,CAAAA,EAAU,CAACuK,CAAAA,CAAc,OAE7C,IAAM2C,CAAAA,CAAiBvC,CAAAA,EAAa,QAAA,EAAY,CAAA,CAC1CwC,CAAAA,CAAejB,CAAAA,EAAc,OAAA,EAAWvB,CAAAA,EAAa,OAAA,EAAW,GAEhEyC,CAAAA,CAAQhD,CAAAA,CAAI,SAAA,GAAc,KAAA,CAC1B9B,CAAAA,CAAO8E,CAAAA,CAAQD,CAAAA,CAAe5C,CAAAA,CAC9BhC,EAAAA,CAAK6E,CAAAA,CAAQ7C,CAAAA,CAAe4C,CAAAA,CAE5BtK,CAAAA,CAAWuK,CAAAA,CAAQF,EAAkBZ,CAAAA,EAAW,QAAA,EAAY,CAAA,CAC5D5H,CAAAA,CAAmB,IAAI2I,mBAAAA,CAAUjD,CAAAA,CAAI,MAAM,CAAA,CAC9C,SAAA,CAAUvH,CAAQ,CAAA,CAClB,aAAA,CAAc,CAAC,EACf,QAAA,EAAS,CAEN6G,CAAAA,CAASU,CAAAA,CAAI,mBAAA,CACbkD,EAAAA,CAAe9D,CAAAA,CAAyBvJ,CAAK,CAAA,CAC7CsN,CAAAA,CAAiB,IAAIF,mBAAAA,CACzB3D,CAAAA,CAAO,WAAA,EAAe4D,GAAa,WAAA,EAAe,CACpD,CAAA,CACG,SAAA,CAAUJ,CAAc,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAENM,CAAAA,CAAY,IAAIH,mBAAAA,CAAU3D,EAAO,MAAA,EAAU4D,EAAAA,CAAa,MAAA,EAAU,CAAC,CAAA,CACtE,SAAA,CAAUJ,CAAc,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAEZ,GAAI,CACF,MAAMzH,CAAAA,CAAQ,CACZ,KAAA,CAAAxF,CAAAA,CACA,MAAA,CAAAD,CAAAA,CACA,KAAA,CAAOsI,CAAAA,CACP,MAAA,CAAQC,EAAAA,CACR,MAAA,CAAQ7D,CAAAA,CACR,SAAUgF,CAAAA,CAAO,QAAA,EAAY4D,EAAAA,CAAa,QAAA,EAAY,CAAA,CACtD,WAAA,CAAaC,CAAAA,CACb,MAAA,CAAQC,CAAAA,CACR,SAAA,CAAW9D,CAAAA,CAAO,OAAA,GAAY,KAChC,CAAC,EACDU,CAAAA,CAAI,SAAA,CAAU,KAAA,CAAS,EACzB,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,CACDA,CAAAA,CACApK,CAAAA,CACAuK,CAAAA,CACAI,CAAAA,CACAuB,CAAAA,CACAI,EACArM,CAAAA,CACAwF,CACF,CAAC,CAAA,CAGKgI,CAAAA,CAAa7M,aAAAA,CAAQ,IAAM,CAC/B,IAAM8M,CAAAA,CAAMtD,CAAAA,CAAI,SAAA,GAAc,KAAA,CAAQ,KAAA,CAAQ,OAC9C,GAAI,CAACA,CAAAA,CAAI,MAAA,CAAQ,OAAOsD,CAAAA,CAExB,GAAItD,CAAAA,CAAI,SAAA,GAAc,KAAA,CAAO,CAC3B,IAAMpF,CAAAA,CAAMwH,CAAAA,EAAe,OAC3B,GAAIxH,CAAAA,EAAO,IAAIqI,mBAAAA,CAAUrI,CAAG,CAAA,CAAE,EAAA,CAAGoF,CAAAA,CAAI,MAAM,CAAA,CACzC,OAAO,CAAA,EAAGsD,CAAG,CAAA,uBAAA,CAAA,KAETC,CAAAA,CAAShD,CAAAA,EAAa,MAAA,EAAU,EAAA,CACxB2B,CAAAA,EAAW,UAAA,EAAY,UAAA,CACjC,MAAA,CAAOA,CAAAA,CAAU,UAAA,CAAW,UAAU,CAAA,CACtC,IAAA,KACEsB,EAAc9J,CAAAA,CAAY,IAAA,EAAM,IAAA,CACnCG,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYsI,CACvB,CAAA,EAAG,UAAA,EAAY,WACf,GAAIqB,CAAAA,CAAa,CACf,IAAMC,CAAAA,CAAMC,qBAAAA,CACV,IAAIT,mBAAAA,CAAUjD,CAAAA,CAAI,MAAM,CAAA,CAAE,KAAA,CAAM,MAAA,CAAOwD,CAAW,CAAC,CACrD,CAAA,CACA,OAAO,GAAGF,CAAG,CAAA,CAAA,EAAItD,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIuD,CAAM,CAAA,EAAA,EAAKE,CAAG,CAAA,CAAA,CAC/C,CACA,OAAO,CAAA,EAAGH,CAAG,CAAA,CAAA,EAAItD,EAAI,MAAM,CAAA,CAAA,EAAIuD,CAAM,CAAA,CACvC,CAGA,IAAM3I,CAAAA,CAAMyH,CAAAA,EAAc,MAAA,CAC1B,OAAIzH,CAAAA,EAAO,IAAIqI,mBAAAA,CAAUrI,CAAG,EAAE,EAAA,CAAGoF,CAAAA,CAAI,MAAM,CAAA,CAClC,CAAA,EAAGsD,CAAG,CAAA,uBAAA,CAAA,CACRA,CACT,CAAA,CAAG,CACDtD,CAAAA,CAAI,SAAA,CACJA,CAAAA,CAAI,MAAA,CACJoC,EACAC,CAAAA,CACA9B,CAAAA,CACA2B,CAAAA,CACAxI,CAAAA,CAAY,IAAA,CACZyI,CACF,CAAC,CAAA,CAEKwB,CAAAA,CAAa,CAAC3D,CAAAA,CAAI,MAAA,EAAU,CAACpK,CAAAA,EAAU,CAACuK,CAAAA,CACxC1E,CAAAA,CAAY/B,CAAAA,CAAY,SAAA,EAAaK,CAAAA,CAAc,SAAA,CAEzD,OAAOvD,aAAAA,CACL,KAAO,CACL,KAAA,CAAAX,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,YAAAI,CAAAA,CACA,SAAA,CAAA2B,CAAAA,CACA,aAAA,CAAAE,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,SAAA,CAAWrC,CAAAA,CAAI,SAAA,CACf,YAAA,CAAcA,CAAAA,CAAI,YAAA,CAClB,MAAA,CAAQA,EAAI,MAAA,CACZ,SAAA,CAAWA,CAAAA,CAAI,SAAA,CACf,SAAA,CAAWA,CAAAA,CAAI,UACf,YAAA,CAAcA,CAAAA,CAAI,YAAA,CAClB,UAAA,CAAYA,CAAAA,CAAI,UAAA,CAChB,cAAeA,CAAAA,CAAI,aAAA,CACnB,mBAAA,CAAqBA,CAAAA,CAAI,mBAAA,CACzB,QAAA,CAAUA,CAAAA,CAAI,QAAA,CACd,iBAAA,CAAmBA,CAAAA,CAAI,iBAAA,CACvB,kBAAA,CAAoBA,CAAAA,CAAI,kBAAA,CACxB,aAAAsC,CAAAA,CACA,iBAAA,CAAAG,CAAAA,CACA,IAAA,CAAAhN,CAAAA,CACA,UAAA,CAAAL,CAAAA,CACA,UAAA,CAAAiO,CAAAA,CACA,UAAA,CAAAM,CAAAA,CACA,SAAA,CAAAlI,CACF,CAAA,CAAA,CACA,CACE5F,CAAAA,CACAsK,CAAAA,CACAI,CAAAA,CACA2B,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACArC,CAAAA,CACAsC,CAAAA,CACAG,CAAAA,CACAhN,CAAAA,CACAL,CAAAA,CACAiO,CAAAA,CACAM,CAAAA,CACAlI,CACF,CACF,CACF,CCvPO,SAASmI,EAAAA,CAAa,CAC3B,MAAAlJ,CAAAA,CACA,QAAA,CAAAmJ,CAAAA,CACA,KAAA,CAAAhO,CAAAA,CACA,YAAA,CAAAqJ,CAAAA,CAAe,KAAA,CACf,cAAA,CAAA4D,CAAAA,CAAiB,CAAA,CACjB,SAAA,CAAAhF,CACF,CAAA,CAAsB,CACpB,IAAMgG,CAAAA,CAASpO,iBAAAA,CACZqO,CAAAA,EAAsCF,CAAAA,CAAS,CAAE,GAAGnJ,CAAAA,CAAO,GAAGqJ,CAAM,CAAC,CAAA,CACtE,CAACrJ,CAAAA,CAAOmJ,CAAQ,CAClB,CAAA,CAEMG,CAAAA,CAAWxN,aAAAA,CACf,IAAMyI,EAAAA,CAAuBpJ,CAAAA,CAAOqJ,CAAY,CAAA,CAChD,CAACrJ,CAAAA,CAAOqJ,CAAY,CACtB,CAAA,CAEA,OACE5C,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWyB,KAAAA,CAAG,aAAA,CAAeD,CAAS,CAAA,CACzC,QAAA,CAAA,CAAA1B,cAAAA,CAAC6H,EAAAA,CAAA,CACC,KAAA,CAAOvJ,CAAAA,CAAM,QAAA,CACb,SAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,QAAA,CAAUI,CAAE,CAAC,CAAA,CACzC,CAAA,CACA9H,cAAAA,CAAC+H,EAAAA,CAAA,CACC,KAAA,CAAOzJ,CAAAA,CAAM,WAAA,CACb,SAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,WAAA,CAAaI,CAAE,CAAC,CAAA,CAC1C,KAAA,CAAOF,CAAAA,CAAS,QAAA,CAChB,MAAA,CAAQA,CAAAA,CAAS,OAAA,CACjB,QAAA,CAAUA,EAAS,WAAA,CACrB,CAAA,CACCA,CAAAA,CAAS,UAAA,EACR5H,cAAAA,CAACgI,EAAAA,CAAA,CACC,KAAA,CAAO1J,CAAAA,CAAM,MAAA,CACb,QAAA,CAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,OAAQI,CAAE,CAAC,CAAA,CACrC,MAAA,CAAQF,CAAAA,CAAS,UAAA,CACjB,QAAA,CAAUA,CAAAA,CAAS,cAAA,CACrB,CAAA,CAEF5H,cAAAA,CAACiI,EAAAA,CAAA,CACC,KAAA,CAAO3J,EAAM,OAAA,CACb,QAAA,CAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,OAAA,CAASI,CAAE,CAAC,CAAA,CACxC,CAAA,CACCxJ,CAAAA,CAAM,OAAA,EACL0B,cAAAA,CAACkI,EAAAA,CAAA,CACC,KAAA,CAAO5J,CAAAA,CAAM,UAAA,CACb,QAAA,CAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,UAAA,CAAYI,CAAE,CAAC,CAAA,CACzC,MAAA,CAAQhF,CAAAA,CACV,CAAA,CAEF9C,eAACmI,EAAAA,CAAA,CACC,KAAA,CAAO7J,CAAAA,CAAM,OAAA,CACb,QAAA,CAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,OAAA,CAASI,CAAE,CAAC,CAAA,CACtC,OAAA,CAASF,EAAS,cAAA,CACpB,CAAA,CACA5H,cAAAA,CAACoI,EAAAA,CAAA,CACC,KAAA,CAAO9J,CAAAA,CAAM,SAAA,CACb,QAAA,CAAWwJ,CAAAA,EAAMJ,CAAAA,CAAO,CAAE,SAAA,CAAWI,CAAE,CAAC,CAAA,CAC1C,CAAA,CAAA,CACF,CAEJ,CAMA,IAAMO,EAAAA,CAAwB,CAC5B,YAAA,CACE,gGAAA,CACF,KAAA,CAAO,SACT,CAAA,CAEA,SAASC,EAAAA,CACPb,EACqD,CACrD,OAAOnO,iBAAAA,CACJwO,CAAAA,EAA8C,CACzC,OAAOA,CAAAA,EAAM,QAAA,EACfL,CAAAA,CAAS,KAAA,CAAMK,CAAC,CAAA,CAAI,IAAA,CAAOA,CAAC,EAEhC,CAAA,CACA,CAACL,CAAQ,CACX,CACF,CAIA,SAASI,EAAAA,CAAY,CACnB,KAAA,CAAAvJ,CAAAA,CACA,QAAA,CAAAmJ,CACF,EAGG,CACD,IAAMc,CAAAA,CAASD,EAAAA,CAAiBb,CAAQ,CAAA,CACxC,OACEvH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sBAAA,CAAuB,QAAA,CAAA,UAAA,CAAQ,CAAA,CAC9CA,cAAAA,CAACwI,cAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOlK,CAAAA,GAAU,IAAA,CAAO,MAAA,CAAYA,CAAAA,CACpC,QAAA,CAAUiK,EACV,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,QAAA,CAAU,GAAA,CACV,IAAA,CAAM,CAAA,CACN,UAAA,CAAYvI,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,GAAA,CAAC,EACpD,UAAA,CAAYqI,EAAAA,CACZ,YAAA,CAAW,UAAA,CACb,CAAA,CAAA,CACF,CAEJ,CAIA,SAASN,EAAAA,CAAe,CACtB,KAAA,CAAAzJ,CAAAA,CACA,QAAA,CAAAmJ,CAAAA,CACA,MAAAgB,CAAAA,CAAQ,cAAA,CACR,MAAA,CAAAtB,CAAAA,CACA,QAAA,CAAA9K,CACF,CAAA,CAMG,CACD,IAAMkM,CAAAA,CAASD,EAAAA,CAAiBb,CAAQ,CAAA,CACxC,OACEvH,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACZ,QAAA,CAAA,CAAAuI,CAAAA,CACDzI,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,+DACR,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,IAAA,CAAK,KACL,aAAA,CAAa,IAAA,CAEb,QAAA,CAAAb,cAAAA,CAAC2I,WAAAA,CAAA,CAAS,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,EACF,CAAA,CAAA,CACF,CAAA,CACA3I,cAAAA,CAACwI,cAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOlK,CAAAA,GAAU,IAAA,CAAO,MAAA,CAAYA,CAAAA,CACpC,QAAA,CAAUiK,CAAAA,CACV,YAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,aAAA,CAAe,CAAE,qBAAA,CAAuBlM,CAAS,CAAA,CACjD,UAAA,CAAY2D,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAmH,EAAO,CAAA,CAC3D,UAAA,CAAYkB,EAAAA,CACZ,YAAA,CAAW,cAAA,CACb,CAAA,CAAA,CACF,CAEJ,CAIA,SAASL,EAAAA,CAAU,CACjB,KAAA,CAAA1J,CAAAA,CACA,QAAA,CAAAmJ,EACA,MAAA,CAAAN,CAAAA,CACA,QAAA,CAAA9K,CACF,CAAA,CAKG,CACD,IAAMkM,CAAAA,CAASD,EAAAA,CAAiBb,CAAQ,CAAA,CACxC,OACEvH,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAA+C,QAAA,CAAA,CAAA,SAAA,CAE5DF,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,gEAAA,CACR,UAAA,CAAY,CAAE,QAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,IAAA,CAAK,IAAA,CACL,aAAA,CAAa,IAAA,CAEb,SAAAb,cAAAA,CAAC2I,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA3I,cAAAA,CAACwI,eAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOlK,CAAAA,GAAU,IAAA,CAAO,OAAYA,CAAAA,CACpC,QAAA,CAAUiK,CAAAA,CACV,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,EACV,aAAA,CAAe,CAAE,qBAAA,CAAuBlM,CAAS,CAAA,CACjD,UAAA,CAAY2D,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAmH,CAAAA,CAAO,CAAA,CAC3D,UAAA,CAAYkB,GACZ,YAAA,CAAW,SAAA,CACb,CAAA,CAAA,CACF,CAEJ,CAIA,SAASJ,EAAAA,CAAW,CAClB,KAAA,CAAA3J,CAAAA,CACA,QAAA,CAAAmJ,CACF,CAAA,CAGG,CACD,OACEvH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAA+C,QAAA,CAAA,CAAA,UAAA,CAE5DF,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,kEACR,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,IAAA,CAAK,KACL,aAAA,CAAa,IAAA,CAEb,QAAA,CAAAb,cAAAA,CAAC2I,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,CAAA,CACF,GACF,CAAA,CACA3I,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,cAAAA,CAAC4I,SAAAA,CAAA,CACC,UAAA,CAAYtK,CAAAA,CACZ,aAAA,CAAemJ,CAAAA,CACf,KAAA,CAAM,UACN,IAAA,CAAK,IAAA,CACL,YAAA,CAAW,UAAA,CACb,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAIA,SAASS,EAAAA,CAAc,CACrB,KAAA,CAAA5J,CAAAA,CACA,QAAA,CAAAmJ,EACA,MAAA,CAAAN,CACF,CAAA,CAIG,CACD,IAAMoB,CAAAA,CAASD,EAAAA,CAAiBb,CAAQ,CAAA,CACxC,OACEvH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,UAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,cAAA,CAAY,CAAA,CAClDA,cAAAA,CAACwI,cAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOlK,CAAAA,GAAU,IAAA,CAAO,OAAYA,CAAAA,CACpC,QAAA,CAAUiK,CAAAA,CACV,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,CAAA,CACV,UAAA,CAAYvI,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAAmH,CAAAA,CAAO,EAC3D,UAAA,CAAYkB,EAAAA,CACZ,YAAA,CAAW,cAAA,CACb,CAAA,CAAA,CACF,CAEJ,CAIA,IAAMQ,EAAAA,CAA0C,CAC9C,GAAA,CAAK,KAAA,CACL,OAAA,CAAS,SAAA,CACT,OAAQ,QACV,CAAA,CAEA,SAASV,EAAAA,CAAW,CAClB,KAAA,CAAA7J,CAAAA,CACA,QAAA,CAAAmJ,CAAAA,CACA,OAAA,CAAA5O,CACF,CAAA,CAIG,CACD,OACEqH,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAA+C,QAAA,CAAA,CAAA,UAAA,CAE5DF,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,gEAAA,CACR,WAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,4CAAA,CACV,IAAA,CAAK,IAAA,CACL,cAAa,IAAA,CAEb,QAAA,CAAAb,cAAAA,CAAC2I,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,cAAA,CAAe,CAAA,CAC5D,CAAA,CACF,CAAA,CAAA,CACF,EACA3I,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,cAAAA,CAAC8I,QAAA,CACC,OAAA,CAAQ,UAAA,CACR,KAAA,CAAM,SAAA,CACN,IAAA,CAAK,KACL,gBAAA,CAAgB,IAAA,CAChB,MAAA,CAAO,IAAA,CACP,UAAA,CAAY,CACV,OAAA,CAAS,8BAAA,CACT,GAAA,CAAK,kBACP,CAAA,CACA,WAAA,CAAaxK,CAAAA,CACb,iBAAA,CAAmBmJ,EACnB,YAAA,CAAW,UAAA,CAEV,QAAA,CAAA5O,CAAAA,CAAQ,GAAA,CAAKkQ,CAAAA,EACZ/I,cAAAA,CAACgJ,MAAAA,CAAA,CAAc,KAAA,CAAOH,EAAAA,CAAgBE,CAAG,CAAA,EAAKA,CAAAA,CAAAA,CAApCA,CAAyC,CACpD,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CAIA,SAASX,EAAAA,CAAa,CACpB,KAAA,CAAA9J,CAAAA,CACA,QAAA,CAAAmJ,CACF,CAAA,CAGG,CACD,OACEvH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CAAiC,QAAA,CAAA,YAAA,CAAU,CAAA,CAC1DA,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAAA,cAAAA,CAAC4B,QAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOtD,CAAAA,EAAS,EAAA,CAChB,aAAA,CAAgBwJ,CAAAA,EAAML,CAAAA,CAASK,CAAAA,EAAK,IAAI,CAAA,CACxC,UAAA,CAAYO,EAAAA,CACZ,WAAA,CAAY,aAAA,CACZ,YAAA,CAAW,YAAA,CACb,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCxWO,SAASY,EAAAA,CAAe,CAC7B,KAAA,CAAAxP,CAAAA,CACA,SAAA,CAAAqL,CAAAA,CACA,iBAAA,CAAAoE,CAAAA,CACA,MAAA,CAAAlL,EACA,cAAA,CAAAoD,CAAAA,CACA,aAAA,CAAA+H,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,mBAAAC,CAAAA,CACA,sBAAA,CAAAC,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CACA,uBAAA,CAAAC,EACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAA3G,CAAAA,CACA,cAAA,CAAA4D,CAAAA,CACA,aAAA,CAAAV,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAyD,CAAAA,CACA,MAAA,CAAAxG,CAAAA,CACA,eAAAyG,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,sBAAA,CAAAC,CAAAA,CACA,YAAA,CAAA3D,CAAAA,CACA,aAAA,CAAA4D,CAAAA,CACA,UAAA,CAAA7C,CAAAA,CACA,UAAA,CAAAM,CAAAA,CACA,SAAA,CAAAlI,EACA,QAAA,CAAA0K,CAAAA,CACA,SAAA,CAAArI,CAAAA,CACA,WAAA,CAAAsI,CACF,CAAA,CAAwB,CACtB,OACE9J,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWyB,KAAAA,CAAG,+CAAA,CAAiDD,CAAS,CAAA,CAGxE,QAAA,CAAA,CAAAxB,eAAAA,CAAC4I,OAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,IAAA,CAAK,IAAA,CACL,WAAA,CAAahE,CAAAA,CACb,iBAAA,CAAmBoE,CAAAA,CACnB,UAAA,CAAY,CACV,OAAA,CAAS,aAAA,CACT,GAAA,CAAK,sCACP,CAAA,CACA,gBAAA,CAAgB,IAAA,CAEhB,QAAA,CAAA,CAAAlJ,cAAAA,CAACgJ,MAAAA,CAAA,CAAc,KAAA,CAAM,KAAA,CAAA,CAAZ,KAAkB,EAC3BhJ,cAAAA,CAACgJ,MAAAA,CAAA,CAAe,KAAA,CAAM,MAAA,CAAA,CAAb,MAAoB,CAAA,CAAA,CAC/B,CAAA,CAGA9I,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC8I,QAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,YAAA,CACR,UAAA,CAAY,CAAE,OAAA,CAAS,OAAA,CAAS,GAAA,CAAK,QAAS,CAAA,CAC9C,WAAA,CAAY,QAAA,CACZ,iBAAgB,IAAA,CAEhB,QAAA,CAAA9I,cAAAA,CAACgJ,MAAAA,CAAA,CAAiB,KAAA,CAAM,UAAf,QAAwB,CAAA,CACnC,CAAA,CACCgB,CAAAA,CAAAA,CACH,CAAA,CAGAhK,cAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CACZ,QAAA,CAAA8E,CAAAA,GAAc,KAAA,CACb9E,cAAAA,CAACiK,EAAAA,CAAA,CACC,MAAA,CAAQjM,CAAAA,CACR,cAAA,CAAgBoD,CAAAA,CAChB,aAAA,CAAe+H,CAAAA,CACf,mBAAoBE,CAAAA,CACpB,mBAAA,CAAqBE,CAAAA,CACrB,YAAA,CAAczG,CAAAA,CACd,cAAA,CAAgB4D,CAAAA,CAClB,CAAA,CAEA1G,cAAAA,CAACkK,EAAAA,CAAA,CACC,MAAA,CAAQlM,CAAAA,CACR,cAAA,CAAgBoD,EAChB,iBAAA,CAAmBgI,CAAAA,CACnB,sBAAA,CAAwBE,CAAAA,CACxB,uBAAA,CAAyBE,CAAAA,CACzB,WAAA,CAAaC,CAAAA,CACf,CAAA,CAEJ,CAAA,CAGAvJ,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,UAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,UAAA,CAAQ,CAAA,CACdA,cAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA8E,CAAAA,GAAc,KAAA,CACXkB,EACE,CAAA,EAAGA,CAAa,CAAA,CAAA,EAAIlD,CAAAA,EAAgB,EAAE,CAAA,CAAA,CACtC,IAAA,CACFmD,CAAAA,CACE,CAAA,EAAGA,CAAY,CAAA,CAAA,EAAIwD,CAAAA,EAAe,EAAE,CAAA,CAAA,CACpC,KACR,CAAA,CAAA,CACF,CAAA,CACCC,CAAAA,EACC1J,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAA0J,CAAAA,CAAiB,CAAA,CAAA,CAE5D,CAAA,CAGA1J,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OACb,QAAA,CAAAA,cAAAA,CAACmK,EAAAA,CAAA,CAAe,MAAA,CAAQP,CAAAA,CAAc,KAAA,CAAOnQ,CAAAA,CAAO,CAAA,CACtD,CAAA,CAGAuG,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CACb,SAAAE,eAAAA,CAAC4I,OAAAA,CAAA,CACC,OAAA,CAAQ,UAAA,CACR,IAAA,CAAK,IAAA,CACL,SAAA,CAAS,IAAA,CACT,UAAA,CAAY,CACV,OAAA,CAAS,sCAAA,CACT,GAAA,CAAK,iEACL,UAAA,CAAY,cACd,CAAA,CACA,WAAA,CAAa,CAAA,EAAG5F,CAAM,CAAA,CAAA,CACtB,iBAAA,CAAoBkH,CAAAA,EAAaT,CAAAA,CAAe,MAAA,CAAOS,CAAG,CAAC,CAAA,CAC3D,iBAAgB,IAAA,CAChB,YAAA,CAAW,SAAA,CAEX,QAAA,CAAA,CAAApK,cAAAA,CAACgJ,MAAAA,CAAA,CAAY,KAAA,CAAM,UAAA,CAAW,OAAA,CAAS,IAAMc,CAAAA,CAAc,CAAC,CAAA,CAAA,CAAlD,CAAqD,CAAA,CAC/D9J,cAAAA,CAACgJ,MAAAA,CAAA,CAAY,KAAA,CAAM,UAAA,CAAW,OAAA,CAAS,IAAMc,CAAAA,CAAc,CAAC,CAAA,CAAA,CAAlD,CAAqD,CAAA,CAC/D9J,cAAAA,CAACgJ,OAAA,CAAY,KAAA,CAAM,UAAA,CAAW,OAAA,CAAS,IAAMc,CAAAA,CAAc,CAAC,CAAA,CAAA,CAAlD,CAAqD,CAAA,CAAA,CACjE,CAAA,CACF,CAAA,CAGC5D,CAAAA,EACClG,cAAAA,CAAC,OAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAAA,cAAAA,CAACwH,EAAAA,CAAA,CACC,KAAA,CAAOoC,CAAAA,CACP,QAAA,CAAUC,CAAAA,CACV,KAAA,CAAOpQ,CAAAA,CACP,YAAA,CAAcqJ,CAAAA,CACd,eAAgB4D,CAAAA,CAClB,CAAA,CACF,CAAA,CAIF1G,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,IAAA,CAAK,IAAA,CACL,KAAA,CAAOiE,CAAAA,GAAc,KAAA,CAAQ,SAAA,CAAY,YACzC,SAAA,CAAU,iBAAA,CACV,aAAA,CAAa,IAAA,CACb,UAAA,CAAYyC,CAAAA,CACZ,SAAA,CAAWlI,CAAAA,CACX,OAAA,CAAS0K,CAAAA,CAER,QAAA,CAAA9C,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASgD,EAAAA,CAAiB,CACxB,MAAA,CAAAjM,CAAAA,CACA,cAAA,CAAAoD,EACA,aAAA,CAAA+H,CAAAA,CACA,kBAAA,CAAAE,CAAAA,CACA,mBAAA,CAAAE,CAAAA,CACA,aAAAzG,CAAAA,CACA,cAAA,CAAA4D,CACF,CAAA,CAQG,CACD,IAAM2D,CAAAA,CAAe/Q,iBAAAA,CAClBwO,CAAAA,EAA8C,CACzC,OAAOA,CAAAA,EAAM,QAAA,EACf1G,CAAAA,CAAe,MAAM0G,CAAC,CAAA,CAAI,MAAA,CAAYA,CAAC,EAE3C,CAAA,CACA,CAAC1G,CAAc,CACjB,CAAA,CAEA,OACElB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cACb,QAAA,CAAA,CAAAF,cAAAA,CAACwI,cAAAA,CAAA,CACC,GAAA,CAAK,CAAA,CACL,KAAA,CAAOxK,CAAAA,CACP,QAAA,CAAUqM,CAAAA,CACV,SAAA,CAAS,IAAA,CACT,WAAA,CAAW,IAAA,CACX,aACErK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CAAiC,QAAA,CAAA,QAAA,CAAM,CAAA,CAEzD,UAAA,CACEA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA8C,CAAAA,EAAgB,EAAA,CACnB,EAEF,aAAA,CAAe,CACb,qBAAA,CAAuB4D,CAAAA,EAAkB,CAC3C,CAAA,CACA,UAAA,CAAY,CACV,YAAA,CAAc/E,KAAAA,CACZ,wDAAA,CACA,+EACF,CAAA,CACA,KAAA,CAAO,SACT,CAAA,CACF,CAAA,CACA3B,cAAAA,CAACsK,EAAAA,CAAA,CACC,MAAA,CAAQnB,CAAAA,CACR,QAAA,CAAUE,CAAAA,CACV,MAAA,CAAQE,CAAAA,CACV,CAAA,CAAA,CACF,CAEJ,CAMA,SAASW,EAAAA,CAAkB,CACzB,MAAA,CAAAlM,CAAAA,CACA,cAAA,CAAAoD,CAAAA,CACA,iBAAA,CAAAgI,CAAAA,CACA,sBAAA,CAAAE,CAAAA,CACA,uBAAA,CAAAE,CAAAA,CACA,WAAA,CAAAC,CACF,EAOG,CACD,IAAMY,CAAAA,CAAe/Q,iBAAAA,CAClBwO,CAAAA,EAA8C,CACzC,OAAOA,CAAAA,EAAM,QAAA,EACf1G,CAAAA,CAAe,KAAA,CAAM0G,CAAC,CAAA,CAAI,OAAYA,CAAC,EAE3C,CAAA,CACA,CAAC1G,CAAc,CACjB,CAAA,CAEA,OACElB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACwI,eAAA,CACC,GAAA,CAAK,CAAA,CACL,KAAA,CAAOxK,CAAAA,CACP,QAAA,CAAUqM,CAAAA,CACV,SAAA,CAAS,IAAA,CACT,WAAA,CAAW,IAAA,CACX,YAAA,CACErK,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,gCAAA,CAAiC,QAAA,CAAA,QAAA,CAAM,CAAA,CAEzD,UAAA,CACEA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CACb,QAAA,CAAAyJ,CAAAA,EAAe,EAAA,CAClB,CAAA,CAEF,UAAA,CAAY,CACV,aAAc9H,KAAAA,CACZ,wDAAA,CACA,+EACF,CAAA,CACA,KAAA,CAAO,SACT,CAAA,CACF,CAAA,CACA3B,cAAAA,CAACsK,EAAAA,CAAA,CACC,MAAA,CAAQlB,CAAAA,CACR,QAAA,CAAUE,EACV,MAAA,CAAQE,CAAAA,CACR,MAAA,CAAO,GAAA,CACT,CAAA,CAAA,CACF,CAEJ,CAMA,SAASc,EAAAA,CAAa,CACpB,MAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,OAAAC,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAKG,CACD,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAI1R,cAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC2R,EAAYC,CAAa,CAAA,CAAI5R,cAAAA,CAA4B,EAAE,CAAA,CAE5D6R,CAAAA,CAAkBzR,iBAAAA,CAAY,IAAM,CACxCwR,CAAAA,CAAc,CAAC,GAAGP,CAAM,CAAC,CAAA,CACzBK,CAAAA,CAAa,IAAI,EACnB,CAAA,CAAG,CAACL,CAAM,CAAC,CAAA,CAELS,CAAAA,CAAa1R,iBAAAA,CAAY,IAAM,CACnCsR,EAAa,KAAK,CAAA,CAClBH,CAAAA,CAAOI,CAAU,EACnB,CAAA,CAAG,CAACJ,CAAAA,CAAQI,CAAU,CAAC,CAAA,CAEvB,OACE3K,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,cAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACiL,CAAAA,CAAGvS,CAAAA,GACjCsH,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW2B,KAAAA,CACT,kDAAA,CACAjJ,CAAAA,GAAM,CAAA,EAAK,eACb,CAAA,CAEC,QAAA,CAAAiS,CAAAA,CACC3K,cAAAA,CAACwI,eAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CACEqC,CAAAA,CAAWnS,CAAC,CAAA,GAAM,IAAA,EAAQmS,CAAAA,CAAWnS,CAAC,CAAA,GAAM,MAAA,CACxC,MAAA,CACAmS,CAAAA,CAAWnS,CAAC,CAAA,CAElB,QAAA,CAAWoP,CAAAA,EAA8C,CACvD,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CACzB,IAAMoD,CAAAA,CAAM,KAAA,CAAMpD,CAAC,CAAA,CAAI,KAAOA,CAAAA,CAC9BgD,CAAAA,CAAezP,CAAAA,EAAS,CACtB,IAAME,CAAAA,CAAO,CAAC,GAAGF,CAAI,CAAA,CACrB,OAAAE,CAAAA,CAAK7C,CAAC,CAAA,CAAIwS,EACH3P,CACT,CAAC,EACH,CACF,CAAA,CACA,GAAA,CAAK,CAAA,CACL,WAAA,CAAW,IAAA,CACX,UAAA,CAAY,CACV,YAAA,CAAcoG,KAAAA,CACZ,+CAAA,CACA,gFACAjJ,CAAAA,GAAM,CAAA,EAAK,eACb,CAAA,CACA,YAAA,CAAc,MAAA,CACd,MAAO,qBACT,CAAA,CACF,CAAA,CAEAsH,cAAAA,CAACa,SAAAA,CAAA,CACC,UAAU,0DAAA,CACV,IAAA,CAAK,IAAA,CACL,aAAA,CAAa,IAAA,CACb,OAAA,CAAS,IAAM0J,CAAAA,CAAO7R,CAAC,CAAA,EAAK,IAAA,EAAQ8R,CAAAA,CAASD,CAAAA,CAAO7R,CAAC,CAAE,CAAA,CACvD,UAAA,CACEgS,CAAAA,CACE1K,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAwB,QAAA,CAAA0K,CAAAA,CAAO,CAAA,CAC7C,IAAA,CAGL,QAAA,CAAAH,CAAAA,CAAO7R,CAAC,GAAK,EAAA,CAChB,CAAA,CAAA,CAjDGA,CAmDP,CACD,CAAA,CACH,CAAA,CACAsH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CACZ,QAAA,CAAA2K,CAAAA,CACC3K,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,gCAAA,CACV,aAAA,CAAa,IAAA,CACb,OAAA,CAASmK,CAAAA,CAET,QAAA,CAAAhL,cAAAA,CAACmL,YAAAA,CAAA,CAAU,MAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACpC,CAAA,CAEAnL,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,UAAA,CAAU,IAAA,CACV,SAAA,CAAU,gCAAA,CACV,cAAa,IAAA,CACb,OAAA,CAASkK,CAAAA,CAET,QAAA,CAAA/K,cAAAA,CAACoL,WAAAA,CAAA,CAAS,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACnC,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CAMA,SAASjB,EAAAA,CAAe,CACtB,MAAA,CAAAI,CAAAA,CACA,KAAA,CAAA9Q,CACF,CAAA,CAGG,CACD,IAAMmO,CAAAA,CAAWxN,aAAAA,CAAQ,IAAMyI,GAAuBpJ,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAErE,OACEyG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAAC0I,WAAA,CACC,OAAA,CAAQ,UAAA,CACR,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,UAAU,4EAAA,CACV,aAAA,CAAa,IAAA,CACb,YAAA,CAAcb,cAAAA,CAACqL,eAAAA,CAAA,CAAa,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAElD,QAAA,CAAAC,mBAAAA,CAAAA,CAAef,EAAO,QAAA,EAAY,CAAA,EAAK,GAAG,CAAA,CAC7C,CAAA,CACF,CAAA,CAEAvK,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAASd,CAAAA,CAAS,QAAA,CAClB,UAAA,CAAY,CAAE,QAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA5H,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,IAAA,CACb,YAAA,CAAcb,cAAAA,CAACuL,eAAA,CAAY,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAEjD,QAAA,CAAAC,iBAAAA,CAAYjB,CAAAA,CAAO,WAAA,EAAe,CAAC,CAAA,CACtC,CAAA,CACF,CAAA,CAEC3C,EAAS,UAAA,EACR5H,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,SAAA,CACR,UAAA,CAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAA1I,cAAAA,CAACa,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,IAAA,CACb,YAAA,CAAcb,cAAAA,CAACyL,YAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EAE/C,QAAA,CAAAD,iBAAAA,CAAYjB,CAAAA,CAAO,MAAA,EAAU,CAAC,CAAA,CACjC,EACF,CAAA,CAGFvK,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CAAQ,UAAA,CACR,WAAY,CAAE,OAAA,CAAS,yCAA0C,CAAA,CAEjE,QAAA,CAAAxI,eAAAA,CAACW,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,4EAAA,CACV,aAAA,CAAa,IAAA,CACb,aACEX,eAAAA,CAAAoC,mBAAAA,CAAA,CACI,QAAA,CAAA,CAAA,CAAA,CAACiI,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,GAAY,KAAA,GACtCvK,cAAAA,CAAC0L,gBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,OAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,CAAA,CAEDnB,CAAAA,CAAO,OAAA,GAAY,SAAA,EAClBvK,cAAAA,CAAC2L,aAAAA,CAAA,CAAW,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,UAAU,cAAA,CAAe,CAAA,CAE7DpB,CAAAA,CAAO,OAAA,GAAY,QAAA,EAClBvK,cAAAA,CAAC4L,iBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,EAAA,CACR,SAAA,CAAU,cAAA,CACZ,GAEJ,CAAA,CAGA,QAAA,CAAA,CAAA,CAAA,CAACrB,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,GAAY,KAAA,GAAU,KAAA,CACjDA,CAAAA,CAAO,OAAA,GAAY,SAAA,EAAa,SAAA,CAChCA,CAAAA,CAAO,OAAA,GAAY,UAAY,QAAA,CAAA,CAClC,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCjgBO,SAASsB,EAAAA,CAAmB,CACjC,KAAA,CAAApS,CAAAA,CACA,YAAA,CAAAsK,EACA,eAAA,CAAAyB,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,QAAA,CAAAjC,CAAAA,CACA,gBAAA,CAAAS,CAAAA,CACA,WAAA,CAAA+F,CAAAA,CACA,SAAA,CAAAtI,CACF,CAAA,CAA4B,CAC1B,OACE1B,cAAAA,CAAC8D,EAAAA,CAAA,CACC,KAAA,CAAOrK,CAAAA,CACP,YAAA,CAAcsK,EACd,QAAA,CAAUP,CAAAA,CACV,gBAAA,CAAkBS,CAAAA,CAElB,QAAA,CAAAjE,cAAAA,CAAC8L,GAAA,CACC,KAAA,CAAOrS,CAAAA,CACP,YAAA,CAAcsK,CAAAA,CACd,eAAA,CAAiByB,CAAAA,CACjB,WAAA,CAAaC,CAAAA,CACb,WAAA,CAAauE,CAAAA,CACb,SAAA,CAAWtI,CAAAA,CACb,CAAA,CACF,CAEJ,CAEA,SAASoK,EAAAA,CAAwB,CAC/B,KAAA,CAAArS,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,eAAA,CAAAyB,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,WAAA,CAAAuE,CAAAA,CACA,UAAAtI,CACF,CAAA,CAAmE,CACjE,IAAMO,CAAAA,CAASsD,EAAAA,CAAsB,CACnC,KAAA,CAAA9L,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,eAAA,CAAAyB,CAAAA,CACA,WAAA,CAAAC,CACF,CAAC,CAAA,CAGKsG,CAAAA,CAAyBzS,iBAAAA,CAC5BwO,CAAAA,EAAc7F,CAAAA,CAAO,SAAA,CAAU6F,CAAC,CAAA,CACjC,CAAC7F,CAAM,CACT,CAAA,CAEM+J,CAAAA,CAA6B1S,kBAChC2S,CAAAA,EAAgB,CACf,IAAMzN,CAAAA,CAAMyD,CAAAA,CAAO,YAAA,EAAc,MAAA,CACjC,GAAI,CAACzD,CAAAA,CAAK,OACV,IAAMR,CAAAA,CAAS,IAAI6I,oBAAUrI,CAAG,CAAA,CAAE,KAAA,CAAMyN,CAAG,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS,CAC/DhK,CAAAA,CAAO,SAAA,CAAUjE,CAAM,EACzB,EACA,CAACiE,CAAM,CACT,CAAA,CAGMiK,CAAAA,CAA0B5S,iBAAAA,CAC7B6S,CAAAA,EAA+B,CAC9BlK,CAAAA,CAAO,iBAAA,CAAkB,CACvB,GAAGA,CAAAA,CAAO,QAAA,CAAS,IACnB,aAAA,CAAekK,CACjB,CAAC,EACH,CAAA,CACA,CAAClK,CAAM,CACT,CAAA,CAEMmK,CAAAA,CAA8B9S,iBAAAA,CACjC+S,CAAAA,EAA4B,CAC3BpK,CAAAA,CAAO,mBAAmB,CACxB,GAAGA,CAAAA,CAAO,QAAA,CAAS,IAAA,CACnB,iBAAA,CAAmBoK,CACrB,CAAC,EACH,CAAA,CACA,CAACpK,CAAM,CACT,CAAA,CAGMqK,EAA6BhT,iBAAAA,CAChCiR,CAAAA,EAAoD,CACnD,IAAM3D,CAAAA,CAAQ3E,CAAAA,CAAO,SAAA,GAAc,KAAA,CAC7BqD,CAAAA,CAAMsB,CAAAA,CAAQ3E,CAAAA,CAAO,SAAA,CAAYA,CAAAA,CAAO,UAAA,CAE9C,GAAI2E,CAAAA,CAAO,CACT,IAAMvL,CAAAA,CAAO4G,CAAAA,CAAO,QAAA,CAAS,GAAA,CACvBsK,CAAAA,CAAU,CAAC,GAAGlR,CAAAA,CAAK,OAAO,CAAA,CAChCkR,CAAAA,CAAQjH,CAAG,CAAA,CAAIiF,CAAAA,CACftI,CAAAA,CAAO,iBAAA,CAAkB,CAAE,GAAG5G,CAAAA,CAAM,OAAA,CAAAkR,CAAQ,CAAC,EAC/C,CAAA,KAAO,CACL,IAAMlR,EAAO4G,CAAAA,CAAO,QAAA,CAAS,IAAA,CACvBsK,CAAAA,CAAU,CAAC,GAAGlR,CAAAA,CAAK,OAAO,CAAA,CAChCkR,CAAAA,CAAQjH,CAAG,CAAA,CAAIiF,CAAAA,CACftI,CAAAA,CAAO,mBAAmB,CAAE,GAAG5G,CAAAA,CAAM,OAAA,CAAAkR,CAAQ,CAAC,EAChD,CACF,CAAA,CACA,CAACtK,CAAM,CACT,CAAA,CAGMuK,CAAAA,CAAqBlT,kBACxBwE,CAAAA,EAAc,CACTmE,CAAAA,CAAO,SAAA,GAAc,KAAA,CACvBA,CAAAA,CAAO,YAAA,CAAanE,CAAC,CAAA,CAErBmE,CAAAA,CAAO,aAAA,CAAcnE,CAAC,EAE1B,CAAA,CACA,CAACmE,CAAM,CACT,CAAA,CAEMwK,CAAAA,CACJxK,CAAAA,CAAO,SAAA,GAAc,MAAQA,CAAAA,CAAO,SAAA,CAAYA,CAAAA,CAAO,UAAA,CAEzD,OACEjC,cAAAA,CAACiJ,GAAA,CACC,KAAA,CAAOxP,CAAAA,CACP,SAAA,CAAWwI,CAAAA,CAAO,SAAA,CAClB,iBAAA,CAAmBA,CAAAA,CAAO,YAAA,CAC1B,MAAA,CAAQA,CAAAA,CAAO,MAAA,CACf,cAAA,CAAgBA,CAAAA,CAAO,UACvB,aAAA,CAAeA,CAAAA,CAAO,QAAA,CAAS,GAAA,CAAI,aAAA,CACnC,iBAAA,CAAmBA,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAK,iBAAA,CACxC,kBAAA,CAAoB8J,CAAAA,CACpB,sBAAA,CAAwBC,CAAAA,CACxB,oBAAqBE,CAAAA,CACrB,uBAAA,CAAyBE,CAAAA,CACzB,WAAA,CAAanK,CAAAA,CAAO,SAAA,EAAW,MAAA,CAC/B,YAAA,CAAcA,CAAAA,CAAO,WAAA,EAAa,MAAA,CAClC,cAAA,CAAgBA,CAAAA,CAAO,WAAA,EAAa,SACpC,aAAA,CAAeA,CAAAA,CAAO,aAAA,EAAe,MAAA,CACrC,YAAA,CAAcA,CAAAA,CAAO,YAAA,EAAc,MAAA,CACnC,gBAAA,CAAkB,MAAA,CAClB,MAAA,CAAQwK,CAAAA,CACR,cAAA,CAAgBD,CAAAA,CAChB,aAAcvK,CAAAA,CAAO,mBAAA,CACrB,sBAAA,CAAwBqK,CAAAA,CACxB,YAAA,CAAcrK,CAAAA,CAAO,YAAA,CACrB,aAAA,CAAeA,CAAAA,CAAO,iBAAA,CACtB,UAAA,CAAYA,CAAAA,CAAO,UAAA,CACnB,UAAA,CAAYA,EAAO,UAAA,CACnB,SAAA,CAAWA,CAAAA,CAAO,UAAA,CAClB,QAAA,CAAUA,CAAAA,CAAO,IAAA,CACjB,SAAA,CAAWP,CAAAA,CACX,WAAA,CAAasI,CAAAA,CACf,CAEJ,CC7JO,SAAS0C,EAAAA,CAAiB,CAC/B,KAAA,CAAApO,CAAAA,CACA,QAAA,CAAAmJ,CAAAA,CACA,KAAA,CAAAhO,CAAAA,CACA,UAAAiI,CACF,CAAA,CAA0B,CACxB,IAAMyC,CAAAA,CAAc/J,aAAAA,CAAQ,IAAMgK,oBAAAA,CAAe3K,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAC1DkT,EAAiBC,oBAAAA,CAAenF,CAAQ,CAAA,CAExC,CAACoF,CAAAA,CAAOC,CAAQ,CAAA,CAAI5T,cAAAA,CAA4BoF,CAAK,CAAA,CAE3DzD,eAAAA,CAAU,IAAM,CACdiS,CAAAA,CAASxO,CAAK,EAChB,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEV,IAAM+L,CAAAA,CAAe/Q,iBAAAA,CAClBiC,CAAAA,EAA4B,CAC3BuR,CAAAA,CAASvR,CAAI,CAAA,CACboR,EAAepR,CAAI,EACrB,CAAA,CACA,CAACoR,CAAc,CACjB,CAAA,CAEA,OACE3M,cAAAA,CAACwH,EAAAA,CAAA,CACC,KAAA,CAAOqF,CAAAA,CACP,QAAA,CAAUxC,EACV,KAAA,CAAO5Q,CAAAA,CACP,YAAA,CAAc0K,CAAAA,EAAa,MAAA,CAC3B,cAAA,CAAgBA,CAAAA,EAAa,QAAA,CAC7B,SAAA,CAAWzC,CAAAA,CACb,CAEJ,CChBO,SAASqL,EAAAA,CAAwB,CACtC,MAAA,CAAA/O,CAAAA,CACA,cAAA,CAAAoD,CAAAA,CACA,MAAA,CAAA8B,CAAAA,CAAS,CAAA,CACT,cAAA,CAAAyG,CAAAA,CACA,aAAA,CAAAG,CAAAA,CACA,OAAA,CAAAkD,CAAAA,CAAU,SAAA,CACV,OAAAC,CAAAA,CAAS,MAAA,CACT,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,SAAA,CAAAC,CAAAA,CAAY,KAAA,CACZ,SAAA,CAAAzL,CACF,CAAA,CAAiC,CAC/B,GAAM,CAAE,MAAAjI,CAAAA,CAAO,WAAA,CAAA0K,CAAAA,CAAa,QAAA,CAAAX,CAAS,CAAA,CAAIG,EAAAA,EAAgB,CACnDyB,CAAAA,CAAgBhL,aAAAA,CAAQ,IAAM4I,CAAAA,CAAyBvJ,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEtE2T,CAAAA,CAAqB9T,iBAAAA,CACxBgF,CAAAA,EAAkD,CAC7C,OAAOA,CAAAA,EAAU,QAAA,EACnB8C,CAAAA,CAAe,KAAA,CAAM9C,CAAK,CAAA,CAAI,OAAYA,CAAK,EAEnD,CAAA,CACA,CAAC8C,CAAc,CACjB,CAAA,CAEMiM,CAAAA,CAAoB/T,iBAAAA,CACvBgM,CAAAA,EAAgB,CACXpC,CAAAA,GAAWoC,CAAAA,CACbwE,CAAAA,GAAgBxE,CAAG,CAAA,CAEnBqE,CAAAA,GAAiBrE,CAAG,EAExB,CAAA,CACA,CAACpC,CAAAA,CAAQyG,CAAAA,CAAgBG,CAAa,CACxC,CAAA,CAEA,OACE5J,eAAAA,CAAC,KAAA,CAAA,CACC,UAAWyB,KAAAA,CACT,gDAAA,CACAsL,CAAAA,GAAW,MAAA,EAAU,cAAA,CACrBA,CAAAA,GAAW,IAAA,EAAQ,YAAA,CACnBA,CAAAA,GAAW,IAAA,EAAQ,YAAA,CACnBA,CAAAA,GAAW,IAAA,EAAQ,YAAA,CACnBD,IAAY,UAAA,EAAc,wBAAA,CAC1BA,CAAAA,GAAY,SAAA,EAAa,aAAA,CACzBtL,CACF,CAAA,CAEA,QAAA,CAAA,CAAA1B,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW2B,KAAAA,CAAGwL,CAAAA,CAAY,QAAA,CAAW,MAAM,CAAA,CAC9C,QAAA,CAAAnN,cAAAA,CAACwI,cAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,KAAA,CAAOxK,CAAAA,CACP,QAAA,CAAUoP,CAAAA,CACV,WAAA,CAAW,IAAA,CACX,QAAA,CAAU,EACV,aAAA,CAAe,CACb,qBAAA,CAAuBjJ,CAAAA,EAAa,QAAA,EAAY,CAClD,CAAA,CACA,YAAA,CACEnE,cAAAA,CAACsN,gBAAAA,CAAA,CACC,KAAA,CAAO,EAAA,CACP,MAAA,CAAQ,GACR,SAAA,CAAU,wBAAA,CACZ,CAAA,CAEF,UAAA,CACEnJ,CAAAA,CACEnE,cAAAA,CAACM,SAAAA,CAAA,CACC,SAAA,CAAU,kCAAA,CACV,IAAA,CAAM6D,CAAAA,CAAY,MAAA,CACpB,CAAA,CACE,KAEN,UAAA,CAAY,CACV,YAAA,CAAcxC,KAAAA,CACZ,wFAAA,CACA,yCAAA,CACAuL,CAAAA,GAAS,IAAA,EAAQ,KAAA,CACjBA,CAAAA,GAAS,IAAA,EAAQ,KACnB,CAAA,CACA,KAAA,CAAO,SACT,CAAA,CACA,WAAA,CAAY,KAAA,CACZ,YAAA,CAAW,sBAAA,CACb,CAAA,CACF,CAAA,CAEAlN,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CAAqB,CAAA,CAEpCA,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,yBAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACiL,CAAAA,CAAGsC,CAAAA,GACjCvN,cAAAA,CAAC0I,UAAAA,CAAA,CACC,OAAA,CACE1I,cAAAA,CAACwN,EAAAA,CAAA,CACC,MAAA,CAAQhK,CAAAA,CAAS,GAAA,CAAI,OAAA,CAAQ+J,CAAK,CAAA,EAAKnI,CAAAA,CACvC,KAAA,CAAO3L,CAAAA,CACT,CAAA,CAGF,UAAU,QAAA,CAEV,QAAA,CAAAuG,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAWc,MACT,0EAAA,CACA,CACE,kCAAA,CAAoC4L,CAAAA,GAAUrK,CAAAA,CAC9C,gCAAA,CAAkCqK,IAAUrK,CAC9C,CACF,CAAA,CACA,aAAA,CAAa,IAAA,CACb,OAAA,CAAS,IAAMmK,CAAAA,CAAkBE,CAAK,CAAA,CAErC,QAAA,CAAA,CAAA,CAAA,EAAIA,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAChB,GAfKA,CAgBP,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAMA,SAASC,EAAAA,CAAc,CACrB,MAAA,CAAAjD,CAAAA,CACA,KAAA,CAAA9Q,CACF,CAAA,CAGG,CACD,IAAMmO,CAAAA,CAAWxN,aAAAA,CAAQ,IAAMyI,EAAAA,CAAuBpJ,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAErE,OACEyG,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wDAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAF,cAAAA,CAACqL,eAAAA,CAAA,CAAa,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EACrCrL,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAsL,mBAAAA,CAAAA,CAAef,CAAAA,CAAO,QAAA,EAAY,CAAA,EAAK,GAAG,CAAA,CAAE,CAAA,CAAA,CACrD,CAAA,CACArK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iDACb,QAAA,CAAA,CAAAF,cAAAA,CAACuL,cAAAA,CAAA,CAAY,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACpCrL,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAsL,iBAAAA,CAAYjB,CAAAA,CAAO,aAAe,CAAC,CAAA,CAAE,GAAA,CAAE3C,CAAAA,CAAS,OAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CACCA,CAAAA,CAAS,UAAA,EACR1H,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAF,eAACyL,YAAAA,CAAA,CAAU,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,EAClCvL,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAsL,iBAAAA,CAAYjB,CAAAA,CAAO,MAAA,EAAU,CAAC,CAAA,CAAE,GAAA,CAAE3C,CAAAA,CAAS,UAAA,CAAA,CAC9C,CAAA,CAAA,CACF,CAAA,CAEF1H,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACX,QAAA,CAAA,CAAA,CAAA,CAACqK,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,UAAY,KAAA,GACtCvK,cAAAA,CAAC0L,gBAAAA,CAAA,CAAc,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CAEvCnB,CAAAA,CAAO,OAAA,GAAY,SAAA,EAAavK,cAAAA,CAAC2L,aAAAA,CAAA,CAAW,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,EAAA,CAAI,CAAA,CACnEpB,CAAAA,CAAO,OAAA,GAAY,QAAA,EAClBvK,cAAAA,CAAC4L,iBAAAA,CAAA,CAAe,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,GAAI,CAAA,CAEzC1L,eAAAA,CAAC,MAAA,CAAA,CACG,QAAA,CAAA,CAAA,CAAA,CAACqK,CAAAA,CAAO,OAAA,EAAWA,CAAAA,CAAO,OAAA,GAAY,KAAA,GAAU,KAAA,CACjDA,CAAAA,CAAO,OAAA,GAAY,SAAA,EAAa,SAAA,CAChCA,EAAO,OAAA,GAAY,QAAA,EAAY,QAAA,CAAA,CAClC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCxLO,SAASkD,EAAAA,CAAmB,CACjC,SAAA,CAAA/L,CAAAA,CACA,QAAA,CAAAwC,CACF,CAAA,CAA4B,CAC1B,GAAM,CACJ,MAAAzK,CAAAA,CACA,YAAA,CAAAsK,CAAAA,CACA,WAAA,CAAAI,CAAAA,CACA,SAAA,CAAAW,EACA,MAAA,CAAA9G,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,mBAAA,CAAAoH,CACF,EAAI1B,EAAAA,EAAgB,CAGdnK,CAAAA,CADUoD,0BAAAA,EAAW,CACJ,CAAC,CAAA,EAAK,IAAA,CACvB8I,CAAAA,CAAetL,aAAAA,CAAQ,IAAMuL,qBAAAA,CAAgBlM,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAE5D,CAAE,IAAA,CAAAJ,CAAAA,CAAM,UAAA,CAAAL,CAAW,CAAA,CAAIJ,EAAAA,EAAQ,CAE/B2O,CAAAA,CAAa,CAACvJ,CAAAA,EAAU,CAACxE,CAAAA,EAAU,CAACuK,CAAAA,CAEpC2J,CAAAA,CAAapU,iBAAAA,CAAY,SAAY,CACzC,GAAI,CAAC0E,CAAAA,EAAU,CAACxE,CAAAA,EAAU,CAACuK,CAAAA,CAAc,OAEzC,IAAM4J,CAAAA,CAASxJ,CAAAA,EAAeC,oBAAAA,CAAe3K,CAAK,CAAA,CAC5CiN,CAAAA,CAAiBiH,CAAAA,EAAQ,QAAA,EAAY,CAAA,CACrChH,CAAAA,CAAejB,CAAAA,EAAc,OAAA,EAAWiI,CAAAA,EAAQ,SAAW,EAAA,CAE3D/G,CAAAA,CAAQ9B,CAAAA,GAAc,KAAA,CACtBhD,CAAAA,CAAO8E,CAAAA,CAAQD,CAAAA,CAAe5C,CAAAA,CAC9BhC,CAAAA,CAAK6E,CAAAA,CAAQ7C,CAAAA,CAAe4C,CAAAA,CAE5BzI,CAAAA,CAAmB,IAAI2I,oBAAU7I,CAAM,CAAA,CAC1C,SAAA,CAAU0I,CAAc,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAENxD,CAAAA,CAASmC,CAAAA,CACTyB,CAAAA,CAAe9D,CAAAA,CAAyBvJ,CAAK,CAAA,CAC7CsN,CAAAA,CAAiB,IAAIF,mBAAAA,CACzB3D,CAAAA,CAAO,WAAA,EAAe4D,CAAAA,CAAa,WAAA,EAAe,CACpD,CAAA,CACG,SAAA,CAAUJ,CAAc,CAAA,CACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAENM,CAAAA,CAAY,IAAIH,mBAAAA,CAAU3D,CAAAA,CAAO,MAAA,EAAU4D,CAAAA,CAAa,MAAA,EAAU,CAAC,CAAA,CACtE,SAAA,CAAUJ,CAAc,EACxB,aAAA,CAAc,CAAC,CAAA,CACf,QAAA,EAAS,CAEZ,GAAI,CACF,MAAMrN,CAAAA,CAAK,CACT,KAAA,CAAAI,CAAAA,CACA,MAAA,CAAAD,CAAAA,CACA,MAAOsI,CAAAA,CACP,MAAA,CAAQC,CAAAA,CACR,MAAA,CAAQ7D,CAAAA,CACR,QAAA,CAAUgF,CAAAA,CAAO,QAAA,EAAY4D,CAAAA,CAAa,QAAA,EAAY,CAAA,CACtD,WAAA,CAAaC,CAAAA,CACb,MAAA,CAAQC,EACR,SAAA,CAAW9D,CAAAA,CAAO,OAAA,GAAY,KAChC,CAAC,CAAA,CACDjF,CAAAA,CAAU,KAAA,CAAS,EACrB,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,CACDD,EACAxE,CAAAA,CACAuK,CAAAA,CACAI,CAAAA,CACAuB,CAAAA,CACAjM,CAAAA,CACAqL,CAAAA,CACAO,CAAAA,CACAhM,CAAAA,CACA4E,CACF,CAAC,CAAA,CAED,OACE+B,cAAAA,CAACa,SAAAA,CAAA,CACC,SAAA,CAAS,IAAA,CACT,IAAA,CAAK,IAAA,CACL,KAAA,CAAOiE,CAAAA,GAAc,KAAA,CAAQ,SAAA,CAAY,WAAA,CACzC,SAAA,CAAWpD,CAAAA,CACX,aAAA,CAAa,IAAA,CACb,UAAA,CAAY6F,EACZ,SAAA,CAAWvO,CAAAA,CACX,OAAA,CAAS0U,CAAAA,CAER,QAAA,CAAAxJ,CAAAA,GAAaY,CAAAA,GAAc,KAAA,CAAQ,KAAA,CAAQ,MAAA,CAAA,CAC9C,CAEJ,CCxGI,OAAO,MAAA,CAAW,MACpB,MAAA,CAAO,mBAAA,CAAsB,MAAA,CAAO,mBAAA,EAAuB,EAAC,CAC5D,MAAA,CAAO,mBAAA,CAAoB,sBAAsB,CAAA,CAAI,OAAA,CAAA,CAGvD,IAAO8I,EAAAA,CAAQ","file":"index.js","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useSwapRouteQuery } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { UseSwapRoutePollingOptions } from \"../types\";\n\nconst DEFAULT_INTERVAL = 12_000;\n\n/**\n * Hook that polls for swap route quotes at a configurable interval.\n *\n * Built on top of `useSwapRouteQuery` (TanStack Query) — automatically\n * deduplicates requests, caches results, and invalidates when params change.\n *\n * Polling pauses when `paused` is true (e.g. during swap execution) or\n * when required params are missing.\n */\nexport function useSwapRoutePolling(\n params: Partial<API.SwapParams>,\n options?: UseSwapRoutePollingOptions,\n) {\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n const paused = options?.paused ?? false;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const hasRequiredParams =\n !!params.chain &&\n !!params.userAddress &&\n !!params.input &&\n !!params.output &&\n !!params.amount;\n\n const enabled = hasRequiredParams && !paused;\n\n const query = useSwapRouteQuery(params as API.SwapParams, {\n enabled,\n refetchInterval: enabled ? interval : false,\n retry: false,\n });\n\n useEffect(() => {\n if (query.error) {\n optionsRef.current?.onError?.(query.error);\n }\n }, [query.error]);\n\n return useMemo(\n () => ({\n route: query.data,\n isRouting: query.isFetching,\n error: query.error,\n }),\n [query.data, query.isFetching, query.error],\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { API, Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { useSwapRoutePolling } from \"../../hooks/useSwapRoutePolling\";\nimport { useTxConfirmation } from \"../../hooks/useTxConfirmation\";\nimport type { UseSwapScriptParams, UseSwapScriptResult } from \"./types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst TOKEN_POLL_MS = 10_000;\nconst BALANCE_POLL_MS = 15_000;\n\n/**\n * Computes the total output amount from route plans.\n * Each plan has an outputAmount in smallest units — we take the last plan's\n * output (the final token) and shift by decimals.\n */\nfunction formatOutputAmount(\n plans: Array<{ outputAmount: string }>,\n decimals: number,\n): string | undefined {\n if (plans.length === 0) return undefined;\n const lastPlan = plans[plans.length - 1]!;\n const raw = lastPlan.outputAmount;\n if (!raw || raw === \"0\") return \"0\";\n\n const padded = raw.padStart(decimals + 1, \"0\");\n const intPart = padded.slice(0, padded.length - decimals) || \"0\";\n const fracPart = padded.slice(padded.length - decimals);\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Script hook that encapsulates all data fetching and state management\n * for the swap form.\n *\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useSwapScript(\n params: UseSwapScriptParams,\n): UseSwapScriptResult {\n const { chain } = params;\n\n // ── Wallet ────────────────────────────────────────────────────────────────\n\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // ── Token selection state ─────────────────────────────────────────────────\n\n const [fromTokenAddress, setFromTokenAddress] = useState(params.from ?? \"\");\n const [toTokenAddress, setToTokenAddress] = useState(params.to ?? \"\");\n\n const fromRef = useRef(params.from);\n const toRef = useRef(params.to);\n useEffect(() => {\n if (params.from !== fromRef.current) {\n fromRef.current = params.from;\n if (params.from) setFromTokenAddress(params.from);\n }\n }, [params.from]);\n useEffect(() => {\n if (params.to !== toRef.current) {\n toRef.current = params.to;\n if (params.to) setToTokenAddress(params.to);\n }\n }, [params.to]);\n\n // ── Token metadata ────────────────────────────────────────────────────────\n\n const tokenAddresses = useMemo(\n () => [fromTokenAddress, toTokenAddress].filter(Boolean),\n [fromTokenAddress, toTokenAddress],\n );\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const fromToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === fromTokenAddress) ?? null,\n [tokensQuery.data, fromTokenAddress],\n );\n const toToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === toTokenAddress) ?? null,\n [tokensQuery.data, toTokenAddress],\n );\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const fromBalance = useMemo(\n () =>\n balancesQuery.data?.find((p) => p.address === fromTokenAddress) ?? null,\n [balancesQuery.data, fromTokenAddress],\n );\n const toBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === toTokenAddress) ?? null,\n [balancesQuery.data, toTokenAddress],\n );\n\n // ── Amount ────────────────────────────────────────────────────────────────\n\n const [amount, setAmount] = useState<string | undefined>(undefined);\n\n const amountInDecimals = useMemo(() => {\n if (!amount || fromToken?.decimals == null) return undefined;\n const parts = amount.split(\".\");\n const intPart = parts[0] ?? \"0\";\n const fracPart = (parts[1] ?? \"\").slice(0, fromToken.decimals);\n const padded = fracPart.padEnd(fromToken.decimals, \"0\");\n const raw = intPart + padded;\n return raw.replace(/^0+/, \"\") || \"0\";\n }, [amount, fromToken?.decimals]);\n\n const amountInUsd = useMemo(() => {\n if (!amount || !fromToken?.marketData?.priceInUsd) return undefined;\n const price = Number(fromToken.marketData.priceInUsd);\n const value = Number(amount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [amount, fromToken?.marketData?.priceInUsd]);\n\n // ── Half / Max helpers ────────────────────────────────────────────────────\n\n const setHalfAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const half = bal / 2;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n half.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n const setMaxAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n bal.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n // ── Route polling ─────────────────────────────────────────────────────────\n\n const routeParams = useMemo<Partial<API.SwapParams>>(\n () => ({\n chain,\n userAddress: walletAddress || undefined,\n input: fromTokenAddress || undefined,\n output: toTokenAddress || undefined,\n mode: API.SwapMode.EXACT_IN,\n amount: amountInDecimals,\n }),\n [chain, walletAddress, fromTokenAddress, toTokenAddress, amountInDecimals],\n );\n\n const isSwappingRef = useRef(false);\n\n const {\n route,\n isRouting,\n error: routeError,\n } = useSwapRoutePolling(routeParams, { paused: isSwappingRef.current });\n\n // ── Output amount ─────────────────────────────────────────────────────────\n\n const outputAmount = useMemo(\n () =>\n route && toToken\n ? formatOutputAmount(route.plans, toToken.decimals)\n : undefined,\n [route, toToken],\n );\n\n const outputAmountInUsd = useMemo(() => {\n if (!outputAmount || !toToken?.marketData?.priceInUsd) return undefined;\n const price = Number(toToken.marketData.priceInUsd);\n const value = Number(outputAmount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [outputAmount, toToken?.marketData?.priceInUsd]);\n\n // ── Swap execution ────────────────────────────────────────────────────────\n\n const { swap: rawSwap, isSwapping } = useSwap();\n isSwappingRef.current = isSwapping;\n\n const onCompleteRef = useRef(params.onComplete);\n onCompleteRef.current = params.onComplete;\n\n const { track, transactions } = useTxConfirmation({\n onConfirmed: (txHash) => {\n onCompleteRef.current?.({ success: true, txHash });\n },\n onFailed: (txHash) => {\n onCompleteRef.current?.({ success: false, txHash });\n },\n });\n\n const latestTxStatus = useMemo(() => {\n if (transactions.size === 0) return \"idle\" as const;\n const entries = Array.from(transactions.values());\n return entries[entries.length - 1]!.status;\n }, [transactions]);\n\n const swap = useCallback(async () => {\n if (\n !wallet ||\n !route ||\n !fromTokenAddress ||\n !toTokenAddress ||\n !amountInDecimals\n ) {\n return;\n }\n\n try {\n const result = await rawSwap({\n chain,\n wallet,\n input: fromTokenAddress,\n output: toTokenAddress,\n amount: amountInDecimals,\n mode: API.SwapMode.EXACT_IN,\n });\n track(chain, result.txHash);\n } catch {\n // Error is already reported via useSwap's onError callback\n }\n }, [\n wallet,\n route,\n chain,\n fromTokenAddress,\n toTokenAddress,\n amountInDecimals,\n rawSwap,\n track,\n ]);\n\n // ── Loading state ─────────────────────────────────────────────────────────\n\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return useMemo(\n () => ({\n fromTokenAddress,\n toTokenAddress,\n setFromTokenAddress,\n setToTokenAddress,\n\n fromToken,\n toToken,\n\n fromBalance,\n toBalance,\n\n amount,\n setAmount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n\n outputAmount,\n outputAmountInUsd,\n\n route,\n isRouting,\n routeError,\n\n swap,\n isSwapping,\n\n txStatus: latestTxStatus,\n\n isLoading,\n }),\n [\n fromTokenAddress,\n toTokenAddress,\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n swap,\n isSwapping,\n latestTxStatus,\n isLoading,\n ],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cn,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n TradeIcon,\n} from \"@liberfi.io/ui\";\nimport type { SwapPreviewModalProps } from \"./types\";\n\n/**\n * Modal that previews swap details before confirmation.\n *\n * Pure presentational — all data and callbacks received via props.\n * Shows from/to token cards, expandable route plan details,\n * and a confirm button.\n */\nexport function SwapPreviewModal({\n isOpen,\n onOpenChange,\n fromToken,\n toToken,\n fromBalance,\n inputAmount,\n inputAmountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n onConfirm,\n isSwapping,\n}: SwapPreviewModalProps) {\n const [expanded, setExpanded] = useState(false);\n const toggleExpanded = useCallback(() => setExpanded((prev) => !prev), []);\n\n const plans = useMemo(() => {\n if (!route) return [];\n return route.plans.map((plan, i) => ({\n key: `plan-${i}`,\n name: plan.name,\n input: plan.input,\n inputAmount: plan.inputAmount,\n output: plan.output,\n outputAmount: plan.outputAmount,\n feeQuote: plan.feeQuote,\n feeAmount: plan.feeAmount,\n }));\n }, [route]);\n\n return (\n <Modal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n hideCloseButton\n scrollBehavior=\"inside\"\n backdrop=\"blur\"\n >\n <ModalContent className=\"bg-content2 rounded-lg\">\n <ModalHeader>Preview</ModalHeader>\n <ModalBody>\n <div className=\"flex w-full max-h-[70vh] flex-1 flex-col overflow-y-auto py-2\">\n {/* ── From preview ─────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n From\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {fromToken?.image && (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {fromToken?.symbol ?? \"—\"}\n </div>\n {fromBalance && (\n <div className=\"text-neutral flex items-center gap-1 text-[10px]\">\n <WalletBalanceIcon />\n <span>\n {formatNumber(fromBalance.amount)} {fromToken?.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(inputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(inputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── To preview ───────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Estimated Receive\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {toToken?.image && (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {toToken?.symbol ?? \"—\"}\n </div>\n <div className=\"text-neutral text-[10px]\">\n {truncateAddress(toToken?.address)}\n </div>\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(outputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(outputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Route plan details ───────────────────────────────────── */}\n {expanded && plans.length > 0 && (\n <div className=\"my-3\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Route Details\n </div>\n <div className=\"mt-3 flex flex-col gap-3\">\n {plans.map((plan) => (\n <div\n key={plan.key}\n className=\"bg-content3 flex w-full flex-col items-center gap-2 rounded-lg px-4 py-3\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">DEX</div>\n <div className=\"text-foreground text-xs\">\n {plan.name}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Swap</div>\n <div className=\"text-foreground flex items-center gap-2 text-xs\">\n <span>\n {formatSmallAmount(plan.inputAmount)}{\" \"}\n {truncateAddress(plan.input)}\n </span>\n <TradeIcon\n width={12}\n height={12}\n className=\"text-foreground\"\n />\n <span>\n {formatSmallAmount(plan.outputAmount)}{\" \"}\n {truncateAddress(plan.output)}\n </span>\n </div>\n </div>\n {plan.feeAmount && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Fee</div>\n <div className=\"text-foreground text-xs\">\n {formatSmallAmount(plan.feeAmount)}{\" \"}\n {truncateAddress(plan.feeQuote)}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* ── Expand / collapse toggle ─────────────────────────────── */}\n {plans.length > 0 && (\n <div className=\"flex justify-center\">\n <Button\n size=\"sm\"\n className=\"text-neutral flex bg-transparent text-xs\"\n endContent={\n expanded ? (\n <ChevronUpIcon width={12} height={12} />\n ) : (\n <ChevronDownIcon width={12} height={12} />\n )\n }\n disableRipple\n onPress={toggleExpanded}\n >\n {expanded ? \"Show Less\" : \"Show More\"}\n </Button>\n </div>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button\n fullWidth\n color=\"primary\"\n className=\"flex rounded-lg\"\n disableRipple\n isDisabled={!route || !!routeError}\n isLoading={(!route && isRouting) || isSwapping}\n onPress={onConfirm}\n >\n Confirm\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n }) + \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n\n/** Render raw smallest-unit amounts in abbreviated form. */\nfunction formatSmallAmount(value: string | undefined): string {\n if (!value || value === \"0\") return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return value;\n if (n >= 1e12) return (n / 1e12).toFixed(2) + \"T\";\n if (n >= 1e9) return (n / 1e9).toFixed(2) + \"B\";\n if (n >= 1e6) return (n / 1e6).toFixed(2) + \"M\";\n if (n >= 1e3) return (n / 1e3).toFixed(2) + \"K\";\n return value;\n}\n\nfunction truncateAddress(addr: string | undefined): string {\n if (!addr) return \"—\";\n if (addr.length <= 10) return addr;\n return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n","import { Avatar, Button, ChevronDownIcon, cn, Input } from \"@liberfi.io/ui\";\nimport type { SwapUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the swap form.\n *\n * Receives all data and callbacks via props — no API calls, no subscriptions.\n * Consumers can replace this component entirely while reusing `useSwapScript`.\n */\nexport function SwapUI({\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n amountInUsd,\n onAmountChange,\n onHalfAmount,\n onMaxAmount,\n outputAmount,\n outputAmountInUsd,\n onFromTokenSelect,\n onToTokenSelect,\n route,\n isRouting,\n routeError,\n onPreview,\n isSwapping,\n className,\n}: SwapUIProps) {\n return (\n <div className={cn(\"px-4 pb-4 lg:pb-8\", className)}>\n {/* ── From token section ─────────────────────────────────────────── */}\n <div className=\"space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">From</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={amount ?? \"\"}\n onChange={(e) => onAmountChange(e.target.value || undefined)}\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n fromToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n fromToken?.image ? (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onFromTokenSelect(\"\")}\n >\n {fromToken ? fromToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(amountInUsd)}\n </div>\n {fromBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(fromBalance.amount)} {fromBalance.symbol}\n </span>\n {onHalfAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onHalfAmount}\n >\n Half\n </span>\n )}\n {onMaxAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onMaxAmount}\n >\n Max\n </span>\n )}\n </div>\n )}\n </div>\n\n {routeError && (\n <p className=\"mt-1 break-words text-xs text-danger-500\">\n {routeError.message}\n </p>\n )}\n </div>\n </div>\n\n {/* ── To token section ───────────────────────────────────────────── */}\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">To</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={outputAmount ?? \"\"}\n disabled\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n toToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n toToken?.image ? (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onToTokenSelect(\"\")}\n >\n {toToken ? toToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(outputAmountInUsd)}\n </div>\n {toBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(toBalance.amount)} {toBalance.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Submit button ──────────────────────────────────────────────── */}\n <Button\n fullWidth\n color=\"primary\"\n className=\"mt-8 flex rounded-lg\"\n disableRipple\n isDisabled={!route}\n isLoading={!route && isRouting}\n onPress={onPreview}\n >\n {isSwapping ? \"Swapping...\" : isRouting ? \"Finding route...\" : \"Swap\"}\n </Button>\n </div>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) +\n \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n","import { useCallback } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport { SwapPreviewModal } from \"./swap-preview-modal\";\nimport { useSwapScript } from \"./swap.script\";\nimport { SwapUI } from \"./swap.ui\";\nimport type { SwapWidgetProps } from \"./types\";\n\n/**\n * Swap widget — thin orchestration layer.\n *\n * Calls `useSwapScript` to fetch all data, renders `SwapUI` for the form\n * and `SwapPreviewModal` for pre-swap confirmation.\n *\n * For custom UIs, use `useSwapScript` directly with your own presentation.\n */\nexport function SwapWidget({\n chain,\n from,\n to,\n onComplete,\n className,\n}: SwapWidgetProps) {\n const script = useSwapScript({ chain, from, to, onComplete });\n const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure();\n\n const handleConfirm = useCallback(async () => {\n await script.swap();\n onClose();\n }, [script, onClose]);\n\n return (\n <>\n <SwapUI\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n toBalance={script.toBalance}\n amount={script.amount}\n amountInUsd={script.amountInUsd}\n onAmountChange={script.setAmount}\n onHalfAmount={script.setHalfAmount}\n onMaxAmount={script.setMaxAmount}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n onFromTokenSelect={script.setFromTokenAddress}\n onToTokenSelect={script.setToTokenAddress}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onPreview={onOpen}\n isSwapping={script.isSwapping}\n className={className}\n />\n <SwapPreviewModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n inputAmount={script.amount}\n inputAmountInUsd={script.amountInUsd}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onConfirm={handleConfirm}\n isSwapping={script.isSwapping}\n />\n </>\n );\n}\n","import { Chain, API } from \"@liberfi.io/types\";\nimport type { WalletAdapter } from \"@liberfi.io/wallet-connector\";\n\n/**\n * Input parameters for the `swap()` function returned by {@link useSwap}.\n *\n * The caller provides chain, wallet, token addresses, amount and optional\n * chain-specific settings. The hook handles route fetching, signing and\n * transaction submission internally.\n */\nexport interface SwapInput {\n /** Target chain */\n chain: Chain;\n /** Wallet adapter used to sign the transaction */\n wallet: WalletAdapter;\n /** Input token address */\n input: string;\n /** Output token address */\n output: string;\n /** Amount in smallest unit (lamports for Solana, wei for EVM) */\n amount: string;\n /** Swap mode, defaults to EXACT_IN */\n mode?: API.SwapMode;\n /** Slippage tolerance, 0-100, defaults to 1 */\n slippage?: number;\n\n // -- Solana-specific --\n /** Priority fee in microLamports (Solana only) */\n priorityFee?: string;\n /** Jito/0solt tip fee in lamports (Solana only) */\n tipFee?: string;\n /** Enable anti-MEV via Jito/0solt (Solana only) */\n isAntiMev?: boolean;\n\n // -- EVM-specific --\n /** EIP-2612 permit data, alternative to on-chain approve (EVM only) */\n permit?: string;\n /** Transaction deadline timestamp in ms (EVM only) */\n deadline?: number;\n}\n\n/** Result returned after a swap transaction is successfully submitted. */\nexport interface SwapResult {\n /** Transaction hash / signature */\n txHash: string;\n /** Extra data from the API (e.g. jobId for confirmation polling) */\n extra?: Record<string, unknown>;\n}\n\n/** Phase of the swap flow, used in error callbacks. */\nexport type SwapPhase = \"route\" | \"sign\" | \"send\";\n\n/** Options for the {@link useSwap} hook. */\nexport interface UseSwapOptions {\n /** Called when the transaction is successfully submitted on-chain. */\n onSubmitted?: (result: SwapResult) => void;\n /** Called when an error occurs at any phase of the swap flow. */\n onError?: (error: Error, phase: SwapPhase) => void;\n}\n\n/** Options for the {@link useSwapRoutePolling} hook. */\nexport interface UseSwapRoutePollingOptions {\n /** Polling interval in ms. Defaults to 12000 (12s). */\n interval?: number;\n /** Pause polling (e.g. during swap execution). */\n paused?: boolean;\n /** Called when a route fetch fails. */\n onError?: (error: Error) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Instant Trade Preset\n// ---------------------------------------------------------------------------\n\n/** Configuration values for a single trade preset (slippage, fees, MEV). */\nexport interface TradePresetValues {\n /** Slippage tolerance, 0-100 (percent). `null` = use default. */\n slippage: number | null;\n /** Priority fee in native token units. `null` = use default. */\n priorityFee: number | null;\n /** Tip fee in native token units. `null` = use default. */\n tipFee: number | null;\n /** Whether automatic fee estimation is enabled. */\n autoFee: boolean;\n /** Maximum fee cap when auto-fee is on (native token units). */\n maxAutoFee: number | null;\n /** Anti-MEV protection level. */\n antiMev: \"off\" | \"reduced\" | \"secure\";\n /** Custom RPC endpoint URL. `null` = use default. */\n customRPC: string | null;\n}\n\n/** Default preset values matching Solana-typical settings. */\nexport const DEFAULT_TRADE_PRESET: TradePresetValues = {\n slippage: 20,\n priorityFee: 0.001,\n tipFee: 0.001,\n autoFee: false,\n maxAutoFee: 0.1,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default preset values for EVM chains (gas fee in Gwei). */\nexport const DEFAULT_EVM_TRADE_PRESET: TradePresetValues = {\n slippage: 1,\n priorityFee: 5,\n tipFee: null,\n autoFee: false,\n maxAutoFee: null,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default preset values for BSC (gas in Gwei + tip in BNB). */\nexport const DEFAULT_BSC_TRADE_PRESET: TradePresetValues = {\n slippage: 1,\n priorityFee: 5,\n tipFee: 0.001,\n autoFee: false,\n maxAutoFee: null,\n antiMev: \"off\",\n customRPC: null,\n};\n\n/** Default quick-buy amounts (native token units). */\nexport const DEFAULT_BUY_AMOUNTS: number[] = [0.01, 0.1, 1, 10];\n\n/** Default quick-sell percentages. */\nexport const DEFAULT_SELL_PERCENTAGES: number[] = [10, 25, 50, 100];\n\n/** Confirmation status of a tracked transaction. */\nexport type TxConfirmationStatus = \"idle\" | \"pending\" | \"confirmed\" | \"failed\";\n\n/** Options for the {@link useTxConfirmation} hook. */\nexport interface UseTxConfirmationOptions {\n /** Called when the transaction is confirmed on-chain. */\n onConfirmed?: (txHash: string) => void;\n /** Called when the transaction fails or confirmation times out. */\n onFailed?: (txHash: string, error: Error) => void;\n /** SSE timeout in milliseconds. Defaults to 60000 (60s). */\n timeout?: number;\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport {\n DEFAULT_TRADE_PRESET,\n DEFAULT_EVM_TRADE_PRESET,\n DEFAULT_BSC_TRADE_PRESET,\n type TradePresetValues,\n} from \"../../types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nconst BSC_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.BINANCE,\n Chain.BINANCE_TESTNET,\n]);\n\nexport type AntiMevOption = \"off\" | \"reduced\" | \"secure\";\n\nexport interface ChainPresetFeatures {\n /** Label for the priority/gas fee field */\n feeLabel: string;\n /** Unit displayed for the fee input (e.g. \"SOL\", \"Gwei\") */\n feeUnit: string;\n /** Decimal places for the fee input */\n feeDecimals: number;\n /** Whether this chain supports a separate tip/bribe fee */\n showTipFee: boolean;\n /** Unit for tip fee (e.g. \"SOL\", \"BNB\"). Empty when hidden. */\n tipFeeUnit: string;\n /** Decimal places for the tip fee input */\n tipFeeDecimals: number;\n /**\n * Available anti-MEV protection levels for this chain.\n * - Solana: [\"off\", \"reduced\", \"secure\"]\n * - ETH / BSC: [\"off\", \"secure\"]\n */\n antiMevOptions: AntiMevOption[];\n}\n\n/**\n * Returns the set of preset form features applicable to a given chain.\n *\n * - Solana: priority fee (SOL), tip fee (SOL/Jito), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n * - Other EVM: gas fee (Gwei), same as Ethereum by default\n */\nexport function getChainPresetFeatures(\n chain: Chain,\n nativeSymbol = \"ETH\",\n): ChainPresetFeatures {\n if (SOLANA_CHAINS.has(chain)) {\n return {\n feeLabel: \"Priority Fee\",\n feeUnit: \"SOL\",\n feeDecimals: 9,\n showTipFee: true,\n tipFeeUnit: \"SOL\",\n tipFeeDecimals: 9,\n antiMevOptions: [\"off\", \"reduced\", \"secure\"],\n };\n }\n\n if (BSC_CHAINS.has(chain)) {\n return {\n feeLabel: \"Gas Fee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: true,\n tipFeeUnit: \"BNB\",\n tipFeeDecimals: 9,\n antiMevOptions: [\"off\", \"secure\"],\n };\n }\n\n // Default EVM (Ethereum and others)\n return {\n feeLabel: \"Gas Fee\",\n feeUnit: \"Gwei\",\n feeDecimals: 2,\n showTipFee: false,\n tipFeeUnit: nativeSymbol,\n tipFeeDecimals: 9,\n antiMevOptions: [\"off\", \"secure\"],\n };\n}\n\nexport function isSolanaChain(chain: Chain): boolean {\n return SOLANA_CHAINS.has(chain);\n}\n\n/** Returns chain-appropriate default preset values. */\nexport function getDefaultPresetForChain(chain: Chain): TradePresetValues {\n if (SOLANA_CHAINS.has(chain)) return DEFAULT_TRADE_PRESET;\n if (BSC_CHAINS.has(chain)) return DEFAULT_BSC_TRADE_PRESET;\n return DEFAULT_EVM_TRADE_PRESET;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { getNativeToken } from \"@liberfi.io/utils\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport type {\n BuySettings,\n SellSettings,\n InstantTradeSettings,\n InstantTradeContextValue,\n InstantTradeProviderProps,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nfunction buildDefaultSettings(chain: Chain): InstantTradeSettings {\n const preset = getDefaultPresetForChain(chain);\n return {\n buy: {\n customAmounts: [0.01, 0.1, 1, 10],\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n sell: {\n customPercentages: [10, 25, 50, 100],\n presets: [{ ...preset }, { ...preset }, { ...preset }],\n },\n };\n}\n\nexport const DEFAULT_INSTANT_TRADE_SETTINGS: InstantTradeSettings =\n buildDefaultSettings(\"900900900\" as Chain);\n\n// ---------------------------------------------------------------------------\n// localStorage helpers\n// ---------------------------------------------------------------------------\n\nfunction storageKey(chain: string) {\n return `liberfi.instant-trade.settings.${chain}`;\n}\n\nfunction readStoredSettings(\n chain: Chain,\n fallback: InstantTradeSettings,\n): InstantTradeSettings {\n try {\n const raw = localStorage.getItem(storageKey(String(chain)));\n if (raw) return JSON.parse(raw) as InstantTradeSettings;\n } catch {\n /* ignore */\n }\n return fallback;\n}\n\nfunction writeStoredSettings(chain: string, settings: InstantTradeSettings) {\n try {\n localStorage.setItem(storageKey(chain), JSON.stringify(settings));\n } catch {\n /* ignore */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst InstantTradeContext = createContext<InstantTradeContextValue | null>(\n null,\n);\n\n/** Access the nearest {@link InstantTradeProvider}. Throws if none found. */\nexport function useInstantTrade(): InstantTradeContextValue {\n const ctx = useContext(InstantTradeContext);\n if (!ctx) {\n throw new Error(\n \"useInstantTrade must be used within an InstantTradeProvider\",\n );\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Provides instant-trade state to descendant components.\n *\n * Settings follow a controlled / uncontrolled pattern:\n * - **Controlled**: pass `settings` + `onSettingsChange` props.\n * - **Uncontrolled** (default): settings auto-persist to localStorage keyed by chain.\n */\nexport function InstantTradeProvider({\n chain,\n tokenAddress,\n settings: controlledSettings,\n onSettingsChange,\n children,\n}: InstantTradeProviderProps) {\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const isControlled = controlledSettings !== undefined;\n const chainDefaults = useMemo(() => buildDefaultSettings(chain), [chain]);\n\n // -- Uncontrolled settings state (only used when no controlled prop) --\n const [localSettings, setLocalSettings] = useState<InstantTradeSettings>(\n () =>\n isControlled ? chainDefaults : readStoredSettings(chain, chainDefaults),\n );\n\n const settings = isControlled ? controlledSettings : localSettings;\n\n const setSettings = useCallback(\n (next: InstantTradeSettings) => {\n if (isControlled) {\n onSettingsChange?.(next);\n } else {\n setLocalSettings(next);\n writeStoredSettings(String(chain), next);\n }\n },\n [isControlled, onSettingsChange, chain],\n );\n\n const updateBuySettings = useCallback(\n (buy: BuySettings) => setSettings({ ...settings, buy }),\n [settings, setSettings],\n );\n\n const updateSellSettings = useCallback(\n (sell: SellSettings) => setSettings({ ...settings, sell }),\n [settings, setSettings],\n );\n\n // -- UI state --\n const [direction, setDirection] = useState<\"buy\" | \"sell\">(\"buy\");\n const [amount, setAmount] = useState<number | undefined>();\n const [buyPreset, setBuyPreset] = useState(0);\n const [sellPreset, setSellPreset] = useState(0);\n\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const currentPresetValues = useMemo(() => {\n const idx = direction === \"buy\" ? buyPreset : sellPreset;\n const presets =\n direction === \"buy\" ? settings.buy.presets : settings.sell.presets;\n return presets[idx] ?? defaultPreset;\n }, [direction, buyPreset, sellPreset, settings, defaultPreset]);\n\n const value = useMemo<InstantTradeContextValue>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n direction,\n setDirection,\n amount,\n setAmount,\n buyPreset,\n setBuyPreset,\n sellPreset,\n setSellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n direction,\n amount,\n buyPreset,\n sellPreset,\n settings,\n updateBuySettings,\n updateSellSettings,\n currentPresetValues,\n ],\n );\n\n return (\n <InstantTradeContext.Provider value={value}>\n {children}\n </InstantTradeContext.Provider>\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { ChainNamespace, Chain } from \"@liberfi.io/types\";\nimport {\n getNativeToken,\n getWrappedToken,\n formatAmountUSD,\n} from \"@liberfi.io/utils\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport { useInstantTrade } from \"./instant-trade.context\";\nimport type {\n UseInstantTradeScriptParams,\n UseInstantTradeScriptResult,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst BALANCE_POLL_MS = 15_000;\nconst TOKEN_POLL_MS = 10_000;\n\n// ---------------------------------------------------------------------------\n// Script hook\n// ---------------------------------------------------------------------------\n\n/**\n * Script hook that encapsulates all data and state for the instant trade form.\n *\n * Must be used inside an {@link InstantTradeProvider}.\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useInstantTradeScript(\n params: UseInstantTradeScriptParams,\n): UseInstantTradeScriptResult {\n const { chain, tokenAddress, onSwapSubmitted, onSwapError } = params;\n\n const ctx = useInstantTrade();\n\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const wrappedToken = useMemo(() => getWrappedToken(chain), [chain]);\n\n // -- Wallet --\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // -- Token metadata --\n const tokenAddresses = useMemo(() => {\n const addrs = [tokenAddress];\n if (nativeToken) addrs.push(nativeToken.address);\n if (wrappedToken) addrs.push(wrappedToken.address);\n return addrs.filter(Boolean);\n }, [tokenAddress, nativeToken, wrappedToken]);\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const tokenInfo = useMemo(\n () => tokensQuery.data?.find((t) => t.address === tokenAddress) ?? null,\n [tokensQuery.data, tokenAddress],\n );\n\n // -- Balances --\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const nativeAddr = nativeToken?.address ?? wrappedToken?.address ?? \"\";\n const nativeBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === nativeAddr) ?? null,\n [balancesQuery.data, nativeAddr],\n );\n const tokenBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === tokenAddress) ?? null,\n [balancesQuery.data, tokenAddress],\n );\n\n // -- Settings form visibility --\n const [showSettings, setShowSettings] = useState(false);\n const lastClickedPreset = useRef<number | null>(null);\n\n const handlePresetClick = useCallback((preset: number) => {\n const last = lastClickedPreset.current;\n lastClickedPreset.current = preset;\n setShowSettings((prev) =>\n last === null || last !== preset ? true : !prev,\n );\n }, []);\n\n // -- Swap execution --\n const onSubmittedRef = useRef(onSwapSubmitted);\n onSubmittedRef.current = onSwapSubmitted;\n const onErrorRef = useRef(onSwapError);\n onErrorRef.current = onSwapError;\n\n const { swap: rawSwap, isSwapping } = useSwap({\n onSubmitted: (result) => onSubmittedRef.current?.(result),\n onError: (err, phase) => onErrorRef.current?.(err, phase),\n });\n\n const swap = useCallback(async () => {\n if (!ctx.amount || !wallet || !tokenAddress) return;\n\n const nativeDecimals = nativeToken?.decimals ?? 9;\n const inputAddress = wrappedToken?.address ?? nativeToken?.address ?? \"\";\n\n const isBuy = ctx.direction === \"buy\";\n const from = isBuy ? inputAddress : tokenAddress;\n const to = isBuy ? tokenAddress : inputAddress;\n\n const decimals = isBuy ? nativeDecimals : (tokenInfo?.decimals ?? 9);\n const amountInDecimals = new BigNumber(ctx.amount)\n .shiftedBy(decimals)\n .decimalPlaces(0)\n .toString();\n\n const preset = ctx.currentPresetValues;\n const chainDefault = getDefaultPresetForChain(chain);\n const priorityFeeStr = new BigNumber(\n preset.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString();\n\n const tipFeeStr = new BigNumber(preset.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString();\n\n try {\n await rawSwap({\n chain,\n wallet,\n input: from,\n output: to,\n amount: amountInDecimals,\n slippage: preset.slippage ?? chainDefault.slippage ?? 1,\n priorityFee: priorityFeeStr,\n tipFee: tipFeeStr,\n isAntiMev: preset.antiMev !== \"off\",\n });\n ctx.setAmount(undefined);\n } catch {\n /* error already reported via callback */\n }\n }, [\n ctx,\n wallet,\n tokenAddress,\n nativeToken,\n wrappedToken,\n tokenInfo,\n chain,\n rawSwap,\n ]);\n\n // -- Submit text --\n const submitText = useMemo(() => {\n const dir = ctx.direction === \"buy\" ? \"Buy\" : \"Sell\";\n if (!ctx.amount) return dir;\n\n if (ctx.direction === \"buy\") {\n const bal = nativeBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir} (Insufficient balance)`;\n\n const symbol = nativeToken?.symbol ?? \"\";\n const price = tokenInfo?.marketData?.priceInUsd\n ? Number(tokenInfo.marketData.priceInUsd)\n : null;\n const nativePrice = tokensQuery.data?.find(\n (t) => t.address === nativeAddr,\n )?.marketData?.priceInUsd;\n if (nativePrice) {\n const usd = formatAmountUSD(\n new BigNumber(ctx.amount).times(Number(nativePrice)),\n );\n return `${dir} ${ctx.amount} ${symbol} (${usd})`;\n }\n return `${dir} ${ctx.amount} ${symbol}`;\n }\n\n // sell\n const bal = tokenBalance?.amount;\n if (bal && new BigNumber(bal).lt(ctx.amount))\n return `${dir} (Insufficient balance)`;\n return dir;\n }, [\n ctx.direction,\n ctx.amount,\n nativeBalance,\n tokenBalance,\n nativeToken,\n tokenInfo,\n tokensQuery.data,\n nativeAddr,\n ]);\n\n const isDisabled = !ctx.amount || !wallet || !tokenAddress;\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n return useMemo<UseInstantTradeScriptResult>(\n () => ({\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n direction: ctx.direction,\n setDirection: ctx.setDirection,\n amount: ctx.amount,\n setAmount: ctx.setAmount,\n buyPreset: ctx.buyPreset,\n setBuyPreset: ctx.setBuyPreset,\n sellPreset: ctx.sellPreset,\n setSellPreset: ctx.setSellPreset,\n currentPresetValues: ctx.currentPresetValues,\n settings: ctx.settings,\n updateBuySettings: ctx.updateBuySettings,\n updateSellSettings: ctx.updateSellSettings,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n }),\n [\n chain,\n tokenAddress,\n nativeToken,\n tokenInfo,\n nativeBalance,\n tokenBalance,\n ctx,\n showSettings,\n handlePresetClick,\n swap,\n isSwapping,\n submitText,\n isDisabled,\n isLoading,\n ],\n );\n}\n","import { ChangeEvent, Key, useCallback, useMemo } from \"react\";\nimport {\n Button,\n cn,\n Input,\n InfoIcon,\n NumberInput,\n Switch,\n Tab,\n Tabs,\n Tooltip,\n} from \"@liberfi.io/ui\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures } from \"./chain-features\";\nimport type { PresetFormUIProps } from \"./types\";\n\n/**\n * Pure presentational preset-settings form.\n *\n * Renders inputs for slippage, priority fee, tip fee, auto fee,\n * max auto fee, anti-MEV and custom RPC.\n *\n * The `chain` prop controls which fields are visible:\n * - Solana: priority fee (SOL), tip fee (SOL), anti-MEV\n * - Ethereum: gas fee (Gwei) only\n * - BSC: gas fee (Gwei) + tip fee (BNB)\n */\nexport function PresetFormUI({\n value,\n onChange,\n chain,\n nativeSymbol = \"SOL\",\n nativeDecimals = 9,\n className,\n}: PresetFormUIProps) {\n const update = useCallback(\n (patch: Partial<TradePresetValues>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n const features = useMemo(\n () => getChainPresetFeatures(chain, nativeSymbol),\n [chain, nativeSymbol],\n );\n\n return (\n <div className={cn(\"space-y-1.5\", className)}>\n <SlippageRow\n value={value.slippage}\n onChange={(v) => update({ slippage: v })}\n />\n <PriorityFeeRow\n value={value.priorityFee}\n onChange={(v) => update({ priorityFee: v })}\n label={features.feeLabel}\n symbol={features.feeUnit}\n decimals={features.feeDecimals}\n />\n {features.showTipFee && (\n <TipFeeRow\n value={value.tipFee}\n onChange={(v) => update({ tipFee: v })}\n symbol={features.tipFeeUnit}\n decimals={features.tipFeeDecimals}\n />\n )}\n <AutoFeeRow\n value={value.autoFee}\n onChange={(v) => update({ autoFee: v })}\n />\n {value.autoFee && (\n <MaxAutoFeeRow\n value={value.maxAutoFee}\n onChange={(v) => update({ maxAutoFee: v })}\n symbol={nativeSymbol}\n />\n )}\n <AntiMEVRow\n value={value.antiMev}\n onChange={(v) => update({ antiMev: v })}\n options={features.antiMevOptions}\n />\n <CustomRPCRow\n value={value.customRPC}\n onChange={(v) => update({ customRPC: v })}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal row components\n// ---------------------------------------------------------------------------\n\nconst numberInputClassNames = {\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3 h-8 min-h-0 py-0\",\n input: \"text-xs\",\n};\n\nfunction useNumberHandler(\n onChange: (v: number | null) => void,\n): (v: number | ChangeEvent<HTMLInputElement>) => void {\n return useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onChange(isNaN(v) ? null : v);\n }\n },\n [onChange],\n );\n}\n\n// -- Slippage --\n\nfunction SlippageRow({\n value,\n onChange,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n}) {\n const handle = useNumberHandler(onChange);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral\">Slippage</div>\n <NumberInput\n fullWidth\n value={value === null ? undefined : value}\n onChange={handle}\n hideStepper\n minValue={0}\n maxValue={100}\n step={1}\n endContent={<span className=\"text-xs text-neutral\">%</span>}\n classNames={numberInputClassNames}\n aria-label=\"Slippage\"\n />\n </div>\n );\n}\n\n// -- Priority Fee --\n\nfunction PriorityFeeRow({\n value,\n onChange,\n label = \"Priority Fee\",\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n label?: string;\n symbol: string;\n decimals: number;\n}) {\n const handle = useNumberHandler(onChange);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral flex items-center gap-1\">\n {label}\n <Tooltip\n content=\"Extra fee paid to validators to prioritize your transaction.\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n size=\"sm\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </Tooltip>\n </div>\n <NumberInput\n fullWidth\n value={value === null ? undefined : value}\n onChange={handle}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-xs text-neutral\">{symbol}</span>}\n classNames={numberInputClassNames}\n aria-label=\"Priority Fee\"\n />\n </div>\n );\n}\n\n// -- Tip Fee --\n\nfunction TipFeeRow({\n value,\n onChange,\n symbol,\n decimals,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n decimals: number;\n}) {\n const handle = useNumberHandler(onChange);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral flex items-center gap-1\">\n Tip Fee\n <Tooltip\n content=\"Additional tip sent alongside the transaction (e.g. Jito tip).\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n size=\"sm\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </Tooltip>\n </div>\n <NumberInput\n fullWidth\n value={value === null ? undefined : value}\n onChange={handle}\n hideStepper\n minValue={0}\n formatOptions={{ maximumFractionDigits: decimals }}\n endContent={<span className=\"text-xs text-neutral\">{symbol}</span>}\n classNames={numberInputClassNames}\n aria-label=\"Tip Fee\"\n />\n </div>\n );\n}\n\n// -- Auto Fee --\n\nfunction AutoFeeRow({\n value,\n onChange,\n}: {\n value: boolean;\n onChange: (v: boolean) => void;\n}) {\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral flex items-center gap-1\">\n Auto Fee\n <Tooltip\n content=\"Automatically estimate optimal fee based on network conditions.\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n size=\"sm\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </Tooltip>\n </div>\n <div className=\"flex justify-end\">\n <Switch\n isSelected={value}\n onValueChange={onChange}\n color=\"primary\"\n size=\"sm\"\n aria-label=\"Auto Fee\"\n />\n </div>\n </div>\n );\n}\n\n// -- Max Auto Fee --\n\nfunction MaxAutoFeeRow({\n value,\n onChange,\n symbol,\n}: {\n value: number | null;\n onChange: (v: number | null) => void;\n symbol: string;\n}) {\n const handle = useNumberHandler(onChange);\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral\">Max Auto Fee</div>\n <NumberInput\n fullWidth\n value={value === null ? undefined : value}\n onChange={handle}\n hideStepper\n minValue={0}\n endContent={<span className=\"text-xs text-neutral\">{symbol}</span>}\n classNames={numberInputClassNames}\n aria-label=\"Max Auto Fee\"\n />\n </div>\n );\n}\n\n// -- Anti-MEV --\n\nconst ANTI_MEV_LABELS: Record<string, string> = {\n off: \"Off\",\n reduced: \"Reduced\",\n secure: \"Secure\",\n};\n\nfunction AntiMEVRow({\n value,\n onChange,\n options,\n}: {\n value: \"off\" | \"reduced\" | \"secure\";\n onChange: (v: \"off\" | \"reduced\" | \"secure\") => void;\n options: readonly (\"off\" | \"reduced\" | \"secure\")[];\n}) {\n return (\n <div className=\"w-full grid grid-cols-2 gap-2 items-center\">\n <div className=\"text-xs text-neutral flex items-center gap-1\">\n Anti-MEV\n <Tooltip\n content=\"MEV protection shields your transaction from sandwich attacks.\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n isIconOnly\n className=\"bg-transparent min-w-0 w-4 min-h-0 h-4 p-0\"\n size=\"sm\"\n disableRipple\n >\n <InfoIcon width={13} height={13} className=\"text-neutral\" />\n </Button>\n </Tooltip>\n </div>\n <div className=\"flex justify-end\">\n <Tabs\n variant=\"bordered\"\n color=\"primary\"\n size=\"sm\"\n disableAnimation\n radius=\"lg\"\n classNames={{\n tabList: \"border-border border-1 gap-0\",\n tab: \"min-h-0 h-5 px-2\",\n }}\n selectedKey={value}\n onSelectionChange={onChange as (key: Key) => void}\n aria-label=\"Anti-MEV\"\n >\n {options.map((opt) => (\n <Tab key={opt} title={ANTI_MEV_LABELS[opt] ?? opt} />\n ))}\n </Tabs>\n </div>\n </div>\n );\n}\n\n// -- Custom RPC --\n\nfunction CustomRPCRow({\n value,\n onChange,\n}: {\n value: string | null;\n onChange: (v: string | null) => void;\n}) {\n return (\n <div className=\"w-full flex gap-4 items-center\">\n <div className=\"flex-none text-xs text-neutral\">Custom RPC</div>\n <div className=\"flex-auto\">\n <Input\n fullWidth\n value={value ?? \"\"}\n onValueChange={(v) => onChange(v || null)}\n classNames={numberInputClassNames}\n placeholder=\"https://...\"\n aria-label=\"Custom RPC\"\n />\n </div>\n </div>\n );\n}\n","import { ChangeEvent, Key, useCallback, useMemo, useState } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n CheckIcon,\n cn,\n CoinsIcon,\n EditIcon,\n NumberInput,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n Tab,\n Tabs,\n Tooltip,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport { getChainPresetFeatures } from \"./chain-features\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { InstantTradeUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the instant trade form.\n *\n * Receives all data and callbacks via props — no API calls, no context access.\n * Consumers can replace this component while reusing `useInstantTradeScript`.\n */\nexport function InstantTradeUI({\n chain,\n direction,\n onDirectionChange,\n amount,\n onAmountChange,\n customAmounts,\n customPercentages,\n onQuickAmountClick,\n onQuickPercentageClick,\n onCustomAmountsEdit,\n onCustomPercentagesEdit,\n tokenSymbol,\n nativeSymbol,\n nativeDecimals,\n nativeBalance,\n tokenBalance,\n amountConversion,\n preset,\n onPresetChange,\n presetValues,\n onPresetSettingsChange,\n showSettings,\n onPresetClick,\n submitText,\n isDisabled,\n isLoading,\n onSubmit,\n className,\n headerExtra,\n}: InstantTradeUIProps) {\n return (\n <div\n className={cn(\"flex-none sm:px-3 py-3 bg-content1 rounded-lg\", className)}\n >\n {/* ── Direction tabs ──────────────────────────────────────────────── */}\n <Tabs\n fullWidth\n size=\"sm\"\n selectedKey={direction}\n onSelectionChange={onDirectionChange as (key: Key) => void}\n classNames={{\n tabList: \"bg-content2\",\n tab: \"data-[selected=true]:bg-content3 h-6\",\n }}\n disableAnimation\n >\n <Tab key=\"buy\" title=\"Buy\" />\n <Tab key=\"sell\" title=\"Sell\" />\n </Tabs>\n\n {/* ── Trade type + extra ──────────────────────────────────────────── */}\n <div className=\"mt-2.5 h-8 flex items-center justify-between\">\n <Tabs\n size=\"sm\"\n variant=\"underlined\"\n classNames={{ tabList: \"gap-0\", tab: \"px-1.5\" }}\n selectedKey=\"market\"\n disableAnimation\n >\n <Tab key=\"market\" title=\"Market\" />\n </Tabs>\n {headerExtra}\n </div>\n\n {/* ── Amount input ────────────────────────────────────────────────── */}\n <div className=\"mt-2.5\">\n {direction === \"buy\" ? (\n <BuyAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customAmounts={customAmounts}\n onQuickAmountClick={onQuickAmountClick}\n onCustomAmountsEdit={onCustomAmountsEdit}\n nativeSymbol={nativeSymbol}\n nativeDecimals={nativeDecimals}\n />\n ) : (\n <SellAmountSection\n amount={amount}\n onAmountChange={onAmountChange}\n customPercentages={customPercentages}\n onQuickPercentageClick={onQuickPercentageClick}\n onCustomPercentagesEdit={onCustomPercentagesEdit}\n tokenSymbol={tokenSymbol}\n />\n )}\n </div>\n\n {/* ── Balance & conversion ─────────────────────────────────────── */}\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"text-xs text-neutral space-x-1\">\n <span>Balance:</span>\n <span>\n {direction === \"buy\"\n ? nativeBalance\n ? `${nativeBalance} ${nativeSymbol ?? \"\"}`\n : \"--\"\n : tokenBalance\n ? `${tokenBalance} ${tokenSymbol ?? \"\"}`\n : \"--\"}\n </span>\n </div>\n {amountConversion && (\n <div className=\"text-xs text-neutral\">{amountConversion}</div>\n )}\n </div>\n\n {/* ── Preset overview ──────────────────────────────────────────── */}\n <div className=\"mt-4\">\n <PresetOverview values={presetValues} chain={chain} />\n </div>\n\n {/* ── Preset switcher ──────────────────────────────────────────── */}\n <div className=\"mt-2\">\n <Tabs\n variant=\"bordered\"\n size=\"sm\"\n fullWidth\n classNames={{\n tabList: \"border-content3 border-1 gap-0 p-0.5\",\n tab: \"min-h-0 h-6 px-2 py-1 text-xs data-[selected=true]:bg-content3\",\n tabContent: \"text-neutral\",\n }}\n selectedKey={`${preset}`}\n onSelectionChange={(key: Key) => onPresetChange(Number(key))}\n disableAnimation\n aria-label=\"Presets\"\n >\n <Tab key={0} title=\"Preset 1\" onClick={() => onPresetClick(0)} />\n <Tab key={1} title=\"Preset 2\" onClick={() => onPresetClick(1)} />\n <Tab key={2} title=\"Preset 3\" onClick={() => onPresetClick(2)} />\n </Tabs>\n </div>\n\n {/* ── Settings form (conditional) ──────────────────────────────── */}\n {showSettings && (\n <div className=\"mt-2.5\">\n <PresetFormUI\n value={presetValues}\n onChange={onPresetSettingsChange}\n chain={chain}\n nativeSymbol={nativeSymbol}\n nativeDecimals={nativeDecimals}\n />\n </div>\n )}\n\n {/* ── Submit ───────────────────────────────────────────────────── */}\n <Button\n fullWidth\n size=\"sm\"\n color={direction === \"buy\" ? \"primary\" : \"secondary\"}\n className=\"mt-2 rounded-lg\"\n disableRipple\n isDisabled={isDisabled}\n isLoading={isLoading}\n onPress={onSubmit}\n >\n {submitText}\n </Button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Buy amount section with quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction BuyAmountSection({\n amount,\n onAmountChange,\n customAmounts,\n onQuickAmountClick,\n onCustomAmountsEdit,\n nativeSymbol,\n nativeDecimals,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customAmounts: (number | null)[];\n onQuickAmountClick: (v: number) => void;\n onCustomAmountsEdit: (a: (number | null)[]) => void;\n nativeSymbol?: string;\n nativeDecimals?: number;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">Amount</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {nativeSymbol ?? \"\"}\n </span>\n }\n formatOptions={{\n maximumFractionDigits: nativeDecimals ?? 9,\n }}\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customAmounts}\n onSelect={onQuickAmountClick}\n onEdit={onCustomAmountsEdit}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sell amount section with percentage quick-input buttons\n// ---------------------------------------------------------------------------\n\nfunction SellAmountSection({\n amount,\n onAmountChange,\n customPercentages,\n onQuickPercentageClick,\n onCustomPercentagesEdit,\n tokenSymbol,\n}: {\n amount: number | undefined;\n onAmountChange: (v: number | undefined) => void;\n customPercentages: (number | null)[];\n onQuickPercentageClick: (pct: number) => void;\n onCustomPercentagesEdit: (p: (number | null)[]) => void;\n tokenSymbol?: string;\n}) {\n const handleChange = useCallback(\n (v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n onAmountChange(isNaN(v) ? undefined : v);\n }\n },\n [onAmountChange],\n );\n\n return (\n <div className=\"space-y-0.5\">\n <NumberInput\n min={0}\n value={amount}\n onChange={handleChange}\n fullWidth\n hideStepper\n startContent={\n <span className=\"flex-none text-xs text-neutral\">Amount</span>\n }\n endContent={\n <span className=\"flex-none text-xs text-neutral\">\n {tokenSymbol ?? \"\"}\n </span>\n }\n classNames={{\n inputWrapper: cn(\n \"h-8 min-h-0 py-0 rounded-lg rounded-b-none shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n ),\n input: \"text-xs\",\n }}\n />\n <QuickButtons\n values={customPercentages}\n onSelect={onQuickPercentageClick}\n onEdit={onCustomPercentagesEdit}\n suffix=\"%\"\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Reusable quick-input buttons (editable)\n// ---------------------------------------------------------------------------\n\nfunction QuickButtons({\n values,\n onSelect,\n onEdit,\n suffix,\n}: {\n values: (number | null)[];\n onSelect: (v: number) => void;\n onEdit: (v: (number | null)[]) => void;\n suffix?: string;\n}) {\n const [isEditing, setIsEditing] = useState(false);\n const [tempValues, setTempValues] = useState<(number | null)[]>([]);\n\n const handleStartEdit = useCallback(() => {\n setTempValues([...values]);\n setIsEditing(true);\n }, [values]);\n\n const handleSave = useCallback(() => {\n setIsEditing(false);\n onEdit(tempValues);\n }, [onEdit, tempValues]);\n\n return (\n <div className=\"flex gap-0.5\">\n <div className=\"flex-auto grid grid-cols-4 gap-0.5\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"h-6 bg-content2 flex items-center justify-center\",\n i === 0 && \"rounded-bl-lg\",\n )}\n >\n {isEditing ? (\n <NumberInput\n fullWidth\n value={\n tempValues[i] === null || tempValues[i] === undefined\n ? undefined\n : tempValues[i]\n }\n onChange={(v: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof v === \"number\") {\n const val = isNaN(v) ? null : v;\n setTempValues((prev) => {\n const next = [...prev];\n next[i] = val;\n return next;\n });\n }\n }}\n min={0}\n hideStepper\n classNames={{\n inputWrapper: cn(\n \"p-0 h-6 min-h-0 rounded-none flex shadow-none\",\n \"bg-content2 data-[hover=true]:bg-content3 group-data-[focus=true]:bg-content3\",\n i === 0 && \"rounded-bl-lg\",\n ),\n innerWrapper: \"pb-0\",\n input: \"text-xs text-center\",\n }}\n />\n ) : (\n <Button\n className=\"min-w-0 w-full min-h-0 h-full p-0 bg-transparent text-xs\"\n size=\"sm\"\n disableRipple\n onPress={() => values[i] != null && onSelect(values[i]!)}\n endContent={\n suffix ? (\n <span className=\"text-xs text-neutral\">{suffix}</span>\n ) : null\n }\n >\n {values[i] ?? \"\"}\n </Button>\n )}\n </div>\n ))}\n </div>\n <div className=\"flex-none bg-content2 rounded-br-lg overflow-hidden\">\n {isEditing ? (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleSave}\n >\n <CheckIcon width={12} height={12} />\n </Button>\n ) : (\n <Button\n size=\"sm\"\n isIconOnly\n className=\"bg-transparent h-6 min-h-6 p-0\"\n disableRipple\n onPress={handleStartEdit}\n >\n <EditIcon width={12} height={12} />\n </Button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset overview row (icons + values)\n// ---------------------------------------------------------------------------\n\nfunction PresetOverview({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: Chain;\n}) {\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n return (\n <div className=\"flex items-center gap-2\">\n <Tooltip\n content=\"Slippage\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<SlippageIcon width={14} height={14} />}\n >\n {formatPercent((values.slippage ?? 0) / 100)}\n </Button>\n </Tooltip>\n\n <Tooltip\n content={features.feeLabel}\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<ZapFastIcon width={14} height={14} />}\n >\n {formatPrice(values.priorityFee ?? 0)}\n </Button>\n </Tooltip>\n\n {features.showTipFee && (\n <Tooltip\n content=\"Tip Fee\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={<CoinsIcon width={14} height={14} />}\n >\n {formatPrice(values.tipFee ?? 0)}\n </Button>\n </Tooltip>\n )}\n\n <Tooltip\n content=\"Anti-MEV\"\n classNames={{ content: \"text-xs text-neutral py-2 px-4 max-w-xs\" }}\n >\n <Button\n size=\"sm\"\n className=\"bg-transparent p-0 h-5 min-h-0 w-auto min-w-0 gap-0.5 text-xs text-neutral\"\n disableRipple\n startContent={\n <>\n {(!values.antiMev || values.antiMev === \"off\") && (\n <ShieldOffIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n {values.antiMev === \"reduced\" && (\n <ShieldIcon width={14} height={14} className=\"text-neutral\" />\n )}\n {values.antiMev === \"secure\" && (\n <ShieldPlusIcon\n width={14}\n height={14}\n className=\"text-neutral\"\n />\n )}\n </>\n }\n >\n {(!values.antiMev || values.antiMev === \"off\") && \"Off\"}\n {values.antiMev === \"reduced\" && \"Reduced\"}\n {values.antiMev === \"secure\" && \"Secure\"}\n </Button>\n </Tooltip>\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { InstantTradeProvider } from \"./instant-trade.context\";\nimport { useInstantTradeScript } from \"./instant-trade.script\";\nimport { InstantTradeUI } from \"./instant-trade.ui\";\nimport type {\n InstantTradeWidgetProps,\n BuySettings,\n SellSettings,\n} from \"./types\";\n\n/**\n * Full instant-trade widget — thin orchestration layer.\n *\n * Wraps `InstantTradeProvider`, calls `useInstantTradeScript` to get all data,\n * and renders `InstantTradeUI` as the presentational layer.\n *\n * For custom UIs, use `useInstantTradeScript` directly inside an\n * `InstantTradeProvider` with your own presentation.\n */\nexport function InstantTradeWidget({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n settings,\n onSettingsChange,\n headerExtra,\n className,\n}: InstantTradeWidgetProps) {\n return (\n <InstantTradeProvider\n chain={chain}\n tokenAddress={tokenAddress}\n settings={settings}\n onSettingsChange={onSettingsChange}\n >\n <InstantTradeWidgetInner\n chain={chain}\n tokenAddress={tokenAddress}\n onSwapSubmitted={onSwapSubmitted}\n onSwapError={onSwapError}\n headerExtra={headerExtra}\n className={className}\n />\n </InstantTradeProvider>\n );\n}\n\nfunction InstantTradeWidgetInner({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n headerExtra,\n className,\n}: Omit<InstantTradeWidgetProps, \"settings\" | \"onSettingsChange\">) {\n const script = useInstantTradeScript({\n chain,\n tokenAddress,\n onSwapSubmitted,\n onSwapError,\n });\n\n // -- Quick amount click (buy: set amount directly, sell: compute from balance) --\n const handleQuickAmountClick = useCallback(\n (v: number) => script.setAmount(v),\n [script],\n );\n\n const handleQuickPercentageClick = useCallback(\n (pct: number) => {\n const bal = script.tokenBalance?.amount;\n if (!bal) return;\n const amount = new BigNumber(bal).times(pct).div(100).toNumber();\n script.setAmount(amount);\n },\n [script],\n );\n\n // -- Custom amounts/percentages editing --\n const handleCustomAmountsEdit = useCallback(\n (amounts: (number | null)[]) => {\n script.updateBuySettings({\n ...script.settings.buy,\n customAmounts: amounts,\n });\n },\n [script],\n );\n\n const handleCustomPercentagesEdit = useCallback(\n (pcts: (number | null)[]) => {\n script.updateSellSettings({\n ...script.settings.sell,\n customPercentages: pcts,\n });\n },\n [script],\n );\n\n // -- Preset settings change --\n const handlePresetSettingsChange = useCallback(\n (values: import(\"../../types\").TradePresetValues) => {\n const isBuy = script.direction === \"buy\";\n const idx = isBuy ? script.buyPreset : script.sellPreset;\n\n if (isBuy) {\n const prev = script.settings.buy;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateBuySettings({ ...prev, presets });\n } else {\n const prev = script.settings.sell;\n const presets = [...prev.presets];\n presets[idx] = values;\n script.updateSellSettings({ ...prev, presets });\n }\n },\n [script],\n );\n\n // -- Preset change (select preset index) --\n const handlePresetChange = useCallback(\n (p: number) => {\n if (script.direction === \"buy\") {\n script.setBuyPreset(p);\n } else {\n script.setSellPreset(p);\n }\n },\n [script],\n );\n\n const currentPreset =\n script.direction === \"buy\" ? script.buyPreset : script.sellPreset;\n\n return (\n <InstantTradeUI\n chain={chain}\n direction={script.direction}\n onDirectionChange={script.setDirection}\n amount={script.amount}\n onAmountChange={script.setAmount}\n customAmounts={script.settings.buy.customAmounts}\n customPercentages={script.settings.sell.customPercentages}\n onQuickAmountClick={handleQuickAmountClick}\n onQuickPercentageClick={handleQuickPercentageClick}\n onCustomAmountsEdit={handleCustomAmountsEdit}\n onCustomPercentagesEdit={handleCustomPercentagesEdit}\n tokenSymbol={script.tokenInfo?.symbol}\n nativeSymbol={script.nativeToken?.symbol}\n nativeDecimals={script.nativeToken?.decimals}\n nativeBalance={script.nativeBalance?.amount}\n tokenBalance={script.tokenBalance?.amount}\n amountConversion={undefined}\n preset={currentPreset}\n onPresetChange={handlePresetChange}\n presetValues={script.currentPresetValues}\n onPresetSettingsChange={handlePresetSettingsChange}\n showSettings={script.showSettings}\n onPresetClick={script.handlePresetClick}\n submitText={script.submitText}\n isDisabled={script.isDisabled}\n isLoading={script.isSwapping}\n onSubmit={script.swap}\n className={className}\n headerExtra={headerExtra}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { getNativeToken } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport { PresetFormUI } from \"./preset-form.ui\";\nimport type { PresetFormWidgetProps } from \"./types\";\n\n/**\n * Preset form widget — thin orchestration layer.\n *\n * Manages local state initialized from `value`, resolves chain-specific\n * native token info, and syncs changes upward via `onChange`.\n */\nexport function PresetFormWidget({\n value,\n onChange,\n chain,\n className,\n}: PresetFormWidgetProps) {\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n const stableOnChange = useCallbackRef(onChange);\n\n const [local, setLocal] = useState<TradePresetValues>(value);\n\n useEffect(() => {\n setLocal(value);\n }, [value]);\n\n const handleChange = useCallback(\n (next: TradePresetValues) => {\n setLocal(next);\n stableOnChange(next);\n },\n [stableOnChange],\n );\n\n return (\n <PresetFormUI\n value={local}\n onChange={handleChange}\n chain={chain}\n nativeSymbol={nativeToken?.symbol}\n nativeDecimals={nativeToken?.decimals}\n className={className}\n />\n );\n}\n","import { ChangeEvent, useCallback, useMemo } from \"react\";\nimport {\n Avatar,\n Button,\n cn,\n CoinsIcon,\n LightningIcon,\n NumberInput,\n ShieldIcon,\n ShieldOffIcon,\n ShieldPlusIcon,\n SlippageIcon,\n Tooltip,\n ZapFastIcon,\n} from \"@liberfi.io/ui\";\nimport { formatPercent, formatPrice } from \"@liberfi.io/utils\";\nimport type { TradePresetValues } from \"../../types\";\nimport {\n getChainPresetFeatures,\n getDefaultPresetForChain,\n} from \"./chain-features\";\nimport { useInstantTrade } from \"./instant-trade.context\";\nimport type { InstantTradeAmountInputProps } from \"./types\";\n\n/**\n * Compact amount input with preset selector buttons.\n *\n * Designed for inline/header usage (e.g. token detail page).\n * Must be rendered inside an {@link InstantTradeProvider}.\n */\nexport function InstantTradeAmountInput({\n amount,\n onAmountChange,\n preset = 0,\n onPresetChange,\n onPresetClick,\n variant = \"default\",\n radius = \"full\",\n size = \"sm\",\n fullWidth = false,\n className,\n}: InstantTradeAmountInputProps) {\n const { chain, nativeToken, settings } = useInstantTrade();\n const defaultPreset = useMemo(() => getDefaultPresetForChain(chain), [chain]);\n\n const handleAmountChange = useCallback(\n (value: number | ChangeEvent<HTMLInputElement>) => {\n if (typeof value === \"number\") {\n onAmountChange(isNaN(value) ? undefined : value);\n }\n },\n [onAmountChange],\n );\n\n const handlePresetPress = useCallback(\n (idx: number) => {\n if (preset === idx) {\n onPresetClick?.(idx);\n } else {\n onPresetChange?.(idx);\n }\n },\n [preset, onPresetChange, onPresetClick],\n );\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 overflow-hidden px-3\",\n radius === \"full\" && \"rounded-full\",\n radius === \"lg\" && \"rounded-lg\",\n radius === \"md\" && \"rounded-md\",\n radius === \"sm\" && \"rounded-sm\",\n variant === \"bordered\" && \"border-1 border-border\",\n variant === \"default\" && \"bg-content2\",\n className,\n )}\n >\n <div className={cn(fullWidth ? \"w-full\" : \"w-20\")}>\n <NumberInput\n fullWidth\n value={amount}\n onChange={handleAmountChange}\n hideStepper\n minValue={0}\n formatOptions={{\n maximumFractionDigits: nativeToken?.decimals ?? 9,\n }}\n startContent={\n <LightningIcon\n width={12}\n height={12}\n className=\"text-neutral flex-none\"\n />\n }\n endContent={\n nativeToken ? (\n <Avatar\n className=\"w-4 h-4 bg-transparent flex-none\"\n name={nativeToken.symbol}\n />\n ) : null\n }\n classNames={{\n inputWrapper: cn(\n \"bg-transparent data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"w-full min-w-0 min-h-0 p-0 rounded-none\",\n size === \"sm\" && \"h-6\",\n size === \"lg\" && \"h-8\",\n ),\n input: \"text-sm\",\n }}\n placeholder=\"0.0\"\n aria-label=\"Instant trade amount\"\n />\n </div>\n\n <div className=\"w-px bg-border h-4\" />\n\n <div className=\"flex items-center gap-1\">\n {Array.from({ length: 3 }).map((_, index) => (\n <Tooltip\n content={\n <PresetTooltip\n values={settings.buy.presets[index] ?? defaultPreset}\n chain={chain}\n />\n }\n key={index}\n placement=\"bottom\"\n >\n <Button\n className={cn(\n \"w-auto min-w-0 h-auto min-h-0 px-1 py-0.5 text-xs bg-transparent rounded\",\n {\n \"text-primary hover:bg-primary/20\": index === preset,\n \"text-neutral hover:bg-content3\": index !== preset,\n },\n )}\n disableRipple\n onPress={() => handlePresetPress(index)}\n >\n {`P${index + 1}`}\n </Button>\n </Tooltip>\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preset tooltip content\n// ---------------------------------------------------------------------------\n\nfunction PresetTooltip({\n values,\n chain,\n}: {\n values: TradePresetValues;\n chain: import(\"@liberfi.io/types\").Chain;\n}) {\n const features = useMemo(() => getChainPresetFeatures(chain), [chain]);\n\n return (\n <div className=\"px-1 py-0.5 flex flex-col gap-1.5 text-xs text-neutral\">\n <div className=\"w-full flex items-center justify-between gap-3\">\n <SlippageIcon width={14} height={14} />\n <span>{formatPercent((values.slippage ?? 0) / 100)}</span>\n </div>\n <div className=\"w-full flex items-center justify-between gap-3\">\n <ZapFastIcon width={14} height={14} />\n <span>\n {formatPrice(values.priorityFee ?? 0)} {features.feeUnit}\n </span>\n </div>\n {features.showTipFee && (\n <div className=\"w-full flex items-center justify-between gap-3\">\n <CoinsIcon width={14} height={14} />\n <span>\n {formatPrice(values.tipFee ?? 0)} {features.tipFeeUnit}\n </span>\n </div>\n )}\n <div className=\"w-full flex items-center justify-between gap-3\">\n {(!values.antiMev || values.antiMev === \"off\") && (\n <ShieldOffIcon width={14} height={14} />\n )}\n {values.antiMev === \"reduced\" && <ShieldIcon width={14} height={14} />}\n {values.antiMev === \"secure\" && (\n <ShieldPlusIcon width={14} height={14} />\n )}\n <span>\n {(!values.antiMev || values.antiMev === \"off\") && \"Off\"}\n {values.antiMev === \"reduced\" && \"Reduced\"}\n {values.antiMev === \"secure\" && \"Secure\"}\n </span>\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport BigNumber from \"bignumber.js\";\nimport { Button } from \"@liberfi.io/ui\";\nimport { getWrappedToken, getNativeToken } from \"@liberfi.io/utils\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { getDefaultPresetForChain } from \"./chain-features\";\nimport { useInstantTrade } from \"./instant-trade.context\";\nimport type { InstantTradeButtonProps } from \"./types\";\n\n/**\n * Trade execution button that reads state from {@link InstantTradeProvider}.\n *\n * Resolves wallet, token addresses, converts amounts, applies preset\n * settings, and calls `useSwap` from the SDK.\n */\nexport function InstantTradeButton({\n className,\n children,\n}: InstantTradeButtonProps) {\n const {\n chain,\n tokenAddress,\n nativeToken,\n direction,\n amount,\n setAmount,\n currentPresetValues,\n } = useInstantTrade();\n\n const wallets = useWallets();\n const wallet = wallets[0] ?? null;\n const wrappedToken = useMemo(() => getWrappedToken(chain), [chain]);\n\n const { swap, isSwapping } = useSwap();\n\n const isDisabled = !amount || !wallet || !tokenAddress;\n\n const handleSwap = useCallback(async () => {\n if (!amount || !wallet || !tokenAddress) return;\n\n const native = nativeToken ?? getNativeToken(chain);\n const nativeDecimals = native?.decimals ?? 9;\n const inputAddress = wrappedToken?.address ?? native?.address ?? \"\";\n\n const isBuy = direction === \"buy\";\n const from = isBuy ? inputAddress : tokenAddress;\n const to = isBuy ? tokenAddress : inputAddress;\n\n const amountInDecimals = new BigNumber(amount)\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString();\n\n const preset = currentPresetValues;\n const chainDefault = getDefaultPresetForChain(chain);\n const priorityFeeStr = new BigNumber(\n preset.priorityFee ?? chainDefault.priorityFee ?? 0,\n )\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString();\n\n const tipFeeStr = new BigNumber(preset.tipFee ?? chainDefault.tipFee ?? 0)\n .shiftedBy(nativeDecimals)\n .decimalPlaces(0)\n .toString();\n\n try {\n await swap({\n chain,\n wallet,\n input: from,\n output: to,\n amount: amountInDecimals,\n slippage: preset.slippage ?? chainDefault.slippage ?? 1,\n priorityFee: priorityFeeStr,\n tipFee: tipFeeStr,\n isAntiMev: preset.antiMev !== \"off\",\n });\n setAmount(undefined);\n } catch {\n /* swap errors are reported via useSwap onError callback */\n }\n }, [\n amount,\n wallet,\n tokenAddress,\n nativeToken,\n wrappedToken,\n chain,\n direction,\n currentPresetValues,\n swap,\n setAmount,\n ]);\n\n return (\n <Button\n fullWidth\n size=\"sm\"\n color={direction === \"buy\" ? \"primary\" : \"secondary\"}\n className={className}\n disableRipple\n isDisabled={isDisabled}\n isLoading={isSwapping}\n onPress={handleSwap}\n >\n {children ?? (direction === \"buy\" ? \"Buy\" : \"Sell\")}\n </Button>\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.4\";\n}\n\nexport default \"0.1.4\";\n"]}