access-layers-wallet 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -0
- package/dist/index.d.mts +168 -0
- package/dist/index.d.ts +168 -0
- package/dist/index.js +3392 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3346 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ConnectWalletHandler.tsx","../components/ui/dialog.tsx","../lib/utils.ts","../components/ui/button.tsx","../hooks/useSupraMultiWallet.ts","../lib/logger.ts","../lib/errors.ts","../lib/storage.ts","../lib/constants.ts","../lib/crypto.ts","../lib/config.ts","../src/hooks/useSupraMultiWallet.ts","../src/hooks/useConversionUtils.ts","../src/lib/abis/supra_account.ts","../src/lib/utils.ts","../src/lib/abiStorage.ts","../src/components/ui/button.tsx","../src/components/ui/dialog.tsx","../src/components/ui/sonner.tsx","../src/assets/walletIcons/index.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState, useCallback, useMemo } from 'react';\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog';\nimport { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { toast } from 'sonner';\nimport { Button } from '@/components/ui/button';\nimport { motion } from 'framer-motion';\nimport {\n Loader2,\n X,\n ExternalLink,\n} from 'lucide-react';\nimport { WalletType } from '@/hooks/useSupraMultiWallet';\nimport useSupraMultiWallet from '@/hooks/useSupraMultiWallet';\nimport { STORAGE_KEYS, CACHE_TTL, TIMEOUTS, WALLET_DOWNLOAD_URLS, CONNECTION_MESSAGES } from '@/lib/constants';\nimport { getStorageItem, setStorageItem } from '@/lib/storage';\nimport { logger } from '@/lib/logger';\nimport starkeyIcon from '../assets/walletIcons/Starkey.png';\nimport ribbitIcon from '../assets/walletIcons/Ribbit.jpg';\n\n// Re-export for backward compatibility\nexport const PROFILE_CACHE_KEY = STORAGE_KEYS.USER_PROFILE_CACHE;\nexport const PROFILE_CACHE_TIMESTAMP_KEY = STORAGE_KEYS.USER_PROFILE_CACHE_TIMESTAMP;\n\n// Types\nexport interface UserProfile {\n address: string;\n username: string | null;\n profileImage: string | null;\n}\n\ninterface ProfileCache {\n address: string;\n username: string | null;\n profileImage: string | null;\n}\n\nexport interface ConnectWalletHandlerProps {\n onConnect?: (account: string) => void;\n onDisconnect?: () => void;\n children: (props: {\n isConnected: boolean;\n accounts: string[];\n loading: boolean;\n balance: string;\n userProfile: UserProfile | null;\n handleConnect: () => void;\n handleDisconnect: () => void;\n }) => React.ReactNode;\n}\n\n// Wallet configuration\nconst WALLET_INFO = {\n starkey: {\n name: 'Starkey Wallet',\n icon: (\n <img\n src={starkeyIcon}\n alt=\"Starkey Wallet\"\n className=\"w-10 h-10 rounded-full\"\n />\n ),\n downloadUrl: WALLET_DOWNLOAD_URLS.starkey,\n },\n ribbit: {\n name: 'Ribbit Wallet',\n icon: (\n <img\n src={ribbitIcon}\n alt=\"Ribbit Wallet\"\n className=\"w-10 h-10 rounded-full\"\n />\n ),\n downloadUrl: WALLET_DOWNLOAD_URLS.ribbit,\n },\n} as const;\n\nexport const ConnectWalletHandler: React.FC<ConnectWalletHandlerProps> = ({\n onConnect,\n onDisconnect,\n children,\n}) => {\n // Core wallet hook\n const starKeyWalletHook = useSupraMultiWallet();\n const getAvailableWallets = starKeyWalletHook.getAvailableWallets;\n\n // State\n const [loading, setLoading] = useState<boolean>(false);\n const [showWalletModal, setShowWalletModal] = useState(false);\n const [userProfile, setUserProfile] = useState<UserProfile | null>(null);\n const [walletBalance, setWalletBalance] = useState<string>('0.00');\n const [availableWallets, setAvailableWallets] = useState<\n Array<{\n type: WalletType;\n name: string;\n isInstalled: boolean;\n capabilities: any;\n }>\n >([]);\n const [recentWallet, setRecentWallet] = useState<WalletType | null>(null);\n const [selectedWallet, setSelectedWallet] = useState<WalletType | null>(null);\n const [hoveredWallet, setHoveredWallet] = useState<WalletType | null>(null);\n const [connectionStage, setConnectionStage] = useState<\n 'idle' | 'connecting' | 'signing' | 'success' | 'error' | 'connected-not-signed'\n >('idle');\n const [connectionStageStartTime, setConnectionStageStartTime] = useState<number | null>(null);\n const [canClickOutside, setCanClickOutside] = useState(false);\n\n // Cache helper function\n const getProfileFromCache = useCallback((): ProfileCache | null => {\n try {\n if (typeof window === 'undefined') return null;\n\n const cachedData = getStorageItem(PROFILE_CACHE_KEY);\n const timestamp = getStorageItem(PROFILE_CACHE_TIMESTAMP_KEY);\n\n if (!cachedData || !timestamp) return null;\n\n const now = Date.now();\n const cacheTime = parseInt(timestamp);\n\n if (now - cacheTime > CACHE_TTL.PROFILE) {\n return null;\n }\n\n return JSON.parse(cachedData) as ProfileCache;\n } catch (error) {\n logger.error('Failed to read profile from cache', error as Error);\n return null;\n }\n }, []);\n\n // Balance update function\n const updateWalletBalance = useCallback(async () => {\n const provider = starKeyWalletHook.getCurrentProvider();\n if (!provider) return;\n\n try {\n await new Promise((resolve) => setTimeout(resolve, 1));\n\n switch (starKeyWalletHook.selectedWallet) {\n case 'starkey': {\n const balance = await provider.balance();\n if (balance && balance.formattedBalance) {\n setWalletBalance(balance.formattedBalance);\n }\n break;\n }\n case 'ribbit': {\n const walletBalanceRequest = {\n chainId: parseInt(process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID || '6'),\n resourceType: '0x1::supra_coin::SupraCoin',\n decimals: 8,\n };\n try {\n const balance = await provider.getWalletBalance(walletBalanceRequest);\n const balanceStr = balance.balance;\n logger.debug('Ribbit balance fetched', { balance: balanceStr });\n if (balanceStr) {\n setWalletBalance(balanceStr);\n }\n } catch (error) {\n logger.error('Failed to fetch Ribbit balance', error as Error);\n // Do not crash, just keep balance as is (0.00)\n }\n break;\n }\n }\n } catch (error) {\n logger.error('Failed to update wallet balance', error as Error);\n }\n }, [starKeyWalletHook.selectedWallet, starKeyWalletHook.getCurrentProvider]);\n\n // Connect wallet function\n const connectWallet = useCallback(async (walletType?: WalletType) => {\n if (walletType) {\n setLoading(true);\n setSelectedWallet(walletType);\n setConnectionStage('connecting');\n try {\n const success = await starKeyWalletHook.connectWallet(walletType);\n if (success) {\n setStorageItem(STORAGE_KEYS.RECENT_WALLET, walletType);\n setRecentWallet(walletType);\n if (starKeyWalletHook.accounts.length > 0) {\n onConnect?.(starKeyWalletHook.accounts[0]);\n }\n }\n } catch (error: any) {\n logger.error('Failed to connect wallet', error as Error, { walletType });\n toast.error(`Connection failed: ${error.message || 'Unknown error'}`);\n setConnectionStage('idle');\n } finally {\n setLoading(false);\n }\n } else {\n handleConnectClick();\n }\n }, [starKeyWalletHook, onConnect]);\n\n // Handle connect click\n const handleConnectClick = () => {\n const installedWallets = availableWallets.filter((w) => w.isInstalled);\n\n if (installedWallets.length === 0) {\n setShowWalletModal(true);\n } else if (installedWallets.length === 1) {\n setShowWalletModal(true);\n //connectWallet(installedWallets[0].type);\n } else {\n setShowWalletModal(true);\n }\n };\n\n // Disconnect wallet function\n const handleDisconnectWallet = useCallback(async () => {\n setLoading(true);\n try {\n await starKeyWalletHook.disconnectWallet();\n setUserProfile(null);\n setWalletBalance('0.00');\n onDisconnect?.();\n } catch (error) {\n logger.error('Failed to disconnect wallet', error as Error);\n } finally {\n setLoading(false);\n }\n }, [starKeyWalletHook, onDisconnect]);\n\n // Get connection stage info\n const getConnectionStageInfo = useCallback(() => {\n const wallet = selectedWallet ? WALLET_INFO[selectedWallet] : null;\n\n switch (connectionStage) {\n case 'connecting':\n return {\n title: `Waiting for ${wallet?.name || 'Wallet'}`,\n subtitle: CONNECTION_MESSAGES.CONNECTING,\n buttonText: 'Connecting',\n };\n case 'signing':\n return {\n title: 'Sign to verify',\n subtitle: CONNECTION_MESSAGES.SIGNING,\n buttonText: 'Signing',\n };\n case 'success':\n return {\n title: `Connected to ${wallet?.name.replace(' Wallet', '') || 'Wallet'}`,\n subtitle: CONNECTION_MESSAGES.SUCCESS,\n buttonText: 'Connected',\n };\n case 'error':\n return {\n title: 'Error',\n subtitle: CONNECTION_MESSAGES.ERROR,\n buttonText: 'Close',\n };\n\n case 'connected-not-signed':\n return {\n title: `Connected to ${wallet?.name.replace(' Wallet', '') || 'Wallet'}`,\n subtitle: CONNECTION_MESSAGES.CONNECTED_NOT_SIGNED,\n buttonText: 'Connected',\n };\n default:\n return null;\n }\n }, [connectionStage, selectedWallet]);\n\n // Load recent wallet on mount\n useEffect(() => {\n const recent = getStorageItem(STORAGE_KEYS.RECENT_WALLET) as WalletType;\n if (recent && ['starkey', 'ribbit'].includes(recent)) {\n setRecentWallet(recent);\n }\n }, []);\n\n // Check available wallets - optimized with debouncing\n useEffect(() => {\n const checkWallets = () => {\n const wallets = getAvailableWallets();\n setAvailableWallets(wallets);\n };\n\n checkWallets();\n const interval = setInterval(checkWallets, TIMEOUTS.WALLET_CHECK_INTERVAL);\n const timeout = setTimeout(() => clearInterval(interval), TIMEOUTS.WALLET_CHECK_MAX_DURATION);\n\n return () => {\n clearInterval(interval);\n clearTimeout(timeout);\n };\n }, [getAvailableWallets]);\n\n // Update balance when wallet connects\n useEffect(() => {\n if (starKeyWalletHook.accounts.length > 0) {\n updateWalletBalance();\n }\n }, [starKeyWalletHook.accounts, starKeyWalletHook.selectedWallet]);\n\n // Listen for wallet events\n useEffect(() => {\n const handlePresignedState = () => { setConnectionStage(() => 'signing'); };\n const handlePostsignedState = () => {\n setConnectionStage('success');\n setTimeout(() => {\n setConnectionStage('idle');\n setShowWalletModal(false);\n updateWalletBalance();\n }, TIMEOUTS.MODAL_CLOSE_DELAY);\n };\n const handleWalletError = () => {\n if (connectionStage == \"signing\") {\n setConnectionStage(() => 'connected-not-signed');\n } else {\n setConnectionStage(() => 'error');\n }\n\n setTimeout(() => {\n setShowWalletModal(false);\n setSelectedWallet(null);\n setConnectionStage('idle');\n setLoading(false);\n }, TIMEOUTS.MODAL_CLOSE_DELAY);\n };\n\n const handleStarkeyEvents = (event: any) => {\n if (event?.data?.name?.startsWith('starkey-')) {\n switch (event?.data?.name) {\n case 'starkey-wallet-updated':\n case 'starkey-wallet-connected':\n setTimeout(updateWalletBalance, 1);\n break;\n case 'starkey-wallet-disconnected':\n setWalletBalance('0.00');\n break;\n }\n }\n };\n\n window.addEventListener('presigned-state', handlePresignedState);\n window.addEventListener('postsigned-state', handlePostsignedState);\n window.addEventListener('wallet-error', handleWalletError);\n window.addEventListener('message', handleStarkeyEvents);\n\n return () => {\n window.removeEventListener('presigned-state', handlePresignedState);\n window.removeEventListener('postsigned-state', handlePostsignedState);\n window.removeEventListener('wallet-error', handleWalletError);\n window.removeEventListener('message', handleStarkeyEvents);\n };\n }, [connectionStage]);\n\n // Listen for profile updates\n useEffect(() => {\n const handleProfileUpdated = (event: CustomEvent<UserProfile>) => {\n const { address, username, profileImage } = event.detail;\n if (starKeyWalletHook.accounts[0] === address) {\n setUserProfile({ address, username, profileImage });\n }\n };\n\n window.addEventListener('profile-updated', handleProfileUpdated as EventListener);\n return () => {\n window.removeEventListener('profile-updated', handleProfileUpdated as EventListener);\n };\n }, [starKeyWalletHook.accounts]);\n\n // Periodic balance refresh - optimized with smart polling\n useEffect(() => {\n if (starKeyWalletHook.accounts.length > 0) {\n // Only poll when tab is active\n const handleVisibilityChange = () => {\n if (!document.hidden) {\n updateWalletBalance();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n const balanceInterval = setInterval(() => {\n if (!document.hidden) {\n updateWalletBalance();\n }\n }, TIMEOUTS.BALANCE_POLL_INTERVAL);\n\n return () => {\n clearInterval(balanceInterval);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }\n }, [starKeyWalletHook.accounts, updateWalletBalance]);\n\n // Track connection stage timing\n useEffect(() => {\n if (connectionStage === 'connecting' || connectionStage === 'signing') {\n setConnectionStageStartTime(Date.now());\n setCanClickOutside(false);\n\n const timer = setTimeout(() => {\n setCanClickOutside(true);\n }, TIMEOUTS.CLICK_OUTSIDE_DELAY);\n\n return () => clearTimeout(timer);\n } else {\n setConnectionStageStartTime(null);\n setCanClickOutside(false);\n }\n }, [connectionStage]);\n\n // Handle modal close with loading state check\n const handleModalClose = useCallback((open: boolean) => {\n if (!open) {\n // Allow closing if:\n // 1. Connection stage is idle or success\n // 2. User has been in loading state for > 2s and can click outside\n if (\n connectionStage === 'idle' ||\n connectionStage === 'success' ||\n connectionStage === 'connected-not-signed' ||\n connectionStage === 'error' ||\n (canClickOutside && (connectionStage === 'connecting' || connectionStage === 'signing'))\n ) {\n setShowWalletModal(false);\n setSelectedWallet(null);\n setLoading(false);\n setCanClickOutside(false);\n setConnectionStageStartTime(null);\n setTimeout(() => {\n setConnectionStage('idle');\n }, 100);\n }\n }\n }, [connectionStage, canClickOutside]);\n\n return (\n <>\n {children({\n isConnected: starKeyWalletHook.accounts.length > 0,\n accounts: starKeyWalletHook.accounts,\n loading: loading || starKeyWalletHook.loading,\n balance: walletBalance,\n userProfile,\n handleConnect: handleConnectClick,\n handleDisconnect: handleDisconnectWallet,\n })}\n\n {/* Wallet Selection Modal */}\n <Dialog\n open={showWalletModal}\n onOpenChange={handleModalClose}\n >\n <VisuallyHidden asChild><DialogTitle>Select a wallet</DialogTitle></VisuallyHidden>\n <VisuallyHidden asChild><DialogDescription>Select a wallet to connect to MyDApp</DialogDescription></VisuallyHidden>\n <DialogContent\n className=\"z-[100] px-4 py-6 w-[90%] mx-auto max-w-sm bg-gradient-to-br from-brand-dark via-gray-900 to-brand-dark border border-brand-dark sm:rounded-3xl rounded-3xl\"\n >\n\n\n {/* Add visual indicator when clickable */}\n {canClickOutside && (connectionStage === 'connecting' || connectionStage === 'signing') && (\n <div className=\"absolute top-4 right-4\">\n <X className=\"h-5 w-5\" />\n </div>\n )}\n\n <div className=\"\">\n {connectionStage === 'idle' ? (\n <>\n <p className=\"text-center text-sm text-brand-light/75 mb-6 text-white\">\n Select Wallet\n </p>\n\n <div className=\"space-y-3\">\n {availableWallets.map((wallet) => {\n return (\n <div key={wallet.type} className=\"w-full relative\">\n <motion.button\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.05, ease: 'easeInOut' }}\n onClick={() => {\n wallet.isInstalled\n ? connectWallet(wallet.type)\n : window.open(WALLET_INFO[wallet.type].downloadUrl, '_blank');\n }}\n type=\"button\"\n disabled={loading && wallet.isInstalled}\n onMouseEnter={() => setHoveredWallet(wallet.type)}\n onMouseLeave={() => setHoveredWallet(null)}\n className=\"w-full px-4 py-2 rounded-2xl border border-gray-950/60 hover:border-gray-800/80 bg-gray-950/20 hover:bg-gray-900/40 transition-all duration-300 flex items-center gap-4 group\"\n >\n <div className=\"flex-shrink-0\">\n {WALLET_INFO[wallet.type].icon}\n </div>\n\n <div className=\"flex-1 text-left\">\n <h3 className=\"font-medium text-white\">\n {WALLET_INFO[wallet.type].name}\n </h3>\n {!wallet.isInstalled && (\n <p className=\"text-sm text-gray-400\">\n Not installed - Click to download\n </p>\n )}\n </div>\n\n <div className=\"flex-shrink-0\">\n {recentWallet === wallet.type && wallet.isInstalled ? (\n <span className=\"bg-gray-800/60 text-gray-300 text-xs px-3 py-1 rounded-full border border-gray-700/40\">\n Recent\n </span>\n ) : wallet.isInstalled ? (\n loading && wallet.type === selectedWallet ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-gray-400\" />\n ) : (\n hoveredWallet === wallet.type && (\n <span className=\"text-gray-400 text-sm font-medium\">\n Connect\n </span>\n )\n )\n ) : (\n <ExternalLink className=\"h-4 w-4 text-gray-500\" />\n )}\n </div>\n </motion.button>\n </div>\n );\n })}\n </div>\n\n\n </>\n ) : (\n <div className=\"w-full text-center py-8\">\n {(() => {\n const stageInfo = getConnectionStageInfo();\n const wallet = selectedWallet ? WALLET_INFO[selectedWallet] : null;\n\n return (\n <>\n <div className=\"relative flex justify-center mb-6\">\n {connectionStage === 'success' || connectionStage === 'connected-not-signed' ? (\n <div className=\"w-20 h-20 rounded-full border-4 border-green-500 flex items-center justify-center\">\n {wallet && (\n <div className=\"w-12 h-12 flex items-center justify-center\">\n {wallet.icon}\n </div>\n )}\n </div>\n ) : connectionStage === 'error' ? (\n <div className=\"w-20 h-20 rounded-full border-4 border-red-500 flex items-center justify-center\">\n {wallet && (\n <div className=\"w-12 h-12 flex items-center justify-center\">\n {wallet.icon}\n </div>\n )}\n </div>\n ) : (\n <div className=\"relative\">\n <div className=\"w-20 h-20 rounded-full border-4 border-gray-600 border-t-gray-400 animate-spin\"></div>\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {wallet && (\n <div className=\"w-12 h-12 flex items-center justify-center\">\n {wallet.icon}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n <h3 className=\"text-lg font-semibold text-white mb-2\">\n {stageInfo?.title}\n </h3>\n\n <p className=\"text-sm text-gray-400 mb-6\">\n {stageInfo?.subtitle}\n </p>\n\n <Button\n disabled\n className=\"w-full bg-gray-700 text-gray-400 cursor-not-allowed rounded-2xl py-3\"\n >\n {stageInfo?.buttonText}\n </Button>\n </>\n );\n })()}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n};\n\nexport default ConnectWalletHandler;","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPortal>\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n </DialogPortal>\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function standardizeAddress(address: string) {\n let cleanAddress = address.replace(/^0x/, \"\");\n if (cleanAddress.length < 64) {\n cleanAddress = cleanAddress.padStart(64, \"0\");\n }\n if (cleanAddress.length > 64) {\n throw new Error(`Address ${address} is not a valid address`);\n }\n return `0x${cleanAddress}`;\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport nacl from 'tweetnacl';\nimport { useRouter } from 'next/navigation';\nimport { toast } from 'sonner';\n\n// Import types from ribbit-connect package\nimport {\n type DappMetadata,\n type WalletBalanceRequest,\n type RawTransactionResponse,\n type SignMessageResponse,\n type RawTxnRequest,\n SupraChainId,\n BCS,\n type WalletInfo,\n initSdk,\n type RibbitWalletSDK,\n} from 'ribbit-wallet-connect';\n\n// Import utilities\nimport { logger } from '@/lib/logger';\nimport { \n WalletConnectionError, \n TransactionError, \n SignMessageError,\n WalletNotInstalledError,\n NetworkError \n} from '@/lib/errors';\nimport { \n setStorageItem, \n getStorageItem, \n removeStorageItem \n} from '@/lib/storage';\nimport { STORAGE_KEYS, TIMEOUTS, ERROR_MESSAGES, DEFAULT_CHAIN_IDS } from '@/lib/constants';\nimport { generateNonce } from '@/lib/crypto';\nimport { getRpcUrl, getChainId } from '@/lib/config';\n\n// Define wallet types\nexport type WalletType = 'starkey' | 'ribbit';\n\n// Define wallet capabilities interface\nexport interface WalletCapabilities {\n signMessage: boolean;\n accountSwitching: boolean;\n networkSwitching: boolean;\n rawTransactions: boolean;\n eventListeners: boolean;\n tokenRevalidation: boolean;\n}\n\n// Wallet configuration\nconst WALLET_CONFIGS = {\n starkey: {\n capabilities: {\n signMessage: true,\n accountSwitching: true,\n networkSwitching: true,\n rawTransactions: true,\n eventListeners: true,\n tokenRevalidation: true,\n },\n provider: () =>\n typeof window !== 'undefined' && (window as any)?.starkey?.supra,\n },\n ribbit: {\n capabilities: {\n signMessage: true,\n accountSwitching: false, // Ribbit doesn't support account switching\n networkSwitching: false, // Ribbit network switching happens in-app\n rawTransactions: true,\n eventListeners: false,\n tokenRevalidation: false, // Ribbit doesn't support token revalidation\n },\n provider: () => initSdk(),\n },\n} as const;\n\n// Wallet events for communication with the parent window\nexport const WALLET_EVENTS = {\n CONNECTED: 'wallet-connected',\n PRESIGNED_STATE: 'presigned-state',\n POSTSIGNED_STATE: 'postsigned-state',\n ERROR: 'wallet-error',\n} as const;\n\n// Storage utility functions\nconst setStoredWalletType = (walletType: WalletType): void => {\n setStorageItem(STORAGE_KEYS.SELECTED_WALLET, walletType);\n};\n\nconst getStoredWalletType = (): WalletType => {\n const stored = getStorageItem(STORAGE_KEYS.SELECTED_WALLET) as WalletType;\n if (stored && ['starkey', 'ribbit'].includes(stored)) {\n return stored;\n }\n return 'starkey'; // Default fallback\n};\n\nconst clearStoredWalletType = (): void => {\n removeStorageItem(STORAGE_KEYS.SELECTED_WALLET);\n};\n\nconst useSupraMultiWallet = () => {\n const router = useRouter();\n\n // Initialize wallet selection from storage\n // Initialize wallet selection from storage\n const [selectedWallet, setSelectedWallet] = useState<WalletType>('starkey');\n const [walletCapabilities, setWalletCapabilities] = useState<WalletCapabilities>(\n WALLET_CONFIGS['starkey'].capabilities\n );\n\n // Sync with storage on mount to prevent hydration mismatch\n useEffect(() => {\n const stored = getStoredWalletType();\n if (stored !== 'starkey') {\n setSelectedWallet(stored);\n setWalletCapabilities(WALLET_CONFIGS[stored].capabilities);\n }\n }, []);\n\n // Provider states (keep separate for compatibility)\n const [supraProvider, setSupraProvider] = useState<any>(\n WALLET_CONFIGS.starkey.provider()\n );\n const [ribbitProvider, setRibbitProvider] = useState<RibbitWalletSDK | null>(\n WALLET_CONFIGS.ribbit.provider()\n );\n\n // Existing states\n const [isExtensionInstalled, setIsExtensionInstalled] =\n useState<boolean>(false);\n const [accounts, setAccounts] = useState<string[]>([]);\n const [networkData, setNetworkData] = useState<any>();\n const [balance, setBalance] = useState<string>('');\n const [loading, setLoading] = useState<boolean>(false);\n const [justRequestedRelative, setJustRequestedRelative] =\n useState<boolean>(false);\n const [transactions, setTransactions] = useState<{ hash: string }[]>([]);\n const [selectedChainId, setSelectedChainId] = useState<string>('');\n\n const addTransactions = (hash: string) => {\n setTransactions((prev) => [{ hash }, ...prev]);\n };\n\n // Get current wallet provider\n const getCurrentProvider = () => {\n switch (selectedWallet) {\n case 'starkey': {\n return supraProvider;\n }\n case 'ribbit': {\n return ribbitProvider;\n }\n default: {\n return supraProvider;\n }\n }\n };\n\n // Check if extension is installed - memoized to prevent infinite loops\n const checkExtensionInstalled = useCallback(async () => {\n switch (selectedWallet) {\n case 'starkey': {\n const provider = WALLET_CONFIGS.starkey.provider();\n setSupraProvider(provider);\n setIsExtensionInstalled(!!provider);\n return !!provider;\n }\n case 'ribbit': {\n const provider = WALLET_CONFIGS.ribbit.provider();\n if (!provider) {\n setRibbitProvider(null);\n setIsExtensionInstalled(false);\n return false;\n }\n\n try {\n setRibbitProvider(provider);\n setIsExtensionInstalled(true);\n return true;\n } catch (error) {\n logger.error('Error checking Ribbit wallet readiness', error as Error);\n setRibbitProvider(null);\n setIsExtensionInstalled(false);\n return false;\n }\n }\n default: {\n return false;\n }\n }\n }, [selectedWallet]);\n\n const updateAccounts = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const responseAcc = await provider.account();\n const newAccounts = responseAcc.length > 0 ? responseAcc : [];\n setAccounts(newAccounts);\n if (responseAcc.length > 0) {\n setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);\n }\n // Update balance and network data after accounts are set\n if (newAccounts.length > 0) {\n const balance = await provider.balance();\n if (balance) {\n setBalance(`${balance.formattedBalance} ${balance.displayUnit}`);\n }\n const networkData = await provider.getChainId();\n setNetworkData(networkData || {});\n }\n break;\n }\n case 'ribbit': {\n // Connect to wallet and get current walletAddress. Currently it will return only supra address(string). In future it will return other chain address as well or may be an array of addresses with their chain types({walletAddress: string; chain: string;}).\n const wallet = provider.getWalletInfo();\n if (wallet?.connected) {\n setAccounts([wallet.walletAddress]);\n const walletBalanceRequest: WalletBalanceRequest = {\n chainId: parseInt(getChainId()),\n resourceType: '0x1::supra_coin::SupraCoin',\n decimals: 8,\n };\n const balanceStr = await provider.getWalletBalance(walletBalanceRequest);\n logger.debug('Ribbit balance response', { balance: balanceStr });\n setBalance(`${balanceStr?.balance || 0} SUPRA`);\n } else {\n setAccounts([]);\n }\n break;\n }\n default: {\n setAccounts([]);\n break;\n }\n }\n } catch (error) {\n logger.error('Failed to update accounts', error as Error, { walletType: selectedWallet });\n setAccounts([]);\n switch (selectedWallet) {\n case 'starkey': {\n removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);\n break;\n }\n case 'ribbit': {\n // Reset ribbit session\n break;\n }\n }\n }\n }, [selectedWallet]);\n\n // Initial provider setup - only run when selectedWallet changes\n useEffect(() => {\n let mounted = true;\n \n const initProvider = async () => {\n const isInstalled = await checkExtensionInstalled();\n if (mounted && isInstalled) {\n updateAccounts();\n }\n };\n \n initProvider();\n \n return () => {\n mounted = false;\n };\n }, [selectedWallet, checkExtensionInstalled, updateAccounts]);\n\n // Extension detection effect - optimized with reduced timeout\n useEffect(() => {\n const checkExtension = async () => {\n return await checkExtensionInstalled();\n };\n\n // Initial check\n checkExtension().then((isInstalled) => {\n if (isInstalled && selectedWallet === 'ribbit') {\n updateAccounts();\n }\n });\n\n // For non-ribbit wallets or if ribbit is not ready, keep polling\n const intv = setInterval(async () => {\n const isInstalled = await checkExtension();\n if (isInstalled) {\n clearInterval(intv);\n if (selectedWallet === 'ribbit') {\n updateAccounts();\n }\n }\n }, 1000);\n\n setTimeout(() => {\n clearInterval(intv);\n }, TIMEOUTS.WALLET_DETECTION_POLL);\n\n return () => clearInterval(intv);\n }, [selectedWallet, updateAccounts, checkExtensionInstalled]);\n\n const checkIsExtensionInstalled = useCallback(() => {\n const intervalId = setInterval(async () => {\n const isInstalled = await checkExtensionInstalled();\n if (isInstalled) {\n clearInterval(intervalId);\n updateAccounts();\n }\n }, 500);\n\n setTimeout(() => clearInterval(intervalId), TIMEOUTS.WALLET_DETECTION_POLL);\n }, [updateAccounts, checkExtensionInstalled]);\n\n const updateBalance = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider || !accounts.length) {\n setBalance('');\n return;\n }\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const balance = await provider.balance();\n if (balance) {\n setBalance(`${balance.formattedBalance} ${balance.displayUnit}`);\n }\n break;\n }\n case 'ribbit': {\n const walletBalanceRequest: WalletBalanceRequest = {\n chainId: parseInt(getChainId()),\n resourceType: '0x1::supra_coin::SupraCoin',\n decimals: 8,\n };\n const balanceStr = await provider.getWalletBalance(\n walletBalanceRequest\n );\n logger.debug('Ribbit balance response', { balance: balanceStr });\n setBalance(`${balanceStr?.balance || 0} SUPRA`);\n break;\n }\n default: {\n setBalance('');\n break;\n }\n }\n } catch (error) {\n logger.error('Failed to update balance', error as Error, { walletType: selectedWallet });\n setBalance('');\n }\n }, [selectedWallet, accounts]);\n\n const getNetworkData = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider) return {};\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const data = await provider.getChainId();\n setNetworkData(data || {});\n return data || {};\n }\n case 'ribbit': {\n // Ribbit doesn't have network switching, assume current chain\n const chainId = parseInt(getChainId());\n const mockNetworkData = { chainId: chainId.toString() };\n setNetworkData(mockNetworkData);\n return mockNetworkData;\n }\n default: {\n setNetworkData({});\n return {};\n }\n }\n } catch (error) {\n logger.error('Failed to get network data', error as Error, { walletType: selectedWallet });\n setNetworkData({});\n return {};\n }\n }, [selectedWallet]);\n\n const connectWallet = async (walletType?: WalletType) => {\n // Update wallet selection if provided\n if (walletType) {\n updateSelectedWallet(walletType);\n }\n\n const provider = walletType\n ? WALLET_CONFIGS[walletType].provider()\n : getCurrentProvider();\n\n if (!provider) {\n const error = new WalletNotInstalledError(walletType || selectedWallet);\n logger.warn('Wallet not installed', { walletType: walletType || selectedWallet });\n toast.error(ERROR_MESSAGES.WALLET_NOT_INSTALLED, {\n description: `Please install the ${walletType || selectedWallet} extension`,\n });\n return false;\n }\n\n setLoading(true);\n\n try {\n switch (walletType || selectedWallet) {\n case 'starkey': {\n await provider.connect();\n logger.info('Starkey wallet connection approved');\n await updateAccounts();\n const responseAcc = await provider.account();\n\n if (responseAcc.length === 0) {\n throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);\n }\n\n if (responseAcc.length) {\n setAccounts(responseAcc); // Explicitly update state immediately\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n\n // Dispatch connection event\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n wallet: 'starkey',\n },\n })\n );\n\n // Signature Verification\n try {\n const message = \"To verify your account, please sign this message.\";\n const nonce = generateNonce(); // Use secure nonce generation\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n logger.debug('Signature request initiated', { account: responseAcc[0] });\n const signatureResponse = await provider.signMessage({\n message: hexMessage,\n nonce,\n });\n\n if (signatureResponse) {\n logger.info('Signature approved', { account: responseAcc[0] });\n // Trigger success state only after signing\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n }\n } catch (signError) {\n const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError as Error);\n logger.error('Signing failed', error, { account: responseAcc[0] });\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: error,\n },\n })\n );\n throw error; // Stop execution\n }\n }\n break;\n }\n case 'ribbit': {\n\n const dappMetadata: DappMetadata = {\n name: 'multiwallet',\n description: 'NFT Marketplace and Lootbox Platform',\n logo: window.location.origin + '/favicon.ico',\n url: window.location.origin,\n };\n\n const response: WalletInfo = await provider.connectToWallet(\n dappMetadata\n );\n\n if (response?.connected) {\n logger.info('Ribbit wallet connection approved');\n }\n\n if (response.walletAddress == null) {\n throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);\n }\n\n if (response?.connected) {\n await updateAccounts();\n\n if (response.walletAddress) {\n setAccounts([response.walletAddress]); // Explicitly update state immediately\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n },\n })\n );\n\n // Dispatch connection event\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n wallet: 'ribbit',\n },\n })\n );\n\n // Signature Verification\n try {\n const message = \"To verify your account, please sign this message.\";\n const nonce = generateNonce(); // Use secure nonce generation\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n logger.debug('Signature request initiated', { account: response.walletAddress });\n const signatureResponse = await provider.signMessage({\n message: hexMessage,\n nonce: parseInt(nonce),\n chainId: parseInt(getChainId()),\n });\n\n if (signatureResponse && signatureResponse.approved) {\n logger.info('Signature approved', { account: response.walletAddress });\n // Trigger success state only after signing\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n },\n })\n );\n } else {\n throw new SignMessageError(signatureResponse.error || ERROR_MESSAGES.SIGNING_REJECTED);\n }\n } catch (signError) {\n const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError as Error);\n logger.error('Signing failed', error, { account: response.walletAddress });\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: error,\n },\n })\n );\n throw error;\n }\n }\n } else {\n throw new WalletConnectionError(ERROR_MESSAGES.CONNECTION_REJECTED);\n }\n break;\n }\n default: {\n throw new WalletConnectionError(\n `${ERROR_MESSAGES.UNSUPPORTED_WALLET}: ${walletType || selectedWallet}`\n );\n }\n }\n\n return true;\n } catch (error) {\n const walletError = error instanceof WalletConnectionError \n ? error \n : new WalletConnectionError(ERROR_MESSAGES.CONNECTION_FAILED, error as Error);\n \n logger.error('Wallet connection failed', walletError, { \n walletType: walletType || selectedWallet \n });\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: walletError,\n },\n })\n );\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n const disconnectWallet = async () => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n await provider.disconnect();\n break;\n }\n case 'ribbit': {\n await provider.disconnect();\n // any further clean up required do that.\n break;\n }\n }\n\n resetWalletData();\n // Clear wallet selection on disconnect\n clearStoredWalletType();\n router.push('/');\n } catch (error) {\n logger.error('Wallet disconnect failed', error as Error, { walletType: selectedWallet });\n resetWalletData();\n // Clear wallet selection on error too\n clearStoredWalletType();\n }\n };\n\n const resetWalletData = () => {\n setAccounts([]);\n setBalance('');\n setNetworkData({});\n\n switch (selectedWallet) {\n case 'starkey': {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);\n break;\n }\n case 'ribbit': {\n // Any required clean up\n break;\n }\n }\n };\n\n // Example function for fetching sequence number. To be used in sendTransaction.\n const getSequenceNumber = async (address: string): Promise<number> => {\n const rpcUrl = getRpcUrl();\n const data = await fetch(`${rpcUrl}/rpc/v1/accounts/${address}`);\n if (!data.ok) {\n throw new NetworkError(`Failed to fetch sequence number for ${address}`);\n }\n const accountData = await data.json();\n return accountData.sequence_number;\n };\n\n const sendRawTransaction = async (\n moduleAddress?: string,\n moduleName?: string,\n functionName?: string,\n params?: any[],\n runTimeParams: any[] = [],\n txExpiryTime: number = Math.ceil(Date.now() / 1000) + 3000\n ) => {\n const provider = getCurrentProvider();\n if (\n !provider ||\n !accounts.length ||\n !moduleAddress ||\n !moduleName ||\n !functionName\n )\n return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n if (!walletCapabilities.rawTransactions) {\n throw new TransactionError('Raw transactions not supported by current wallet');\n }\n\n let networkData = await getNetworkData();\n const currentChainId = getChainId();\n if (networkData.chainId !== currentChainId) {\n setSelectedChainId(currentChainId);\n await provider.changeNetwork({\n chainId: currentChainId,\n });\n }\n\n const rawTxPayload = [\n accounts[0],\n 0, // sequence number\n moduleAddress,\n moduleName,\n functionName,\n runTimeParams,\n params,\n {},\n ];\n\n const data = await provider.createRawTransactionData(rawTxPayload);\n const txHash = await provider.sendTransaction({\n data,\n from: accounts[0],\n to: moduleAddress,\n chainId: currentChainId,\n value: '',\n });\n\n addTransactions(txHash || 'failed');\n logger.info('Transaction sent successfully', { txHash, walletType: 'starkey' });\n return txHash;\n }\n case 'ribbit': {\n if (!walletCapabilities.rawTransactions) {\n throw new TransactionError('Raw transactions not supported by current wallet');\n }\n\n const currentChainId = getChainId();\n let chainId = SupraChainId.TESTNET;\n\n if (currentChainId === DEFAULT_CHAIN_IDS.TESTNET) {\n chainId = SupraChainId.TESTNET;\n } else if (currentChainId === DEFAULT_CHAIN_IDS.MAINNET) {\n chainId = SupraChainId.MAINNET;\n }\n\n const rawTxnRequest: RawTxnRequest = {\n sender: accounts[0], // Use actual sender address\n moduleAddress: moduleAddress!, // Use provided module address\n moduleName: moduleName!, // Use provided module name\n functionName: functionName!, // Use provided function name\n typeArgs: runTimeParams, // Use converted runtime parameters\n args: params || [], // Use provided parameters\n chainId,\n };\n\n const rawTxnBase64: string =\n await provider.createRawTransactionBuffer(rawTxnRequest);\n\n // Send to wallet\n const response: RawTransactionResponse =\n await provider.signAndSendRawTransaction({\n rawTxn: rawTxnBase64,\n chainId,\n meta: {\n description: `Call ${moduleName}::${functionName}`, // Dynamic description\n },\n });\n\n if (response.approved) {\n const txHash = response.txHash || response.result || 'success';\n addTransactions(txHash);\n logger.info('Transaction sent successfully', { txHash, walletType: 'ribbit' });\n return txHash;\n } else {\n throw new TransactionError(response.error || ERROR_MESSAGES.TRANSACTION_REJECTED);\n }\n }\n default: {\n throw new TransactionError(\n `Raw transactions not supported for wallet: ${selectedWallet}`\n );\n }\n }\n } catch (error) {\n const txError = error instanceof TransactionError \n ? error \n : new TransactionError(ERROR_MESSAGES.TRANSACTION_FAILED, undefined, error as Error);\n logger.error('Transaction failed', txError, { \n walletType: selectedWallet,\n moduleAddress,\n moduleName,\n functionName \n });\n throw txError;\n }\n };\n\n const signMessage = async (\n message: string,\n nonce?: string,\n account?: any,\n forceSign = false\n ) => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n // Generate secure nonce if not provided\n const secureNonce = nonce || generateNonce();\n\n switch (selectedWallet) {\n case 'starkey': {\n if (!walletCapabilities.signMessage) {\n throw new SignMessageError('Message signing not supported by current wallet');\n }\n\n if (!accounts.length && !account) return;\n if (!accounts.length && account) {\n accounts[0] = account;\n }\n if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === 'true' && !forceSign) {\n return;\n }\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'true');\n\n try {\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n const response = await provider.signMessage({\n message: hexMessage,\n nonce: secureNonce,\n });\n\n const { publicKey, signature } = response;\n const verified = nacl.sign.detached.verify(\n new TextEncoder().encode(message),\n Uint8Array.from(Buffer.from(signature.slice(2), 'hex')),\n Uint8Array.from(Buffer.from(publicKey.slice(2), 'hex'))\n );\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n logger.info('Message signed successfully', { walletType: 'starkey' });\n return { ...response, verified };\n } catch (error) {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error as Error);\n }\n }\n case 'ribbit': {\n if (!walletCapabilities.signMessage) {\n throw new SignMessageError('Message signing not supported by current wallet');\n }\n\n if (!accounts.length && !account) return;\n if (!accounts.length && account) {\n accounts[0] = account;\n }\n if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === 'true' && !forceSign) {\n return;\n }\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'true');\n\n try {\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n const response: SignMessageResponse = await provider.signMessage({\n message: hexMessage,\n nonce: parseInt(secureNonce),\n chainId: parseInt(getChainId()),\n });\n\n if (response.approved && response.publicKey && response.signature) {\n const { publicKey, signature } = response;\n const verified = nacl.sign.detached.verify(\n new TextEncoder().encode(message),\n Uint8Array.from(Buffer.from(signature.slice(2), 'hex')),\n Uint8Array.from(Buffer.from(publicKey.slice(2), 'hex'))\n );\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n logger.info('Message signed successfully', { walletType: 'ribbit' });\n return { ...response, verified };\n } else {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(response.error || ERROR_MESSAGES.SIGNING_REJECTED);\n }\n } catch (error) {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error as Error);\n }\n }\n default: {\n throw new SignMessageError(\n `Message signing not supported for wallet: ${selectedWallet}`\n );\n }\n }\n };\n\n // Event handling for Starkey wallet only\n useEffect(() => {\n if (selectedWallet === 'starkey' && walletCapabilities.eventListeners) {\n const handleExtensionEvents = (event: any) => {\n if (event?.data?.name?.startsWith('starkey-')) {\n switch (event?.data?.name) {\n case 'starkey-extension-installed': {\n checkIsExtensionInstalled();\n break;\n }\n case 'starkey-wallet-updated': {\n (async () => {\n const responseAcc = await supraProvider.account();\n if (responseAcc.length) {\n setAccounts(responseAcc);\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n\n await updateBalance();\n await getNetworkData();\n } else {\n logger.debug('Starkey wallet updated: No accounts found - Resetting');\n resetWalletData();\n // router.push('/'); // Temporarily disabled to debug refresh\n }\n setLoading(false);\n })();\n break;\n }\n case 'starkey-wallet-disconnected': {\n resetWalletData();\n router.push('/');\n setLoading(false);\n break;\n }\n case 'starkey-window-removed': {\n setLoading(false);\n break;\n }\n }\n }\n };\n\n checkIsExtensionInstalled();\n window.addEventListener('message', handleExtensionEvents);\n return () => window.removeEventListener('message', handleExtensionEvents);\n }\n }, [selectedWallet, walletCapabilities, supraProvider]);\n\n const getAvailableWallets = useCallback(() => {\n const availableWallets: Array<{\n type: WalletType;\n name: string;\n isInstalled: boolean;\n capabilities: WalletCapabilities;\n }> = [];\n\n // Check each wallet type\n Object.entries(WALLET_CONFIGS).forEach(([walletType, config]) => {\n const provider = config.provider();\n const isInstalled = !!provider;\n\n switch (walletType as WalletType) {\n case 'starkey': {\n availableWallets.push({\n type: 'starkey',\n name: 'Starkey Wallet',\n isInstalled,\n capabilities: config.capabilities,\n });\n break;\n }\n case 'ribbit': {\n availableWallets.push({\n type: 'ribbit',\n name: 'Ribbit Wallet',\n isInstalled,\n capabilities: config.capabilities,\n });\n break;\n }\n }\n });\n\n return availableWallets;\n }, []);\n\n const updateSelectedWallet = (walletType: WalletType) => {\n setSelectedWallet(walletType);\n setWalletCapabilities(WALLET_CONFIGS[walletType].capabilities);\n setStoredWalletType(walletType);\n };\n\n return {\n // New wallet selection functionality\n selectedWallet,\n walletCapabilities,\n getAvailableWallets, // Add this new function\n\n // Existing interface (unchanged)\n getCurrentProvider,\n isExtensionInstalled,\n accounts,\n networkData,\n balance,\n transactions,\n selectedChainId,\n connectWallet, // Now accepts optional walletType parameter\n disconnectWallet,\n sendRawTransaction,\n signMessage,\n setSelectedChainId,\n // switchToChain,\n loading,\n // authFetch,\n // checkAndRevalidateToken,\n // signIn,\n };\n};\n\nexport default useSupraMultiWallet;","/**\n * Structured logging utility for the wallet library\n */\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: number;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nclass Logger {\n private isDevelopment = process.env.NODE_ENV === 'development';\n\n private log(level: LogLevel, message: string, context?: Record<string, unknown>, error?: Error): void {\n if (!this.isDevelopment && level === 'debug') {\n return; // Skip debug logs in production\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: Date.now(),\n context,\n error,\n };\n\n const logMethod = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n \n if (error) {\n logMethod(`[${level.toUpperCase()}] ${message}`, {\n ...context,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n },\n });\n } else {\n logMethod(`[${level.toUpperCase()}] ${message}`, context || {});\n }\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.log('debug', message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log('info', message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log('warn', message, context);\n }\n\n error(message: string, error?: Error, context?: Record<string, unknown>): void {\n this.log('error', message, context, error);\n }\n}\n\nexport const logger = new Logger();\n","/**\n * Custom error classes for wallet operations\n */\n\n/**\n * Base error class for all wallet-related errors\n */\nexport class WalletError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'WalletError';\n Object.setPrototypeOf(this, WalletError.prototype);\n }\n}\n\n/**\n * Error thrown when wallet connection fails\n */\nexport class WalletConnectionError extends WalletError {\n constructor(message: string, cause?: Error) {\n super(message, 'WALLET_CONNECTION_ERROR', cause);\n this.name = 'WalletConnectionError';\n Object.setPrototypeOf(this, WalletConnectionError.prototype);\n }\n}\n\n/**\n * Error thrown when transaction fails\n */\nexport class TransactionError extends WalletError {\n constructor(message: string, public readonly txHash?: string, cause?: Error) {\n super(message, 'TRANSACTION_ERROR', cause);\n this.name = 'TransactionError';\n Object.setPrototypeOf(this, TransactionError.prototype);\n }\n}\n\n/**\n * Error thrown when message signing fails\n */\nexport class SignMessageError extends WalletError {\n constructor(message: string, cause?: Error) {\n super(message, 'SIGN_MESSAGE_ERROR', cause);\n this.name = 'SignMessageError';\n Object.setPrototypeOf(this, SignMessageError.prototype);\n }\n}\n\n/**\n * Error thrown when wallet is not installed\n */\nexport class WalletNotInstalledError extends WalletError {\n constructor(walletType: string) {\n super(`Wallet ${walletType} is not installed`, 'WALLET_NOT_INSTALLED');\n this.name = 'WalletNotInstalledError';\n Object.setPrototypeOf(this, WalletNotInstalledError.prototype);\n }\n}\n\n/**\n * Error thrown when network operation fails\n */\nexport class NetworkError extends WalletError {\n constructor(message: string, cause?: Error) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Error thrown for invalid configuration\n */\nexport class ConfigurationError extends WalletError {\n constructor(message: string) {\n super(message, 'CONFIGURATION_ERROR');\n this.name = 'ConfigurationError';\n Object.setPrototypeOf(this, ConfigurationError.prototype);\n }\n}\n","/**\n * Storage utilities with fallback mechanisms\n */\n\nimport { STORAGE_KEYS } from './constants';\nimport { logger } from './logger';\n\ntype StorageType = 'localStorage' | 'sessionStorage' | 'cookie';\n\n/**\n * Set item in storage with fallback\n */\nexport function setStorageItem(key: string, value: string, preferredType: StorageType = 'localStorage'): boolean {\n const types: StorageType[] = preferredType === 'localStorage' \n ? ['localStorage', 'sessionStorage', 'cookie']\n : preferredType === 'sessionStorage'\n ? ['sessionStorage', 'localStorage', 'cookie']\n : ['cookie', 'localStorage', 'sessionStorage'];\n\n for (const type of types) {\n try {\n switch (type) {\n case 'localStorage':\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(key, value);\n return true;\n }\n break;\n case 'sessionStorage':\n if (typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.setItem(key, value);\n return true;\n }\n break;\n case 'cookie':\n if (typeof document !== 'undefined') {\n document.cookie = `${key}=${encodeURIComponent(value)}; path=/; max-age=${60 * 60 * 24 * 30}; SameSite=Lax`;\n return true;\n }\n break;\n }\n } catch (error) {\n logger.warn(`Failed to set ${key} in ${type}`, { error });\n }\n }\n return false;\n}\n\n/**\n * Get item from storage with fallback\n */\nexport function getStorageItem(key: string): string | null {\n // Try localStorage first\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const value = window.localStorage.getItem(key);\n if (value !== null) return value;\n }\n } catch (error) {\n logger.warn(`Failed to read ${key} from localStorage`, { error });\n }\n\n // Try sessionStorage\n try {\n if (typeof window !== 'undefined' && window.sessionStorage) {\n const value = window.sessionStorage.getItem(key);\n if (value !== null) return value;\n }\n } catch (error) {\n logger.warn(`Failed to read ${key} from sessionStorage`, { error });\n }\n\n // Try cookie\n try {\n if (typeof document !== 'undefined') {\n const match = document.cookie\n .split('; ')\n .find((r) => r.startsWith(key + '='));\n if (match) {\n return decodeURIComponent(match.split('=').slice(1).join('='));\n }\n }\n } catch (error) {\n logger.warn(`Failed to read ${key} from cookie`, { error });\n }\n\n return null;\n}\n\n/**\n * Remove item from all storage types\n */\nexport function removeStorageItem(key: string): void {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(key);\n }\n } catch (error) {\n // Silent fail\n }\n\n try {\n if (typeof window !== 'undefined' && window.sessionStorage) {\n window.sessionStorage.removeItem(key);\n }\n } catch (error) {\n // Silent fail\n }\n\n try {\n if (typeof document !== 'undefined') {\n document.cookie = `${key}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;\n }\n } catch (error) {\n // Silent fail\n }\n}\n\n/**\n * Get cookie value\n */\nfunction getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie\n .split('; ')\n .find((r) => r.startsWith(name + '='));\n return match\n ? decodeURIComponent(match.split('=').slice(1).join('='))\n : null;\n}\n\nexport { getCookie };\n","/**\n * Constants and configuration values for the wallet library\n */\n\n// Storage keys\nexport const STORAGE_KEYS = {\n SELECTED_WALLET: 'multiwallet.selectedWallet',\n RECENT_WALLET: 'recent_wallet_type',\n USER_PROFILE_CACHE: 'user_profile_cache',\n USER_PROFILE_CACHE_TIMESTAMP: 'user_profile_cache_timestamp',\n IS_SIGNING_WALLET: 'isSigningWallet',\n STARKEY_ACCOUNTS: 'starkey.accounts.0',\n} as const;\n\n// Cache TTL (Time To Live) in milliseconds\nexport const CACHE_TTL = {\n PROFILE: 600 * 1000, // 10 minutes\n BALANCE: 30 * 1000, // 30 seconds\n} as const;\n\n// Timeouts and intervals (in milliseconds)\nexport const TIMEOUTS = {\n WALLET_DETECTION_POLL: 3000, // 3 seconds (reduced from 5s)\n WALLET_CHECK_INTERVAL: 2000, // 2 seconds\n WALLET_CHECK_MAX_DURATION: 30000, // 30 seconds\n CONNECTION_TIMEOUT: 30000, // 30 seconds\n BALANCE_POLL_INTERVAL: 30000, // 30 seconds\n MODAL_CLOSE_DELAY: 2500, // 2.5 seconds\n CLICK_OUTSIDE_DELAY: 2000, // 2 seconds\n} as const;\n\n// Wallet configuration\nexport const WALLET_DOWNLOAD_URLS = {\n starkey: 'https://chromewebstore.google.com/detail/starkey-wallet-the-offici/hcjhpkgbmechpabifbggldplacolbkoh',\n ribbit: 'https://ribbitwallet.com',\n} as const;\n\n// Default chain IDs\nexport const DEFAULT_CHAIN_IDS = {\n TESTNET: '6',\n MAINNET: '8',\n} as const;\n\n// Error messages\nexport const ERROR_MESSAGES = {\n WALLET_NOT_INSTALLED: 'Wallet extension not installed',\n CONNECTION_FAILED: 'Failed to connect wallet',\n CONNECTION_REJECTED: 'Connection rejected by user',\n NO_ACCOUNT_FOUND: 'No account found',\n SIGNING_FAILED: 'Message signing failed',\n SIGNING_REJECTED: 'Message signing rejected',\n TRANSACTION_FAILED: 'Transaction failed',\n TRANSACTION_REJECTED: 'Transaction rejected',\n NETWORK_ERROR: 'Network error occurred',\n UNSUPPORTED_WALLET: 'Unsupported wallet type',\n INVALID_ADDRESS: 'Invalid wallet address',\n} as const;\n\n// Connection stage messages\nexport const CONNECTION_MESSAGES = {\n CONNECTING: 'Connecting to wallet...',\n SIGNING: 'Please sign the message to verify your account',\n SUCCESS: 'Successfully connected',\n ERROR: 'Connection failed',\n CONNECTED_NOT_SIGNED: 'Connected but signature rejected',\n} as const;\n","/**\n * Cryptographic utilities for wallet operations\n */\n\n/**\n * Generate a cryptographically secure random nonce\n */\nexport function generateNonce(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) {\n const array = new Uint32Array(1);\n window.crypto.getRandomValues(array);\n return array[0].toString(36) + Date.now().toString(36);\n }\n // Fallback for environments without crypto API\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n}\n\n/**\n * Generate a secure nonce with expiration timestamp\n */\nexport function generateNonceWithExpiry(ttlSeconds: number = 300): { nonce: string; expiresAt: number } {\n const nonce = generateNonce();\n const expiresAt = Date.now() + ttlSeconds * 1000;\n return { nonce, expiresAt };\n}\n\n/**\n * Validate nonce expiration\n */\nexport function isNonceExpired(expiresAt: number): boolean {\n return Date.now() > expiresAt;\n}\n","/**\n * Configuration management for the wallet library\n */\n\nimport { DEFAULT_CHAIN_IDS } from './constants';\n\nexport interface WalletConfig {\n rpcUrl?: {\n testnet?: string;\n mainnet?: string;\n };\n chainId?: string;\n enableLogging?: boolean;\n balancePollInterval?: number;\n walletDetectionTimeout?: number;\n}\n\nconst defaultConfig: Required<WalletConfig> = {\n rpcUrl: {\n testnet: 'https://rpc-testnet.supra.com',\n mainnet: 'https://rpc-mainnet.supra.com',\n },\n chainId: process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID || DEFAULT_CHAIN_IDS.TESTNET,\n enableLogging: process.env.NODE_ENV === 'development',\n balancePollInterval: 30000,\n walletDetectionTimeout: 3000,\n};\n\nlet config: Required<WalletConfig> = { ...defaultConfig };\n\n/**\n * Initialize wallet configuration\n */\nexport function initConfig(userConfig?: WalletConfig): void {\n config = {\n rpcUrl: {\n testnet: userConfig?.rpcUrl?.testnet || defaultConfig.rpcUrl.testnet,\n mainnet: userConfig?.rpcUrl?.mainnet || defaultConfig.rpcUrl.mainnet,\n },\n chainId: userConfig?.chainId || defaultConfig.chainId,\n enableLogging: userConfig?.enableLogging ?? defaultConfig.enableLogging,\n balancePollInterval: userConfig?.balancePollInterval || defaultConfig.balancePollInterval,\n walletDetectionTimeout: userConfig?.walletDetectionTimeout || defaultConfig.walletDetectionTimeout,\n };\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): Readonly<Required<WalletConfig>> {\n return { ...config };\n}\n\n/**\n * Get RPC URL based on chain ID\n */\nexport function getRpcUrl(chainId?: string): string {\n const targetChainId = chainId || config.chainId;\n const isMainnet = targetChainId === DEFAULT_CHAIN_IDS.MAINNET;\n return isMainnet ? config.rpcUrl.mainnet : config.rpcUrl.testnet;\n}\n\n/**\n * Get current chain ID\n */\nexport function getChainId(): string {\n return config.chainId;\n}\n\n// Initialize with defaults\ninitConfig();\n","\"use client\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport nacl from 'tweetnacl';\nimport { useRouter } from 'next/navigation';\nimport { toast } from 'sonner';\n\n// Import types from ribbit-connect package\nimport {\n type DappMetadata,\n type WalletBalanceRequest,\n type RawTransactionResponse,\n type SignMessageResponse,\n type RawTxnRequest,\n SupraChainId,\n BCS,\n type WalletInfo,\n initSdk,\n type RibbitWalletSDK,\n} from 'ribbit-wallet-connect';\n\n// Import utilities\nimport { logger } from '@/lib/logger';\nimport { \n WalletConnectionError, \n TransactionError, \n SignMessageError,\n WalletNotInstalledError,\n NetworkError \n} from '@/lib/errors';\nimport { \n setStorageItem, \n getStorageItem, \n removeStorageItem \n} from '@/lib/storage';\nimport { STORAGE_KEYS, TIMEOUTS, ERROR_MESSAGES, DEFAULT_CHAIN_IDS } from '@/lib/constants';\nimport { generateNonce } from '@/lib/crypto';\nimport { getRpcUrl, getChainId } from '@/lib/config';\n\n// Define wallet types\nexport type WalletType = 'starkey' | 'ribbit';\n\n// Define wallet capabilities interface\nexport interface WalletCapabilities {\n signMessage: boolean;\n accountSwitching: boolean;\n networkSwitching: boolean;\n rawTransactions: boolean;\n eventListeners: boolean;\n tokenRevalidation: boolean;\n}\n\n// Wallet configuration\nconst WALLET_CONFIGS = {\n starkey: {\n capabilities: {\n signMessage: true,\n accountSwitching: true,\n networkSwitching: true,\n rawTransactions: true,\n eventListeners: true,\n tokenRevalidation: true,\n },\n provider: () =>\n typeof window !== 'undefined' && (window as any)?.starkey?.supra,\n },\n ribbit: {\n capabilities: {\n signMessage: true,\n accountSwitching: false, // Ribbit doesn't support account switching\n networkSwitching: false, // Ribbit network switching happens in-app\n rawTransactions: true,\n eventListeners: false,\n tokenRevalidation: false, // Ribbit doesn't support token revalidation\n },\n provider: () => initSdk(),\n },\n} as const;\n\n// Wallet events for communication with the parent window\nexport const WALLET_EVENTS = {\n CONNECTED: 'wallet-connected',\n PRESIGNED_STATE: 'presigned-state',\n POSTSIGNED_STATE: 'postsigned-state',\n ERROR: 'wallet-error',\n} as const;\n\n// Storage utility functions\nconst setStoredWalletType = (walletType: WalletType): void => {\n setStorageItem(STORAGE_KEYS.SELECTED_WALLET, walletType);\n};\n\nconst getStoredWalletType = (): WalletType => {\n const stored = getStorageItem(STORAGE_KEYS.SELECTED_WALLET) as WalletType;\n if (stored && ['starkey', 'ribbit'].includes(stored)) {\n return stored;\n }\n return 'starkey'; // Default fallback\n};\n\nconst clearStoredWalletType = (): void => {\n removeStorageItem(STORAGE_KEYS.SELECTED_WALLET);\n};\n\nconst useSupraMultiWallet = () => {\n const router = useRouter();\n\n // Initialize wallet selection from storage\n // Initialize wallet selection from storage\n const [selectedWallet, setSelectedWallet] = useState<WalletType>('starkey');\n const [walletCapabilities, setWalletCapabilities] = useState<WalletCapabilities>(\n WALLET_CONFIGS['starkey'].capabilities\n );\n\n // Sync with storage on mount to prevent hydration mismatch\n useEffect(() => {\n const stored = getStoredWalletType();\n if (stored !== 'starkey') {\n setSelectedWallet(stored);\n setWalletCapabilities(WALLET_CONFIGS[stored].capabilities);\n }\n }, []);\n\n // Provider states (keep separate for compatibility)\n const [supraProvider, setSupraProvider] = useState<any>(\n WALLET_CONFIGS.starkey.provider()\n );\n const [ribbitProvider, setRibbitProvider] = useState<RibbitWalletSDK | null>(\n WALLET_CONFIGS.ribbit.provider()\n );\n\n // Existing states\n const [isExtensionInstalled, setIsExtensionInstalled] =\n useState<boolean>(false);\n const [accounts, setAccounts] = useState<string[]>([]);\n const [networkData, setNetworkData] = useState<any>();\n const [balance, setBalance] = useState<string>('');\n const [loading, setLoading] = useState<boolean>(false);\n const [justRequestedRelative, setJustRequestedRelative] =\n useState<boolean>(false);\n const [transactions, setTransactions] = useState<{ hash: string }[]>([]);\n const [selectedChainId, setSelectedChainId] = useState<string>('');\n\n const addTransactions = (hash: string) => {\n setTransactions((prev) => [{ hash }, ...prev]);\n };\n\n // Get current wallet provider\n const getCurrentProvider = () => {\n switch (selectedWallet) {\n case 'starkey': {\n return supraProvider;\n }\n case 'ribbit': {\n return ribbitProvider;\n }\n default: {\n return supraProvider;\n }\n }\n };\n\n // Check if extension is installed - memoized to prevent infinite loops\n const checkExtensionInstalled = useCallback(async () => {\n switch (selectedWallet) {\n case 'starkey': {\n const provider = WALLET_CONFIGS.starkey.provider();\n setSupraProvider(provider);\n setIsExtensionInstalled(!!provider);\n return !!provider;\n }\n case 'ribbit': {\n const provider = WALLET_CONFIGS.ribbit.provider();\n if (!provider) {\n setRibbitProvider(null);\n setIsExtensionInstalled(false);\n return false;\n }\n\n try {\n setRibbitProvider(provider);\n setIsExtensionInstalled(true);\n return true;\n } catch (error) {\n logger.error('Error checking Ribbit wallet readiness', error as Error);\n setRibbitProvider(null);\n setIsExtensionInstalled(false);\n return false;\n }\n }\n default: {\n return false;\n }\n }\n }, [selectedWallet]);\n\n const updateAccounts = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const responseAcc = await provider.account();\n const newAccounts = responseAcc.length > 0 ? responseAcc : [];\n setAccounts(newAccounts);\n if (responseAcc.length > 0) {\n setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);\n }\n // Update balance and network data after accounts are set\n if (newAccounts.length > 0) {\n const balance = await provider.balance();\n if (balance) {\n setBalance(`${balance.formattedBalance} ${balance.displayUnit}`);\n }\n const networkData = await provider.getChainId();\n setNetworkData(networkData || {});\n }\n break;\n }\n case 'ribbit': {\n // Connect to wallet and get current walletAddress. Currently it will return only supra address(string). In future it will return other chain address as well or may be an array of addresses with their chain types({walletAddress: string; chain: string;}).\n const wallet = provider.getWalletInfo();\n if (wallet?.connected) {\n setAccounts([wallet.walletAddress]);\n const walletBalanceRequest: WalletBalanceRequest = {\n chainId: parseInt(getChainId()),\n resourceType: '0x1::supra_coin::SupraCoin',\n decimals: 8,\n };\n const balanceStr = await provider.getWalletBalance(walletBalanceRequest);\n logger.debug('Ribbit balance response', { balance: balanceStr });\n setBalance(`${balanceStr?.balance || 0} SUPRA`);\n } else {\n setAccounts([]);\n }\n break;\n }\n default: {\n setAccounts([]);\n break;\n }\n }\n } catch (error) {\n logger.error('Failed to update accounts', error as Error, { walletType: selectedWallet });\n setAccounts([]);\n switch (selectedWallet) {\n case 'starkey': {\n removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);\n break;\n }\n case 'ribbit': {\n // Reset ribbit session\n break;\n }\n }\n }\n }, [selectedWallet]);\n\n // Initial provider setup - only run when selectedWallet changes\n useEffect(() => {\n let mounted = true;\n \n const initProvider = async () => {\n const isInstalled = await checkExtensionInstalled();\n if (mounted && isInstalled) {\n updateAccounts();\n }\n };\n \n initProvider();\n \n return () => {\n mounted = false;\n };\n }, [selectedWallet, checkExtensionInstalled, updateAccounts]);\n\n // Extension detection effect - optimized with reduced timeout\n useEffect(() => {\n const checkExtension = async () => {\n return await checkExtensionInstalled();\n };\n\n // Initial check\n checkExtension().then((isInstalled) => {\n if (isInstalled && selectedWallet === 'ribbit') {\n updateAccounts();\n }\n });\n\n // For non-ribbit wallets or if ribbit is not ready, keep polling\n const intv = setInterval(async () => {\n const isInstalled = await checkExtension();\n if (isInstalled) {\n clearInterval(intv);\n if (selectedWallet === 'ribbit') {\n updateAccounts();\n }\n }\n }, 1000);\n\n setTimeout(() => {\n clearInterval(intv);\n }, TIMEOUTS.WALLET_DETECTION_POLL);\n\n return () => clearInterval(intv);\n }, [selectedWallet, updateAccounts, checkExtensionInstalled]);\n\n const checkIsExtensionInstalled = useCallback(() => {\n const intervalId = setInterval(async () => {\n const isInstalled = await checkExtensionInstalled();\n if (isInstalled) {\n clearInterval(intervalId);\n updateAccounts();\n }\n }, 500);\n\n setTimeout(() => clearInterval(intervalId), TIMEOUTS.WALLET_DETECTION_POLL);\n }, [updateAccounts, checkExtensionInstalled]);\n\n const updateBalance = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider || !accounts.length) {\n setBalance('');\n return;\n }\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const balance = await provider.balance();\n if (balance) {\n setBalance(`${balance.formattedBalance} ${balance.displayUnit}`);\n }\n break;\n }\n case 'ribbit': {\n const walletBalanceRequest: WalletBalanceRequest = {\n chainId: parseInt(getChainId()),\n resourceType: '0x1::supra_coin::SupraCoin',\n decimals: 8,\n };\n const balanceStr = await provider.getWalletBalance(\n walletBalanceRequest\n );\n logger.debug('Ribbit balance response', { balance: balanceStr });\n setBalance(`${balanceStr?.balance || 0} SUPRA`);\n break;\n }\n default: {\n setBalance('');\n break;\n }\n }\n } catch (error) {\n logger.error('Failed to update balance', error as Error, { walletType: selectedWallet });\n setBalance('');\n }\n }, [selectedWallet, accounts]);\n\n const getNetworkData = useCallback(async () => {\n const provider = getCurrentProvider();\n if (!provider) return {};\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n const data = await provider.getChainId();\n setNetworkData(data || {});\n return data || {};\n }\n case 'ribbit': {\n // Ribbit doesn't have network switching, assume current chain\n const chainId = parseInt(getChainId());\n const mockNetworkData = { chainId: chainId.toString() };\n setNetworkData(mockNetworkData);\n return mockNetworkData;\n }\n default: {\n setNetworkData({});\n return {};\n }\n }\n } catch (error) {\n logger.error('Failed to get network data', error as Error, { walletType: selectedWallet });\n setNetworkData({});\n return {};\n }\n }, [selectedWallet]);\n\n const connectWallet = async (walletType?: WalletType) => {\n // Update wallet selection if provided\n if (walletType) {\n updateSelectedWallet(walletType);\n }\n\n const provider = walletType\n ? WALLET_CONFIGS[walletType].provider()\n : getCurrentProvider();\n\n if (!provider) {\n const error = new WalletNotInstalledError(walletType || selectedWallet);\n logger.warn('Wallet not installed', { walletType: walletType || selectedWallet });\n toast.error(ERROR_MESSAGES.WALLET_NOT_INSTALLED, {\n description: `Please install the ${walletType || selectedWallet} extension`,\n });\n return false;\n }\n\n setLoading(true);\n\n try {\n switch (walletType || selectedWallet) {\n case 'starkey': {\n await provider.connect();\n logger.info('Starkey wallet connection approved');\n await updateAccounts();\n const responseAcc = await provider.account();\n\n if (responseAcc.length === 0) {\n throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);\n }\n\n if (responseAcc.length) {\n setAccounts(responseAcc); // Explicitly update state immediately\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n\n // Dispatch connection event\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n wallet: 'starkey',\n },\n })\n );\n\n // Signature Verification\n try {\n const message = \"To verify your account, please sign this message.\";\n const nonce = generateNonce(); // Use secure nonce generation\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n logger.debug('Signature request initiated', { account: responseAcc[0] });\n const signatureResponse = await provider.signMessage({\n message: hexMessage,\n nonce,\n });\n\n if (signatureResponse) {\n logger.info('Signature approved', { account: responseAcc[0] });\n // Trigger success state only after signing\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n }\n } catch (signError) {\n const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError as Error);\n logger.error('Signing failed', error, { account: responseAcc[0] });\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: error,\n },\n })\n );\n throw error; // Stop execution\n }\n }\n break;\n }\n case 'ribbit': {\n\n const dappMetadata: DappMetadata = {\n name: 'multiwallet',\n description: 'NFT Marketplace and Lootbox Platform',\n logo: window.location.origin + '/favicon.ico',\n url: window.location.origin,\n };\n\n const response: WalletInfo = await provider.connectToWallet(\n dappMetadata\n );\n\n if (response?.connected) {\n logger.info('Ribbit wallet connection approved');\n }\n\n if (response.walletAddress == null) {\n throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);\n }\n\n if (response?.connected) {\n await updateAccounts();\n\n if (response.walletAddress) {\n setAccounts([response.walletAddress]); // Explicitly update state immediately\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n },\n })\n );\n\n // Dispatch connection event\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n wallet: 'ribbit',\n },\n })\n );\n\n // Signature Verification\n try {\n const message = \"To verify your account, please sign this message.\";\n const nonce = generateNonce(); // Use secure nonce generation\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n logger.debug('Signature request initiated', { account: response.walletAddress });\n const signatureResponse = await provider.signMessage({\n message: hexMessage,\n nonce: parseInt(nonce),\n chainId: parseInt(getChainId()),\n });\n\n if (signatureResponse && signatureResponse.approved) {\n logger.info('Signature approved', { account: response.walletAddress });\n // Trigger success state only after signing\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {\n detail: {\n timestamp: Date.now(),\n account: response.walletAddress,\n },\n })\n );\n } else {\n throw new SignMessageError(signatureResponse.error || ERROR_MESSAGES.SIGNING_REJECTED);\n }\n } catch (signError) {\n const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError as Error);\n logger.error('Signing failed', error, { account: response.walletAddress });\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: error,\n },\n })\n );\n throw error;\n }\n }\n } else {\n throw new WalletConnectionError(ERROR_MESSAGES.CONNECTION_REJECTED);\n }\n break;\n }\n default: {\n throw new WalletConnectionError(\n `${ERROR_MESSAGES.UNSUPPORTED_WALLET}: ${walletType || selectedWallet}`\n );\n }\n }\n\n return true;\n } catch (error) {\n const walletError = error instanceof WalletConnectionError \n ? error \n : new WalletConnectionError(ERROR_MESSAGES.CONNECTION_FAILED, error as Error);\n \n logger.error('Wallet connection failed', walletError, { \n walletType: walletType || selectedWallet \n });\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.ERROR, {\n detail: {\n timestamp: Date.now(),\n error: walletError,\n },\n })\n );\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n const disconnectWallet = async () => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n await provider.disconnect();\n break;\n }\n case 'ribbit': {\n await provider.disconnect();\n // any further clean up required do that.\n break;\n }\n }\n\n resetWalletData();\n // Clear wallet selection on disconnect\n clearStoredWalletType();\n router.push('/');\n } catch (error) {\n logger.error('Wallet disconnect failed', error as Error, { walletType: selectedWallet });\n resetWalletData();\n // Clear wallet selection on error too\n clearStoredWalletType();\n }\n };\n\n const resetWalletData = () => {\n setAccounts([]);\n setBalance('');\n setNetworkData({});\n\n switch (selectedWallet) {\n case 'starkey': {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);\n break;\n }\n case 'ribbit': {\n // Any required clean up\n break;\n }\n }\n };\n\n // Example function for fetching sequence number. To be used in sendTransaction.\n const getSequenceNumber = async (address: string): Promise<number> => {\n const rpcUrl = getRpcUrl();\n const data = await fetch(`${rpcUrl}/rpc/v1/accounts/${address}`);\n if (!data.ok) {\n throw new NetworkError(`Failed to fetch sequence number for ${address}`);\n }\n const accountData = await data.json();\n return accountData.sequence_number;\n };\n\n const sendRawTransaction = async (\n moduleAddress?: string,\n moduleName?: string,\n functionName?: string,\n params?: any[],\n runTimeParams: any[] = [],\n txExpiryTime: number = Math.ceil(Date.now() / 1000) + 3000\n ) => {\n const provider = getCurrentProvider();\n if (\n !provider ||\n !accounts.length ||\n !moduleAddress ||\n !moduleName ||\n !functionName\n )\n return;\n\n try {\n switch (selectedWallet) {\n case 'starkey': {\n if (!walletCapabilities.rawTransactions) {\n throw new TransactionError('Raw transactions not supported by current wallet');\n }\n\n let networkData = await getNetworkData();\n const currentChainId = getChainId();\n if (networkData.chainId !== currentChainId) {\n setSelectedChainId(currentChainId);\n await provider.changeNetwork({\n chainId: currentChainId,\n });\n }\n\n const rawTxPayload = [\n accounts[0],\n 0, // sequence number\n moduleAddress,\n moduleName,\n functionName,\n runTimeParams,\n params,\n {},\n ];\n\n const data = await provider.createRawTransactionData(rawTxPayload);\n const txHash = await provider.sendTransaction({\n data,\n from: accounts[0],\n to: moduleAddress,\n chainId: currentChainId,\n value: '',\n });\n\n addTransactions(txHash || 'failed');\n logger.info('Transaction sent successfully', { txHash, walletType: 'starkey' });\n return txHash;\n }\n case 'ribbit': {\n if (!walletCapabilities.rawTransactions) {\n throw new TransactionError('Raw transactions not supported by current wallet');\n }\n\n const currentChainId = getChainId();\n let chainId = SupraChainId.TESTNET;\n\n if (currentChainId === DEFAULT_CHAIN_IDS.TESTNET) {\n chainId = SupraChainId.TESTNET;\n } else if (currentChainId === DEFAULT_CHAIN_IDS.MAINNET) {\n chainId = SupraChainId.MAINNET;\n }\n\n const rawTxnRequest: RawTxnRequest = {\n sender: accounts[0], // Use actual sender address\n moduleAddress: moduleAddress!, // Use provided module address\n moduleName: moduleName!, // Use provided module name\n functionName: functionName!, // Use provided function name\n typeArgs: runTimeParams, // Use converted runtime parameters\n args: params || [], // Use provided parameters\n chainId,\n };\n\n const rawTxnBase64: string =\n await provider.createRawTransactionBuffer(rawTxnRequest);\n\n // Send to wallet\n const response: RawTransactionResponse =\n await provider.signAndSendRawTransaction({\n rawTxn: rawTxnBase64,\n chainId,\n meta: {\n description: `Call ${moduleName}::${functionName}`, // Dynamic description\n },\n });\n\n if (response.approved) {\n const txHash = response.txHash || response.result || 'success';\n addTransactions(txHash);\n logger.info('Transaction sent successfully', { txHash, walletType: 'ribbit' });\n return txHash;\n } else {\n throw new TransactionError(response.error || ERROR_MESSAGES.TRANSACTION_REJECTED);\n }\n }\n default: {\n throw new TransactionError(\n `Raw transactions not supported for wallet: ${selectedWallet}`\n );\n }\n }\n } catch (error) {\n const txError = error instanceof TransactionError \n ? error \n : new TransactionError(ERROR_MESSAGES.TRANSACTION_FAILED, undefined, error as Error);\n logger.error('Transaction failed', txError, { \n walletType: selectedWallet,\n moduleAddress,\n moduleName,\n functionName \n });\n throw txError;\n }\n };\n\n const signMessage = async (\n message: string,\n nonce?: string,\n account?: any,\n forceSign = false\n ) => {\n const provider = getCurrentProvider();\n if (!provider) return;\n\n // Generate secure nonce if not provided\n const secureNonce = nonce || generateNonce();\n\n switch (selectedWallet) {\n case 'starkey': {\n if (!walletCapabilities.signMessage) {\n throw new SignMessageError('Message signing not supported by current wallet');\n }\n\n if (!accounts.length && !account) return;\n if (!accounts.length && account) {\n accounts[0] = account;\n }\n if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === 'true' && !forceSign) {\n return;\n }\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'true');\n\n try {\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n\n const response = await provider.signMessage({\n message: hexMessage,\n nonce: secureNonce,\n });\n\n const { publicKey, signature } = response;\n const verified = nacl.sign.detached.verify(\n new TextEncoder().encode(message),\n Uint8Array.from(Buffer.from(signature.slice(2), 'hex')),\n Uint8Array.from(Buffer.from(publicKey.slice(2), 'hex'))\n );\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n logger.info('Message signed successfully', { walletType: 'starkey' });\n return { ...response, verified };\n } catch (error) {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error as Error);\n }\n }\n case 'ribbit': {\n if (!walletCapabilities.signMessage) {\n throw new SignMessageError('Message signing not supported by current wallet');\n }\n\n if (!accounts.length && !account) return;\n if (!accounts.length && account) {\n accounts[0] = account;\n }\n if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === 'true' && !forceSign) {\n return;\n }\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'true');\n\n try {\n const hexMessage = '0x' + Buffer.from(message, 'utf8').toString('hex');\n const response: SignMessageResponse = await provider.signMessage({\n message: hexMessage,\n nonce: parseInt(secureNonce),\n chainId: parseInt(getChainId()),\n });\n\n if (response.approved && response.publicKey && response.signature) {\n const { publicKey, signature } = response;\n const verified = nacl.sign.detached.verify(\n new TextEncoder().encode(message),\n Uint8Array.from(Buffer.from(signature.slice(2), 'hex')),\n Uint8Array.from(Buffer.from(publicKey.slice(2), 'hex'))\n );\n\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n logger.info('Message signed successfully', { walletType: 'ribbit' });\n return { ...response, verified };\n } else {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(response.error || ERROR_MESSAGES.SIGNING_REJECTED);\n }\n } catch (error) {\n setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, 'false');\n throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error as Error);\n }\n }\n default: {\n throw new SignMessageError(\n `Message signing not supported for wallet: ${selectedWallet}`\n );\n }\n }\n };\n\n // Event handling for Starkey wallet only\n useEffect(() => {\n if (selectedWallet === 'starkey' && walletCapabilities.eventListeners) {\n const handleExtensionEvents = (event: any) => {\n if (event?.data?.name?.startsWith('starkey-')) {\n switch (event?.data?.name) {\n case 'starkey-extension-installed': {\n checkIsExtensionInstalled();\n break;\n }\n case 'starkey-wallet-updated': {\n (async () => {\n const responseAcc = await supraProvider.account();\n if (responseAcc.length) {\n setAccounts(responseAcc);\n\n window.dispatchEvent(\n new CustomEvent(WALLET_EVENTS.CONNECTED, {\n detail: {\n timestamp: Date.now(),\n account: responseAcc[0],\n },\n })\n );\n\n await updateBalance();\n await getNetworkData();\n } else {\n logger.debug('Starkey wallet updated: No accounts found - Resetting');\n resetWalletData();\n // router.push('/'); // Temporarily disabled to debug refresh\n }\n setLoading(false);\n })();\n break;\n }\n case 'starkey-wallet-disconnected': {\n resetWalletData();\n router.push('/');\n setLoading(false);\n break;\n }\n case 'starkey-window-removed': {\n setLoading(false);\n break;\n }\n }\n }\n };\n\n checkIsExtensionInstalled();\n window.addEventListener('message', handleExtensionEvents);\n return () => window.removeEventListener('message', handleExtensionEvents);\n }\n }, [selectedWallet, walletCapabilities, supraProvider]);\n\n const getAvailableWallets = useCallback(() => {\n const availableWallets: Array<{\n type: WalletType;\n name: string;\n isInstalled: boolean;\n capabilities: WalletCapabilities;\n }> = [];\n\n // Check each wallet type\n Object.entries(WALLET_CONFIGS).forEach(([walletType, config]) => {\n const provider = config.provider();\n const isInstalled = !!provider;\n\n switch (walletType as WalletType) {\n case 'starkey': {\n availableWallets.push({\n type: 'starkey',\n name: 'Starkey Wallet',\n isInstalled,\n capabilities: config.capabilities,\n });\n break;\n }\n case 'ribbit': {\n availableWallets.push({\n type: 'ribbit',\n name: 'Ribbit Wallet',\n isInstalled,\n capabilities: config.capabilities,\n });\n break;\n }\n }\n });\n\n return availableWallets;\n }, []);\n\n const updateSelectedWallet = (walletType: WalletType) => {\n setSelectedWallet(walletType);\n setWalletCapabilities(WALLET_CONFIGS[walletType].capabilities);\n setStoredWalletType(walletType);\n };\n\n return {\n // New wallet selection functionality\n selectedWallet,\n walletCapabilities,\n getAvailableWallets, // Add this new function\n\n // Existing interface (unchanged)\n getCurrentProvider,\n isExtensionInstalled,\n accounts,\n networkData,\n balance,\n transactions,\n selectedChainId,\n connectWallet, // Now accepts optional walletType parameter\n disconnectWallet,\n sendRawTransaction,\n signMessage,\n setSelectedChainId,\n // switchToChain,\n loading,\n // authFetch,\n // checkAndRevalidateToken,\n // signIn,\n };\n};\n\nexport default useSupraMultiWallet;","import { useCallback } from 'react';\nimport { BCS, HexString, TxnBuilderTypes } from 'supra-l1-sdk-core';\nimport { getStoredABI, type ModuleABI } from '../lib/abiStorage';\n\nconst useConversionUtils = () => {\n // Convert a human-readable string to Uint8Array\n const stringToUint8Array = useCallback((humanReadableStr: string) => {\n return BCS.bcsToBytes(new TxnBuilderTypes.Identifier(humanReadableStr));\n }, []);\n\n const serializeString = useCallback((humanReadableStr: string) => {\n return BCS.bcsSerializeStr(humanReadableStr);\n }, []);\n\n // Convert a crypto address to Uint8Array\n const addressToUint8Array = useCallback((cryptoAddress: string) => {\n //return new HexString(cryptoAddress).toUint8Array();\n return BCS.bcsToBytes(TxnBuilderTypes.AccountAddress.fromHex(cryptoAddress));\n }, []);\n\n const deserializeString = (uint8Array: string) => {\n return BCS.bcsSerializeStr(uint8Array);\n };\n const deserializeVector = (uint8Array: Uint8Array) => {\n const deserializer = new BCS.Deserializer(uint8Array);\n return BCS.deserializeVector(deserializer, BCS.bcsSerializeU8);\n };\n\n // Serialize a uint8 value\n const serializeUint8 = useCallback((value: number | string) => {\n const num = typeof value === 'string' ? parseInt(value, 10) : value;\n if (num < 0 || num > 255) {\n throw new Error(`u8 value out of range: ${num}`);\n }\n return BCS.bcsSerializeU8(num);\n }, []);\n\n // Serialize a uint16 value\n const serializeUint16 = useCallback((value: number | string | bigint) => {\n let num: number;\n if (typeof value === 'string') {\n num = parseInt(value, 10);\n } else if (typeof value === 'bigint') {\n num = Number(value);\n } else {\n num = value;\n }\n if (num < 0 || num > 65535) {\n throw new Error(`u16 value out of range: ${num}`);\n }\n return BCS.bcsSerializeU16(num);\n }, []);\n\n // Serialize a uint32 value\n const serializeUint32 = useCallback((value: number | string | bigint) => {\n let num: number;\n if (typeof value === 'string') {\n num = parseInt(value, 10);\n } else if (typeof value === 'bigint') {\n num = Number(value);\n } else {\n num = value;\n }\n if (num < 0 || num > 4294967295) {\n throw new Error(`u32 value out of range: ${num}`);\n }\n return BCS.bcsSerializeU32(num);\n }, []);\n\n // Serialize a uint64 value\n const serializeUint64 = useCallback((value: number | string | bigint) => {\n let num: bigint;\n if (typeof value === 'string') {\n num = BigInt(value);\n } else if (typeof value === 'number') {\n num = BigInt(value);\n } else {\n num = value;\n }\n if (num < 0) {\n throw new Error(`u64 value cannot be negative: ${num}`);\n }\n return BCS.bcsSerializeUint64(num);\n }, []);\n\n // Serialize a uint128 value\n const serializeUint128 = useCallback((value: number | string | bigint) => {\n let num: bigint;\n if (typeof value === 'string') {\n num = BigInt(value);\n } else if (typeof value === 'number') {\n num = BigInt(value);\n } else {\n num = value;\n }\n if (num < 0) {\n throw new Error(`u128 value cannot be negative: ${num}`);\n }\n return BCS.bcsSerializeU128(num);\n }, []);\n\n const serializeU256 = useCallback((value: bigint) => {\n return BCS.bcsSerializeU256(value);\n }, []);\n\n const serializeBool = useCallback((value: boolean) => {\n return BCS.bcsSerializeBool(value);\n }, []);\n\n const serializeVector = useCallback((values: any[], type: 'u8' | 'u64' | 'bool' | 'string' | 'address') => {\n const serializer = new BCS.Serializer();\n serializer.serializeU32AsUleb128(values.length);\n\n values.forEach(value => {\n if (type === 'u64') {\n serializer.serializeU64(value as bigint);\n } else if (type === 'bool') {\n serializer.serializeBool(value as boolean);\n } else if (type === 'string') {\n serializer.serializeStr(value as string);\n } else if (type === 'address') {\n const accountAddress = TxnBuilderTypes.AccountAddress.fromHex(value as string);\n serializer.serializeFixedBytes(accountAddress.address);\n } else {\n serializer.serializeStr(value as string);\n }\n });\n return serializer.getBytes();\n }, []);\n\n const hexToString = (hex: string, type: string) => {\n if (!hex) {\n return '';\n }\n\n if (type !== \"String\") {\n // For numeric types, convert hex to decimal string\n\n try {\n return BigInt(hex).toString();\n } catch (error) {\n console.error('Error converting hex to string:', error);\n return hex;\n }\n }\n\n try {\n // Remove the '0x' prefix\n const cleanHex = hex.slice(2);\n // Convert hex to string and remove the first character (length prefix)\n return Buffer.from(cleanHex, 'hex').toString().slice(1);\n } catch (error) {\n console.error('Error converting hex to string:', error);\n return hex;\n }\n };\n\n const stringToHex = (str: string) => {\n // Convert string to UTF-8 encoded bytes\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str);\n\n // Convert bytes to hex string\n let hexString = '';\n for (let i = 0; i < bytes.length; i++) {\n const hex = bytes[i].toString(16).padStart(2, '0');\n hexString += hex;\n }\n\n return hexString;\n }\n\n // ========== ABI-Based Serialization ==========\n\n // Serializes a single value based on its Move type\n const serializeValueByType = useCallback(\n (value: any, type: string, serializer?: BCS.Serializer): Uint8Array => {\n const ser = serializer || new BCS.Serializer();\n const shouldReturnBytes = !serializer; // Only return bytes if we created the serializer\n\n // Handle Option<T>\n if (type.startsWith('0x1::option::Option<')) {\n if (value === null || value === undefined) {\n ser.serializeU8(0);\n } else {\n ser.serializeU8(1);\n const innerType = type.slice(21, -1); // Remove \"0x1::option::Option<\" and \">\"\n serializeValueByType(value, innerType, ser);\n }\n return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);\n }\n\n // Handle vector<T>\n if (type.startsWith('vector<')) {\n // Use regex to extract inner type (handles nested vectors better)\n const vectorMatch = type.match(/vector<(.+)>$/);\n if (!vectorMatch) {\n throw new Error(`Invalid vector type format: ${type}`);\n }\n const innerType = vectorMatch[1];\n\n // Special handling for vector<u8> - accepts string, Uint8Array, or number[]\n if (innerType === 'u8') {\n let bytes: Uint8Array;\n\n if (typeof value === 'string') {\n // Hex string - convert to Uint8Array\n const cleanHex = value.startsWith('0x') ? value.slice(2) : value;\n bytes = new Uint8Array(\n cleanHex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || []\n );\n } else if (value instanceof Uint8Array) {\n // Uint8Array - use directly\n bytes = value;\n } else if (Array.isArray(value)) {\n // Number array - convert to Uint8Array\n bytes = new Uint8Array(\n value.map((item) => {\n const u8 = typeof item === 'string' ? parseInt(item, 10) : item;\n if (u8 < 0 || u8 > 255) {\n throw new Error(`u8 value out of range in vector: ${u8}`);\n }\n return u8;\n })\n );\n } else {\n throw new Error(\n `Expected string, Uint8Array, or number[] for vector<u8>, got ${typeof value}`\n );\n }\n\n // Serialize vector<u8> as length + bytes\n ser.serializeU32AsUleb128(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n ser.serializeU8(bytes[i]);\n }\n } else {\n // Regular vector handling\n if (!Array.isArray(value)) {\n throw new Error(\n `Expected array for vector<${innerType}>, got ${typeof value}`\n );\n }\n ser.serializeU32AsUleb128(value.length);\n for (const item of value) {\n serializeValueByType(item, innerType, ser);\n }\n }\n return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);\n }\n\n // Handle 0x1::object::Object<T> - treat as address\n if (type.startsWith('0x1::object::Object')) {\n if (typeof value !== 'string') {\n throw new Error(`Expected string for Object, got ${typeof value}`);\n }\n const objectAddress = TxnBuilderTypes.AccountAddress.fromHex(value);\n ser.serializeFixedBytes(objectAddress.address);\n return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);\n }\n\n // Handle primitive types\n switch (type) {\n case 'address':\n if (typeof value !== 'string') {\n throw new Error(`Expected string for address, got ${typeof value}`);\n }\n const accountAddress = TxnBuilderTypes.AccountAddress.fromHex(value);\n ser.serializeFixedBytes(accountAddress.address);\n break;\n\n case 'u8':\n const u8 = typeof value === 'string' ? parseInt(value, 10) : value;\n if (u8 < 0 || u8 > 255) {\n throw new Error(`u8 value out of range: ${u8}`);\n }\n ser.serializeU8(u8);\n break;\n\n case 'u16':\n const u16 =\n typeof value === 'string'\n ? parseInt(value, 10)\n : typeof value === 'bigint'\n ? Number(value)\n : value;\n if (u16 < 0 || u16 > 65535) {\n throw new Error(`u16 value out of range: ${u16}`);\n }\n ser.serializeU16(u16);\n break;\n\n case 'u32':\n const u32 =\n typeof value === 'string'\n ? parseInt(value, 10)\n : typeof value === 'bigint'\n ? Number(value)\n : value;\n if (u32 < 0 || u32 > 4294967295) {\n throw new Error(`u32 value out of range: ${u32}`);\n }\n ser.serializeU32(u32);\n break;\n\n case 'u64':\n const u64 =\n typeof value === 'string'\n ? BigInt(value)\n : typeof value === 'number'\n ? BigInt(value)\n : value;\n if (u64 < 0) {\n throw new Error(`u64 value cannot be negative: ${u64}`);\n }\n ser.serializeU64(u64);\n break;\n\n case 'u128':\n const u128 =\n typeof value === 'string'\n ? BigInt(value)\n : typeof value === 'number'\n ? BigInt(value)\n : value;\n if (u128 < 0) {\n throw new Error(`u128 value cannot be negative: ${u128}`);\n }\n ser.serializeU128(u128);\n break;\n\n case 'u256':\n if (typeof value !== 'bigint') {\n throw new Error(`Expected bigint for u256, got ${typeof value}`);\n }\n ser.serializeU256(value);\n break;\n\n case 'bool':\n if (typeof value !== 'boolean') {\n throw new Error(`Expected boolean, got ${typeof value}`);\n }\n ser.serializeBool(value);\n break;\n\n case '0x1::string::String':\n if (typeof value !== 'string') {\n throw new Error(`Expected string, got ${typeof value}`);\n }\n ser.serializeStr(value);\n break;\n\n default:\n throw new Error(`Unsupported type: ${type}`);\n }\n\n return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);\n },\n []\n );\n\n // Serializes transaction arguments based on parameter types\n const serializeArgsFromTypes = useCallback(\n (args: any[], paramTypes: string[]): Uint8Array[] => {\n if (args.length !== paramTypes.length) {\n throw new Error(\n `Argument count mismatch: expected ${paramTypes.length}, got ${args.length}`\n );\n }\n\n return args.map((arg, index) => {\n try {\n // Remove &signer from param types (first param is usually &signer)\n const paramType = paramTypes[index].replace('&signer', '').trim();\n return serializeValueByType(arg, paramType);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to serialize argument ${index} (${paramTypes[index]}): ${errorMessage}`\n );\n }\n });\n },\n [serializeValueByType]\n );\n\n const fetchModuleABI = useCallback(\n async (moduleAddress: string, moduleName: string, rpcUrl?: string): Promise<ModuleABI> => {\n const storedABI = getStoredABI(moduleAddress, moduleName);\n if (storedABI) {\n return storedABI;\n }\n\n const baseUrl =\n rpcUrl ||\n (process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID === '8'\n ? 'https://rpc-mainnet.supra.com'\n : 'https://rpc-testnet.supra.com');\n\n const url = `${baseUrl}/rpc/v3/accounts/${moduleAddress}/modules/${moduleName}`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch ABI: ${response.statusText}`);\n }\n const data = await response.json();\n return data.abi as ModuleABI;\n } catch (error) {\n console.error('Error fetching module ABI:', error);\n throw new Error(\n `Failed to fetch module ABI: ${error instanceof Error ? error.message : String(error)\n }`\n );\n }\n },\n []\n );\n\n // Extracts function parameter types from module ABI\n const getFunctionParamTypes = useCallback(\n async (\n moduleAddress: string,\n moduleName: string,\n functionName: string,\n rpcUrl?: string\n ): Promise<string[]> => {\n const moduleABI = await fetchModuleABI(moduleAddress, moduleName, rpcUrl);\n\n if (!moduleABI.exposed_functions) {\n throw new Error('Invalid module ABI response');\n }\n\n const functionDef = moduleABI.exposed_functions.find(\n (func: any) => func.name === functionName\n );\n\n if (!functionDef) {\n throw new Error(`Function ${functionName} not found in module ${moduleName}`);\n }\n\n // Remove all `signer` and `&signer` from argument list because the Move VM injects those arguments. Clients do not\n // need to care about those args. `signer` and `&signer` are required be in the front of the argument list.\n return functionDef.params.filter((param: string) => {\n const trimmed = param.trim();\n return trimmed !== 'signer' && trimmed !== '&signer';\n });\n },\n [fetchModuleABI]\n );\n\n // Function to Fetch ABI and serialize arguments\n const serializeTransactionArgs = useCallback(\n async (\n args: any[],\n moduleAddress: string,\n moduleName: string,\n functionName: string,\n rpcUrl?: string\n ): Promise<Uint8Array[]> => {\n const paramTypes = await getFunctionParamTypes(\n moduleAddress,\n moduleName,\n functionName,\n rpcUrl\n );\n\n return serializeArgsFromTypes(args, paramTypes);\n },\n [getFunctionParamTypes, serializeArgsFromTypes]\n );\n\n return {\n stringToUint8Array,\n addressToUint8Array,\n serializeString,\n serializeUint8,\n serializeUint16,\n serializeUint32,\n serializeUint64,\n serializeUint128,\n serializeU256,\n serializeBool,\n serializeVector,\n deserializeString,\n deserializeVector,\n hexToString,\n stringToHex,\n // ABI-based serialization\n serializeValueByType,\n serializeArgsFromTypes,\n fetchModuleABI,\n getFunctionParamTypes,\n serializeTransactionArgs, // Main function to use\n };\n};\n\nexport default useConversionUtils;\n","import { type ModuleABI } from \"../abiStorage\";\n\nexport const supraAccountABI: ModuleABI = {\n address: \"0x1\",\n name: \"supra_account\",\n friends: [\n \"0x1::genesis\",\n \"0x1::resource_account\",\n \"0x1::transaction_fee\",\n \"0x1::transaction_validation\",\n ],\n exposed_functions: [\n {\n name: \"assert_account_exists\",\n visibility: \"public\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"address\"],\n return: [],\n },\n {\n name: \"assert_account_is_registered_for_apt\",\n visibility: \"public\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"address\"],\n return: [],\n },\n {\n name: \"assert_account_is_registered_for_supra\",\n visibility: \"public\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"address\"],\n return: [],\n },\n {\n name: \"batch_transfer\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [],\n params: [\"&signer\", \"vector<address>\", \"vector<u64>\"],\n return: [],\n },\n {\n name: \"batch_transfer_coins\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [{ constraints: [] }],\n params: [\"&signer\", \"vector<address>\", \"vector<u64>\"],\n return: [],\n },\n {\n name: \"burn_from_fungible_store\",\n visibility: \"friend\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"&0x1::fungible_asset::BurnRef\", \"address\", \"u64\"],\n return: [],\n },\n {\n name: \"can_receive_direct_coin_transfers\",\n visibility: \"public\",\n is_entry: false,\n is_view: true,\n generic_type_params: [],\n params: [\"address\"],\n return: [\"bool\"],\n },\n {\n name: \"create_account\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [],\n params: [\"address\"],\n return: [],\n },\n {\n name: \"deposit_coins\",\n visibility: \"public\",\n is_entry: false,\n is_view: false,\n generic_type_params: [{ constraints: [] }],\n params: [\"address\", \"0x1::coin::Coin<T0>\"],\n return: [],\n },\n {\n name: \"is_fungible_balance_at_least\",\n visibility: \"friend\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"address\", \"u64\"],\n return: [\"bool\"],\n },\n {\n name: \"register_supra\",\n visibility: \"friend\",\n is_entry: false,\n is_view: false,\n generic_type_params: [],\n params: [\"&signer\"],\n return: [],\n },\n {\n name: \"set_allow_direct_coin_transfers\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [],\n params: [\"&signer\", \"bool\"],\n return: [],\n },\n {\n name: \"transfer\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [],\n params: [\"&signer\", \"address\", \"u64\"],\n return: [],\n },\n {\n name: \"transfer_coins\",\n visibility: \"public\",\n is_entry: true,\n is_view: false,\n generic_type_params: [{ constraints: [] }],\n params: [\"&signer\", \"address\", \"u64\"],\n return: [],\n },\n ],\n structs: [\n {\n name: \"DirectCoinTransferConfigUpdated\",\n is_native: false,\n abilities: [\"drop\", \"store\"],\n generic_type_params: [],\n fields: [\n { name: \"account\", type: \"address\" },\n { name: \"new_allow_direct_transfers\", type: \"bool\" },\n ],\n },\n {\n name: \"DirectCoinTransferConfigUpdatedEvent\",\n is_native: false,\n abilities: [\"drop\", \"store\"],\n generic_type_params: [],\n fields: [{ name: \"new_allow_direct_transfers\", type: \"bool\" }],\n },\n {\n name: \"DirectTransferConfig\",\n is_native: false,\n abilities: [\"key\"],\n generic_type_params: [],\n fields: [\n { name: \"allow_arbitrary_coin_transfers\", type: \"bool\" },\n {\n name: \"update_coin_transfer_events\",\n type: \"0x1::event::EventHandle<0x1::supra_account::DirectCoinTransferConfigUpdatedEvent>\",\n },\n ],\n },\n ],\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function standardizeAddress(address: string) {\n let cleanAddress = address.replace(/^0x/, \"\");\n if (cleanAddress.length < 64) {\n cleanAddress = cleanAddress.padStart(64, \"0\");\n }\n if (cleanAddress.length > 64) {\n throw new Error(`Address ${address} is not a valid address`);\n }\n return `0x${cleanAddress}`;\n}\n","import { supraAccountABI } from \"./abis/supra_account\";\nimport { standardizeAddress } from \"./utils\";\n\nexport interface ModuleABI {\n address: string;\n name: string;\n friends?: string[];\n exposed_functions: Array<{\n name: string;\n visibility?: string;\n is_entry?: boolean;\n is_view?: boolean;\n generic_type_params?: Array<{ constraints?: any[] }>;\n params: string[];\n return?: string[];\n }>;\n structs?: Array<{\n name: string;\n is_native?: boolean;\n abilities?: string[];\n generic_type_params?: any[];\n fields?: Array<{ name: string; type: string }>;\n }>;\n}\n\nexport interface ABIStorage {\n [moduleAddress: string]: {\n [moduleName: string]: ModuleABI;\n };\n}\n\n// Abi storage\n// always standardize address for consistency\nexport const abiStorage: ABIStorage = {\n [standardizeAddress(\"0x1\")]: {\n supra_account: supraAccountABI,\n },\n};\n\nexport function getStoredABI(\n moduleAddress: string,\n moduleName: string\n): ModuleABI | null {\n // Standardize address to match storage keys (always 64 chars + 0x)\n const standardizedAddress = standardizeAddress(moduleAddress);\n const normalizedName = moduleName;\n\n if (abiStorage[standardizedAddress]?.[normalizedName]) {\n return abiStorage[standardizedAddress][normalizedName];\n }\n\n return null;\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\";\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPortal>\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n </DialogPortal>\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport { Toaster as Sonner } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\n\nconst Toaster = ({ theme = \"system\", ...props }: ToasterProps) => {\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n","// Export wallet icon paths\n// These can be used directly in img src attributes\n// @ts-expect-error - image imports handled by bundler\nimport starkeyIcon from './Starkey.png';\n// @ts-expect-error - image imports handled by bundler\nimport ribbitIcon from './Ribbit.jpg';\n\nexport const WALLET_ICONS = {\n starkey: starkeyIcon,\n ribbit: ribbitIcon,\n} as const;\n\nexport { starkeyIcon, ribbitIcon };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,aAAAA,YAAW,YAAAC,WAAU,eAAAC,oBAA4B;;;ACA1D,YAAY,WAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAS;;;ACJlB,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AACxC,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC/B;;;ADgBQ,cA2BI,YA3BJ;AAbR,IAAM,SAAyB;AAI/B,IAAM,eAA+B;AAIrC,IAAM,gBAAsB,iBAG1B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAnBL,IAmBG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,6BAAC,gBACG;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR,GACJ;AAAA,CACH;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,gBAAsB,iBAG1B,CAAC,IAAmC,QAAK;AAAxC,eAAE,aAAW,SApChB,IAoCG,IAA0B,kBAA1B,IAA0B,CAAxB,aAAW;AACZ,8BAAC,gBACG;AAAA,wBAAC,iBAAc;AAAA,IACf;AAAA,MAAiB;AAAA,MAAhB;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,SACI,QANP;AAAA,QAQI;AAAA;AAAA,UACD,qBAAiB,uBAAhB,EAAsB,WAAU,iRAC7B;AAAA,gCAAC,KAAE,WAAU,WAAU;AAAA,YACvB,oBAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACnC;AAAA;AAAA;AAAA,IACJ;AAAA,KACJ;AAAA,CACH;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,eAAe,CAAC,OAGmB;AAHnB,eAClB;AAAA;AAAA,EA1DJ,IAyDsB,IAEf,kBAFe,IAEf;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA;AAEJ,aAAa,cAAc;AAE3B,IAAM,eAAe,CAAC,OAGmB;AAHnB,eAClB;AAAA;AAAA,EAxEJ,IAuEsB,IAEf,kBAFe,IAEf;AAAA,IADH;AAAA;AAGA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA;AAEJ,aAAa,cAAc;AAE3B,IAAM,cAAoB,iBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAxFL,IAwFG,IAAgB,kBAAhB,IAAgB,CAAd;AACD;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA,CACH;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,oBAA0B,iBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvGL,IAuGG,IAAgB,kBAAhB,IAAgB,CAAd;AACD;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,OACpD;AAAA,EACR;AAAA,CACH;AACD,kBAAkB,cAA8B,4BAAY;;;AD1G5D,SAAS,sBAAsB;AAC/B,SAAS,SAAAC,cAAa;;;AGLtB,YAAYC,YAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;AA2C3B,gBAAAC,YAAA;AAvCZ,IAAM,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN,SAAS;AAAA,QACL,SAAS;AAAA,QACT,aACI;AAAA,QACJ,SACI;AAAA,QACJ,WACI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACF,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACb,SAAS;AAAA,MACT,MAAM;AAAA,IACV;AAAA,EACJ;AACJ;AAQA,IAAM,SAAe;AAAA,EACjB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1C3C,IA0CK,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AACzB,UAAM,OAAO,UAAU,OAAO;AAC9B,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,SACI;AAAA,IACR;AAAA,EAER;AACJ;AACA,OAAO,cAAc;;;AH9CrB,SAAS,cAAc;AACvB;AAAA,EACI;AAAA,EACA,KAAAC;AAAA,EACA;AAAA,OACG;;;AIXP,SAAS,UAAU,WAAmB,mBAA4B;AAClE,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAGtB;AAAA,EAMI;AAAA,EAGA;AAAA,OAEG;;;ACJP,IAAM,SAAN,MAAa;AAAA,EAAb;AACI,SAAQ,gBAAgB,QAAQ,IAAI,aAAa;AAAA;AAAA,EAEzC,IAAI,OAAiB,SAAiB,SAAmC,OAAqB;AAClG,QAAI,CAAC,KAAK,iBAAiB,UAAU,SAAS;AAC1C;AAAA,IACJ;AAEA,UAAM,QAAkB;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,YAAY,UAAU,UAAU,QAAQ,QAAQ,UAAU,SAAS,QAAQ,OAAO,QAAQ;AAEhG,QAAI,OAAO;AACP,gBAAU,IAAI,MAAM,YAAY,CAAC,KAAK,OAAO,IAAI,iCAC1C,UAD0C;AAAA,QAE7C,OAAO;AAAA,UACH,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,QACjB;AAAA,MACJ,EAAC;AAAA,IACL,OAAO;AACH,gBAAU,IAAI,MAAM,YAAY,CAAC,KAAK,OAAO,IAAI,WAAW,CAAC,CAAC;AAAA,IAClE;AAAA,EACJ;AAAA,EAEA,MAAM,SAAiB,SAAyC;AAC5D,SAAK,IAAI,SAAS,SAAS,OAAO;AAAA,EACtC;AAAA,EAEA,KAAK,SAAiB,SAAyC;AAC3D,SAAK,IAAI,QAAQ,SAAS,OAAO;AAAA,EACrC;AAAA,EAEA,KAAK,SAAiB,SAAyC;AAC3D,SAAK,IAAI,QAAQ,SAAS,OAAO;AAAA,EACrC;AAAA,EAEA,MAAM,SAAiB,OAAe,SAAyC;AAC3E,SAAK,IAAI,SAAS,SAAS,SAAS,KAAK;AAAA,EAC7C;AACJ;AAEO,IAAM,SAAS,IAAI,OAAO;;;ACxD1B,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EACnC,YACI,SACgB,MACA,OAClB;AACE,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACrD;AACJ;AAKO,IAAM,wBAAN,MAAM,+BAA8B,YAAY;AAAA,EACnD,YAAY,SAAiB,OAAe;AACxC,UAAM,SAAS,2BAA2B,KAAK;AAC/C,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,uBAAsB,SAAS;AAAA,EAC/D;AACJ;AAKO,IAAM,mBAAN,MAAM,0BAAyB,YAAY;AAAA,EAC9C,YAAY,SAAiC,QAAiB,OAAe;AACzE,UAAM,SAAS,qBAAqB,KAAK;AADA;AAEzC,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,kBAAiB,SAAS;AAAA,EAC1D;AACJ;AAKO,IAAM,mBAAN,MAAM,0BAAyB,YAAY;AAAA,EAC9C,YAAY,SAAiB,OAAe;AACxC,UAAM,SAAS,sBAAsB,KAAK;AAC1C,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,kBAAiB,SAAS;AAAA,EAC1D;AACJ;AAKO,IAAM,0BAAN,MAAM,iCAAgC,YAAY;AAAA,EACrD,YAAY,YAAoB;AAC5B,UAAM,UAAU,UAAU,qBAAqB,sBAAsB;AACrE,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,yBAAwB,SAAS;AAAA,EACjE;AACJ;AAKO,IAAM,eAAN,MAAM,sBAAqB,YAAY;AAAA,EAC1C,YAAY,SAAiB,OAAe;AACxC,UAAM,SAAS,iBAAiB,KAAK;AACrC,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACtD;AACJ;;;AC5DO,SAAS,eAAe,KAAa,OAAe,gBAA6B,gBAAyB;AAC7G,QAAM,QAAuB,kBAAkB,iBACzC,CAAC,gBAAgB,kBAAkB,QAAQ,IAC3C,kBAAkB,mBAClB,CAAC,kBAAkB,gBAAgB,QAAQ,IAC3C,CAAC,UAAU,gBAAgB,gBAAgB;AAEjD,aAAW,QAAQ,OAAO;AACtB,QAAI;AACA,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,cAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACtD,mBAAO,aAAa,QAAQ,KAAK,KAAK;AACtC,mBAAO;AAAA,UACX;AACA;AAAA,QACJ,KAAK;AACD,cAAI,OAAO,WAAW,eAAe,OAAO,gBAAgB;AACxD,mBAAO,eAAe,QAAQ,KAAK,KAAK;AACxC,mBAAO;AAAA,UACX;AACA;AAAA,QACJ,KAAK;AACD,cAAI,OAAO,aAAa,aAAa;AACjC,qBAAS,SAAS,GAAG,GAAG,IAAI,mBAAmB,KAAK,CAAC,qBAAqB,KAAK,KAAK,KAAK,EAAE;AAC3F,mBAAO;AAAA,UACX;AACA;AAAA,MACR;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,KAAK,iBAAiB,GAAG,OAAO,IAAI,IAAI,EAAE,MAAM,CAAC;AAAA,IAC5D;AAAA,EACJ;AACA,SAAO;AACX;AAKO,SAAS,eAAe,KAA4B;AAEvD,MAAI;AACA,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACtD,YAAM,QAAQ,OAAO,aAAa,QAAQ,GAAG;AAC7C,UAAI,UAAU,KAAM,QAAO;AAAA,IAC/B;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,KAAK,kBAAkB,GAAG,sBAAsB,EAAE,MAAM,CAAC;AAAA,EACpE;AAGA,MAAI;AACA,QAAI,OAAO,WAAW,eAAe,OAAO,gBAAgB;AACxD,YAAM,QAAQ,OAAO,eAAe,QAAQ,GAAG;AAC/C,UAAI,UAAU,KAAM,QAAO;AAAA,IAC/B;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,KAAK,kBAAkB,GAAG,wBAAwB,EAAE,MAAM,CAAC;AAAA,EACtE;AAGA,MAAI;AACA,QAAI,OAAO,aAAa,aAAa;AACjC,YAAM,QAAQ,SAAS,OAClB,MAAM,IAAI,EACV,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG,CAAC;AACxC,UAAI,OAAO;AACP,eAAO,mBAAmB,MAAM,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,KAAK,kBAAkB,GAAG,gBAAgB,EAAE,MAAM,CAAC;AAAA,EAC9D;AAEA,SAAO;AACX;AAKO,SAAS,kBAAkB,KAAmB;AACjD,MAAI;AACA,QAAI,OAAO,WAAW,eAAe,OAAO,cAAc;AACtD,aAAO,aAAa,WAAW,GAAG;AAAA,IACtC;AAAA,EACJ,SAAS,OAAO;AAAA,EAEhB;AAEA,MAAI;AACA,QAAI,OAAO,WAAW,eAAe,OAAO,gBAAgB;AACxD,aAAO,eAAe,WAAW,GAAG;AAAA,IACxC;AAAA,EACJ,SAAS,OAAO;AAAA,EAEhB;AAEA,MAAI;AACA,QAAI,OAAO,aAAa,aAAa;AACjC,eAAS,SAAS,GAAG,GAAG;AAAA,IAC5B;AAAA,EACJ,SAAS,OAAO;AAAA,EAEhB;AACJ;;;AC/GO,IAAM,eAAe;AAAA,EACxB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,8BAA8B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,kBAAkB;AACtB;AAGO,IAAM,YAAY;AAAA,EACrB,SAAS,MAAM;AAAA;AAAA,EACf,SAAS,KAAK;AAAA;AAClB;AAGO,IAAM,WAAW;AAAA,EACpB,uBAAuB;AAAA;AAAA,EACvB,uBAAuB;AAAA;AAAA,EACvB,2BAA2B;AAAA;AAAA,EAC3B,oBAAoB;AAAA;AAAA,EACpB,uBAAuB;AAAA;AAAA,EACvB,mBAAmB;AAAA;AAAA,EACnB,qBAAqB;AAAA;AACzB;AAGO,IAAM,uBAAuB;AAAA,EAChC,SAAS;AAAA,EACT,QAAQ;AACZ;AAGO,IAAM,oBAAoB;AAAA,EAC7B,SAAS;AAAA,EACT,SAAS;AACb;AAGO,IAAM,iBAAiB;AAAA,EAC1B,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AACrB;AAGO,IAAM,sBAAsB;AAAA,EAC/B,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,sBAAsB;AAC1B;;;AC1DO,SAAS,gBAAwB;AACpC,MAAI,OAAO,WAAW,eAAe,OAAO,UAAU,OAAO,OAAO,iBAAiB;AACjF,UAAM,QAAQ,IAAI,YAAY,CAAC;AAC/B,WAAO,OAAO,gBAAgB,KAAK;AACnC,WAAO,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAAA,EACzD;AAEA,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAC3E;;;ACEA,IAAM,gBAAwC;AAAA,EAC1C,QAAQ;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAAA,EACA,SAAS,QAAQ,IAAI,8BAA8B,kBAAkB;AAAA,EACrE,eAAe,QAAQ,IAAI,aAAa;AAAA,EACxC,qBAAqB;AAAA,EACrB,wBAAwB;AAC5B;AAEA,IAAI,SAAiC,mBAAK;AAKnC,SAAS,WAAW,YAAiC;AAjC5D;AAkCI,WAAS;AAAA,IACL,QAAQ;AAAA,MACJ,WAAS,8CAAY,WAAZ,mBAAoB,YAAW,cAAc,OAAO;AAAA,MAC7D,WAAS,8CAAY,WAAZ,mBAAoB,YAAW,cAAc,OAAO;AAAA,IACjE;AAAA,IACA,UAAS,yCAAY,YAAW,cAAc;AAAA,IAC9C,gBAAe,8CAAY,kBAAZ,YAA6B,cAAc;AAAA,IAC1D,sBAAqB,yCAAY,wBAAuB,cAAc;AAAA,IACtE,yBAAwB,yCAAY,2BAA0B,cAAc;AAAA,EAChF;AACJ;AAYO,SAAS,UAAU,SAA0B;AAChD,QAAM,gBAAgB,WAAW,OAAO;AACxC,QAAM,YAAY,kBAAkB,kBAAkB;AACtD,SAAO,YAAY,OAAO,OAAO,UAAU,OAAO,OAAO;AAC7D;AAKO,SAAS,aAAqB;AACjC,SAAO,OAAO;AAClB;AAGA,WAAW;;;ANlBX,IAAM,iBAAiB;AAAA,EACnB,SAAS;AAAA,IACL,cAAc;AAAA,MACV,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACvB;AAAA,IACA,UAAU,MAAG;AA9DrB;AA+DY,oBAAO,WAAW,iBAAgB,sCAAgB,YAAhB,mBAAyB;AAAA;AAAA,EACnE;AAAA,EACA,QAAQ;AAAA,IACJ,cAAc;AAAA,MACV,aAAa;AAAA,MACb,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA;AAAA,IACvB;AAAA,IACA,UAAU,MAAM,QAAQ;AAAA,EAC5B;AACJ;AAGO,IAAM,gBAAgB;AAAA,EACzB,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,OAAO;AACX;AAGA,IAAM,sBAAsB,CAAC,eAAiC;AAC1D,iBAAe,aAAa,iBAAiB,UAAU;AAC3D;AAEA,IAAM,sBAAsB,MAAkB;AAC1C,QAAM,SAAS,eAAe,aAAa,eAAe;AAC1D,MAAI,UAAU,CAAC,WAAW,QAAQ,EAAE,SAAS,MAAM,GAAG;AAClD,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,IAAM,wBAAwB,MAAY;AACtC,oBAAkB,aAAa,eAAe;AAClD;AAEA,IAAM,sBAAsB,MAAM;AAC9B,QAAM,SAAS,UAAU;AAIzB,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAqB,SAAS;AAC1E,QAAM,CAAC,oBAAoB,qBAAqB,IAAI;AAAA,IAChD,eAAe,SAAS,EAAE;AAAA,EAC9B;AAGA,YAAU,MAAM;AACZ,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,WAAW;AACtB,wBAAkB,MAAM;AACxB,4BAAsB,eAAe,MAAM,EAAE,YAAY;AAAA,IAC7D;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACtC,eAAe,QAAQ,SAAS;AAAA,EACpC;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IACxC,eAAe,OAAO,SAAS;AAAA,EACnC;AAGA,QAAM,CAAC,sBAAsB,uBAAuB,IAChD,SAAkB,KAAK;AAC3B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAc;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAiB,EAAE;AACjD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,KAAK;AACrD,QAAM,CAAC,uBAAuB,wBAAwB,IAClD,SAAkB,KAAK;AAC3B,QAAM,CAAC,cAAc,eAAe,IAAI,SAA6B,CAAC,CAAC;AACvE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AAEjE,QAAM,kBAAkB,CAAC,SAAiB;AACtC,oBAAgB,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC;AAAA,EACjD;AAGA,QAAM,qBAAqB,MAAM;AAC7B,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,eAAO;AAAA,MACX;AAAA,MACA,KAAK,UAAU;AACX,eAAO;AAAA,MACX;AAAA,MACA,SAAS;AACL,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,0BAA0B,YAAY,YAAY;AACpD,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,cAAM,WAAW,eAAe,QAAQ,SAAS;AACjD,yBAAiB,QAAQ;AACzB,gCAAwB,CAAC,CAAC,QAAQ;AAClC,eAAO,CAAC,CAAC;AAAA,MACb;AAAA,MACA,KAAK,UAAU;AACX,cAAM,WAAW,eAAe,OAAO,SAAS;AAChD,YAAI,CAAC,UAAU;AACX,4BAAkB,IAAI;AACtB,kCAAwB,KAAK;AAC7B,iBAAO;AAAA,QACX;AAEA,YAAI;AACA,4BAAkB,QAAQ;AAC1B,kCAAwB,IAAI;AAC5B,iBAAO;AAAA,QACX,SAAS,OAAO;AACZ,iBAAO,MAAM,0CAA0C,KAAc;AACrE,4BAAkB,IAAI;AACtB,kCAAwB,KAAK;AAC7B,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,MACA,SAAS;AACL,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,iBAAiB,YAAY,YAAY;AAC3C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAEf,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,cAAc,MAAM,SAAS,QAAQ;AAC3C,gBAAM,cAAc,YAAY,SAAS,IAAI,cAAc,CAAC;AAC5D,sBAAY,WAAW;AACvB,cAAI,YAAY,SAAS,GAAG;AACxB,2BAAe,aAAa,kBAAkB,YAAY,CAAC,CAAC;AAAA,UAChE;AAEA,cAAI,YAAY,SAAS,GAAG;AACxB,kBAAMC,WAAU,MAAM,SAAS,QAAQ;AACvC,gBAAIA,UAAS;AACT,yBAAW,GAAGA,SAAQ,gBAAgB,IAAIA,SAAQ,WAAW,EAAE;AAAA,YACnE;AACA,kBAAMC,eAAc,MAAM,SAAS,WAAW;AAC9C,2BAAeA,gBAAe,CAAC,CAAC;AAAA,UACpC;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,SAAS,SAAS,cAAc;AACtC,cAAI,iCAAQ,WAAW;AACnB,wBAAY,CAAC,OAAO,aAAa,CAAC;AAClC,kBAAM,uBAA6C;AAAA,cAC/C,SAAS,SAAS,WAAW,CAAC;AAAA,cAC9B,cAAc;AAAA,cACd,UAAU;AAAA,YACd;AACA,kBAAM,aAAa,MAAM,SAAS,iBAAiB,oBAAoB;AACvE,mBAAO,MAAM,2BAA2B,EAAE,SAAS,WAAW,CAAC;AAC/D,uBAAW,IAAG,yCAAY,YAAW,CAAC,QAAQ;AAAA,UAClD,OAAO;AACH,wBAAY,CAAC,CAAC;AAAA,UAClB;AACA;AAAA,QACJ;AAAA,QACA,SAAS;AACL,sBAAY,CAAC,CAAC;AACd;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,6BAA6B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACxF,kBAAY,CAAC,CAAC;AACd,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,4BAAkB,aAAa,gBAAgB;AAC/C;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAGnB,YAAU,MAAM;AACZ,QAAI,UAAU;AAEd,UAAM,eAAe,YAAY;AAC7B,YAAM,cAAc,MAAM,wBAAwB;AAClD,UAAI,WAAW,aAAa;AACxB,uBAAe;AAAA,MACnB;AAAA,IACJ;AAEA,iBAAa;AAEb,WAAO,MAAM;AACT,gBAAU;AAAA,IACd;AAAA,EACJ,GAAG,CAAC,gBAAgB,yBAAyB,cAAc,CAAC;AAG5D,YAAU,MAAM;AACZ,UAAM,iBAAiB,YAAY;AAC/B,aAAO,MAAM,wBAAwB;AAAA,IACzC;AAGA,mBAAe,EAAE,KAAK,CAAC,gBAAgB;AACnC,UAAI,eAAe,mBAAmB,UAAU;AAC5C,uBAAe;AAAA,MACnB;AAAA,IACJ,CAAC;AAGD,UAAM,OAAO,YAAY,YAAY;AACjC,YAAM,cAAc,MAAM,eAAe;AACzC,UAAI,aAAa;AACb,sBAAc,IAAI;AAClB,YAAI,mBAAmB,UAAU;AAC7B,yBAAe;AAAA,QACnB;AAAA,MACJ;AAAA,IACJ,GAAG,GAAI;AAEP,eAAW,MAAM;AACb,oBAAc,IAAI;AAAA,IACtB,GAAG,SAAS,qBAAqB;AAEjC,WAAO,MAAM,cAAc,IAAI;AAAA,EACnC,GAAG,CAAC,gBAAgB,gBAAgB,uBAAuB,CAAC;AAE5D,QAAM,4BAA4B,YAAY,MAAM;AAChD,UAAM,aAAa,YAAY,YAAY;AACvC,YAAM,cAAc,MAAM,wBAAwB;AAClD,UAAI,aAAa;AACb,sBAAc,UAAU;AACxB,uBAAe;AAAA,MACnB;AAAA,IACJ,GAAG,GAAG;AAEN,eAAW,MAAM,cAAc,UAAU,GAAG,SAAS,qBAAqB;AAAA,EAC9E,GAAG,CAAC,gBAAgB,uBAAuB,CAAC;AAE5C,QAAM,gBAAgB,YAAY,YAAY;AAC1C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AAC/B,iBAAW,EAAE;AACb;AAAA,IACJ;AAEA,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAMD,WAAU,MAAM,SAAS,QAAQ;AACvC,cAAIA,UAAS;AACT,uBAAW,GAAGA,SAAQ,gBAAgB,IAAIA,SAAQ,WAAW,EAAE;AAAA,UACnE;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,gBAAM,uBAA6C;AAAA,YAC/C,SAAS,SAAS,WAAW,CAAC;AAAA,YAC9B,cAAc;AAAA,YACd,UAAU;AAAA,UACd;AACA,gBAAM,aAAa,MAAM,SAAS;AAAA,YAC9B;AAAA,UACJ;AACA,iBAAO,MAAM,2BAA2B,EAAE,SAAS,WAAW,CAAC;AAC/D,qBAAW,IAAG,yCAAY,YAAW,CAAC,QAAQ;AAC9C;AAAA,QACJ;AAAA,QACA,SAAS;AACL,qBAAW,EAAE;AACb;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,4BAA4B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACvF,iBAAW,EAAE;AAAA,IACjB;AAAA,EACJ,GAAG,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,QAAM,iBAAiB,YAAY,YAAY;AAC3C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,OAAO,MAAM,SAAS,WAAW;AACvC,yBAAe,QAAQ,CAAC,CAAC;AACzB,iBAAO,QAAQ,CAAC;AAAA,QACpB;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,UAAU,SAAS,WAAW,CAAC;AACrC,gBAAM,kBAAkB,EAAE,SAAS,QAAQ,SAAS,EAAE;AACtD,yBAAe,eAAe;AAC9B,iBAAO;AAAA,QACX;AAAA,QACA,SAAS;AACL,yBAAe,CAAC,CAAC;AACjB,iBAAO,CAAC;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,8BAA8B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACzF,qBAAe,CAAC,CAAC;AACjB,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,gBAAgB,OAAO,eAA4B;AAErD,QAAI,YAAY;AACZ,2BAAqB,UAAU;AAAA,IACnC;AAEA,UAAM,WAAW,aACX,eAAe,UAAU,EAAE,SAAS,IACpC,mBAAmB;AAEzB,QAAI,CAAC,UAAU;AACX,YAAM,QAAQ,IAAI,wBAAwB,cAAc,cAAc;AACtE,aAAO,KAAK,wBAAwB,EAAE,YAAY,cAAc,eAAe,CAAC;AAChF,YAAM,MAAM,eAAe,sBAAsB;AAAA,QAC7C,aAAa,sBAAsB,cAAc,cAAc;AAAA,MACnE,CAAC;AACD,aAAO;AAAA,IACX;AAEA,eAAW,IAAI;AAEf,QAAI;AACA,cAAQ,cAAc,gBAAgB;AAAA,QAClC,KAAK,WAAW;AACZ,gBAAM,SAAS,QAAQ;AACvB,iBAAO,KAAK,oCAAoC;AAChD,gBAAM,eAAe;AACrB,gBAAM,cAAc,MAAM,SAAS,QAAQ;AAE3C,cAAI,YAAY,WAAW,GAAG;AAC1B,kBAAM,IAAI,sBAAsB,eAAe,gBAAgB;AAAA,UACnE;AAEA,cAAI,YAAY,QAAQ;AACpB,wBAAY,WAAW;AACvB,2BAAe,aAAa,mBAAmB,OAAO;AACtD,2BAAe,aAAa,kBAAkB,YAAY,CAAC,CAAC;AAE5D,mBAAO;AAAA,cACH,IAAI,YAAY,cAAc,iBAAiB;AAAA,gBAC3C,QAAQ;AAAA,kBACJ,WAAW,KAAK,IAAI;AAAA,kBACpB,SAAS,YAAY,CAAC;AAAA,gBAC1B;AAAA,cACJ,CAAC;AAAA,YACL;AAGA,mBAAO;AAAA,cACH,IAAI,YAAY,cAAc,WAAW;AAAA,gBACrC,QAAQ;AAAA,kBACJ,WAAW,KAAK,IAAI;AAAA,kBACpB,SAAS,YAAY,CAAC;AAAA,kBACtB,QAAQ;AAAA,gBACZ;AAAA,cACJ,CAAC;AAAA,YACL;AAGA,gBAAI;AACA,oBAAM,UAAU;AAChB,oBAAM,QAAQ,cAAc;AAC5B,oBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,qBAAO,MAAM,+BAA+B,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AACvE,oBAAM,oBAAoB,MAAM,SAAS,YAAY;AAAA,gBACjD,SAAS;AAAA,gBACT;AAAA,cACJ,CAAC;AAED,kBAAI,mBAAmB;AACnB,uBAAO,KAAK,sBAAsB,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AAE7D,uBAAO;AAAA,kBACH,IAAI,YAAY,cAAc,kBAAkB;AAAA,oBAC5C,QAAQ;AAAA,sBACJ,WAAW,KAAK,IAAI;AAAA,sBACpB,SAAS,YAAY,CAAC;AAAA,oBAC1B;AAAA,kBACJ,CAAC;AAAA,gBACL;AAAA,cACJ;AAAA,YACJ,SAAS,WAAW;AAChB,oBAAM,QAAQ,IAAI,iBAAiB,eAAe,gBAAgB,SAAkB;AACpF,qBAAO,MAAM,kBAAkB,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AACjE,qBAAO;AAAA,gBACH,IAAI,YAAY,cAAc,OAAO;AAAA,kBACjC,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB;AAAA,kBACJ;AAAA,gBACJ,CAAC;AAAA,cACL;AACA,oBAAM;AAAA,YACV;AAAA,UACJ;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,eAA6B;AAAA,YAC/B,MAAM;AAAA,YACN,aAAa;AAAA,YACb,MAAM,OAAO,SAAS,SAAS;AAAA,YAC/B,KAAK,OAAO,SAAS;AAAA,UACzB;AAEA,gBAAM,WAAuB,MAAM,SAAS;AAAA,YACxC;AAAA,UACJ;AAEA,cAAI,qCAAU,WAAW;AACrB,mBAAO,KAAK,mCAAmC;AAAA,UACnD;AAEA,cAAI,SAAS,iBAAiB,MAAM;AAChC,kBAAM,IAAI,sBAAsB,eAAe,gBAAgB;AAAA,UACnE;AAEA,cAAI,qCAAU,WAAW;AACrB,kBAAM,eAAe;AAErB,gBAAI,SAAS,eAAe;AACxB,0BAAY,CAAC,SAAS,aAAa,CAAC;AACpC,6BAAe,aAAa,mBAAmB,OAAO;AAEtD,qBAAO;AAAA,gBACH,IAAI,YAAY,cAAc,iBAAiB;AAAA,kBAC3C,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB,SAAS,SAAS;AAAA,kBACtB;AAAA,gBACJ,CAAC;AAAA,cACL;AAGA,qBAAO;AAAA,gBACH,IAAI,YAAY,cAAc,WAAW;AAAA,kBACrC,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB,SAAS,SAAS;AAAA,oBAClB,QAAQ;AAAA,kBACZ;AAAA,gBACJ,CAAC;AAAA,cACL;AAGA,kBAAI;AACA,sBAAM,UAAU;AAChB,sBAAM,QAAQ,cAAc;AAC5B,sBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,uBAAO,MAAM,+BAA+B,EAAE,SAAS,SAAS,cAAc,CAAC;AAC/E,sBAAM,oBAAoB,MAAM,SAAS,YAAY;AAAA,kBACjD,SAAS;AAAA,kBACT,OAAO,SAAS,KAAK;AAAA,kBACrB,SAAS,SAAS,WAAW,CAAC;AAAA,gBAClC,CAAC;AAED,oBAAI,qBAAqB,kBAAkB,UAAU;AACjD,yBAAO,KAAK,sBAAsB,EAAE,SAAS,SAAS,cAAc,CAAC;AAErE,yBAAO;AAAA,oBACH,IAAI,YAAY,cAAc,kBAAkB;AAAA,sBAC5C,QAAQ;AAAA,wBACJ,WAAW,KAAK,IAAI;AAAA,wBACpB,SAAS,SAAS;AAAA,sBACtB;AAAA,oBACJ,CAAC;AAAA,kBACL;AAAA,gBACJ,OAAO;AACH,wBAAM,IAAI,iBAAiB,kBAAkB,SAAS,eAAe,gBAAgB;AAAA,gBACzF;AAAA,cACJ,SAAS,WAAW;AAChB,sBAAM,QAAQ,IAAI,iBAAiB,eAAe,gBAAgB,SAAkB;AACpF,uBAAO,MAAM,kBAAkB,OAAO,EAAE,SAAS,SAAS,cAAc,CAAC;AACzE,uBAAO;AAAA,kBACH,IAAI,YAAY,cAAc,OAAO;AAAA,oBACjC,QAAQ;AAAA,sBACJ,WAAW,KAAK,IAAI;AAAA,sBACpB;AAAA,oBACJ;AAAA,kBACJ,CAAC;AAAA,gBACL;AACA,sBAAM;AAAA,cACV;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,kBAAM,IAAI,sBAAsB,eAAe,mBAAmB;AAAA,UACtE;AACA;AAAA,QACJ;AAAA,QACA,SAAS;AACL,gBAAM,IAAI;AAAA,YACN,GAAG,eAAe,kBAAkB,KAAK,cAAc,cAAc;AAAA,UACzE;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,YAAM,cAAc,iBAAiB,wBAC/B,QACA,IAAI,sBAAsB,eAAe,mBAAmB,KAAc;AAEhF,aAAO,MAAM,4BAA4B,aAAa;AAAA,QAClD,YAAY,cAAc;AAAA,MAC9B,CAAC;AAED,aAAO;AAAA,QACH,IAAI,YAAY,cAAc,OAAO;AAAA,UACjC,QAAQ;AAAA,YACJ,WAAW,KAAK,IAAI;AAAA,YACpB,OAAO;AAAA,UACX;AAAA,QACJ,CAAC;AAAA,MACL;AACA,aAAO;AAAA,IACX,UAAE;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAEA,QAAM,mBAAmB,YAAY;AACjC,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAEf,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,SAAS,WAAW;AAC1B;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,gBAAM,SAAS,WAAW;AAE1B;AAAA,QACJ;AAAA,MACJ;AAEA,sBAAgB;AAEhB,4BAAsB;AACtB,aAAO,KAAK,GAAG;AAAA,IACnB,SAAS,OAAO;AACZ,aAAO,MAAM,4BAA4B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACvF,sBAAgB;AAEhB,4BAAsB;AAAA,IAC1B;AAAA,EACJ;AAEA,QAAM,kBAAkB,MAAM;AAC1B,gBAAY,CAAC,CAAC;AACd,eAAW,EAAE;AACb,mBAAe,CAAC,CAAC;AAEjB,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,uBAAe,aAAa,mBAAmB,OAAO;AACtD,0BAAkB,aAAa,gBAAgB;AAC/C;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAEX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,oBAAoB,OAAO,YAAqC;AAClE,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,oBAAoB,OAAO,EAAE;AAC/D,QAAI,CAAC,KAAK,IAAI;AACV,YAAM,IAAI,aAAa,uCAAuC,OAAO,EAAE;AAAA,IAC3E;AACA,UAAM,cAAc,MAAM,KAAK,KAAK;AACpC,WAAO,YAAY;AAAA,EACvB;AAEA,QAAM,qBAAqB,OACvB,eACA,YACA,cACA,QACA,gBAAuB,CAAC,GACxB,eAAuB,KAAK,KAAK,KAAK,IAAI,IAAI,GAAI,IAAI,QACrD;AACD,UAAM,WAAW,mBAAmB;AACpC,QACI,CAAC,YACD,CAAC,SAAS,UACV,CAAC,iBACD,CAAC,cACD,CAAC;AAED;AAEJ,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,cAAI,CAAC,mBAAmB,iBAAiB;AACrC,kBAAM,IAAI,iBAAiB,kDAAkD;AAAA,UACjF;AAEA,cAAIC,eAAc,MAAM,eAAe;AACvC,gBAAM,iBAAiB,WAAW;AAClC,cAAIA,aAAY,YAAY,gBAAgB;AACxC,+BAAmB,cAAc;AACjC,kBAAM,SAAS,cAAc;AAAA,cACzB,SAAS;AAAA,YACb,CAAC;AAAA,UACL;AAEA,gBAAM,eAAe;AAAA,YACjB,SAAS,CAAC;AAAA,YACV;AAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,CAAC;AAAA,UACL;AAEA,gBAAM,OAAO,MAAM,SAAS,yBAAyB,YAAY;AACjE,gBAAM,SAAS,MAAM,SAAS,gBAAgB;AAAA,YAC1C;AAAA,YACA,MAAM,SAAS,CAAC;AAAA,YAChB,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,OAAO;AAAA,UACX,CAAC;AAED,0BAAgB,UAAU,QAAQ;AAClC,iBAAO,KAAK,iCAAiC,EAAE,QAAQ,YAAY,UAAU,CAAC;AAC9E,iBAAO;AAAA,QACX;AAAA,QACA,KAAK,UAAU;AACX,cAAI,CAAC,mBAAmB,iBAAiB;AACrC,kBAAM,IAAI,iBAAiB,kDAAkD;AAAA,UACjF;AAEA,gBAAM,iBAAiB,WAAW;AAClC,cAAI,UAAU,aAAa;AAE3B,cAAI,mBAAmB,kBAAkB,SAAS;AAC9C,sBAAU,aAAa;AAAA,UAC3B,WAAW,mBAAmB,kBAAkB,SAAS;AACrD,sBAAU,aAAa;AAAA,UAC3B;AAEA,gBAAM,gBAA+B;AAAA,YACjC,QAAQ,SAAS,CAAC;AAAA;AAAA,YAClB;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA,UAAU;AAAA;AAAA,YACV,MAAM,UAAU,CAAC;AAAA;AAAA,YACjB;AAAA,UACJ;AAEA,gBAAM,eACF,MAAM,SAAS,2BAA2B,aAAa;AAG3D,gBAAM,WACF,MAAM,SAAS,0BAA0B;AAAA,YACrC,QAAQ;AAAA,YACR;AAAA,YACA,MAAM;AAAA,cACF,aAAa,QAAQ,UAAU,KAAK,YAAY;AAAA;AAAA,YACpD;AAAA,UACJ,CAAC;AAEL,cAAI,SAAS,UAAU;AACnB,kBAAM,SAAS,SAAS,UAAU,SAAS,UAAU;AACrD,4BAAgB,MAAM;AACtB,mBAAO,KAAK,iCAAiC,EAAE,QAAQ,YAAY,SAAS,CAAC;AAC7E,mBAAO;AAAA,UACX,OAAO;AACH,kBAAM,IAAI,iBAAiB,SAAS,SAAS,eAAe,oBAAoB;AAAA,UACpF;AAAA,QACJ;AAAA,QACA,SAAS;AACL,gBAAM,IAAI;AAAA,YACN,8CAA8C,cAAc;AAAA,UAChE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,YAAM,UAAU,iBAAiB,mBAC3B,QACA,IAAI,iBAAiB,eAAe,oBAAoB,QAAW,KAAc;AACvF,aAAO,MAAM,sBAAsB,SAAS;AAAA,QACxC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AACD,YAAM;AAAA,IACV;AAAA,EACJ;AAEA,QAAM,cAAc,OAChB,SACA,OACA,SACA,YAAY,UACX;AACD,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAGf,UAAM,cAAc,SAAS,cAAc;AAE3C,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,YAAI,CAAC,mBAAmB,aAAa;AACjC,gBAAM,IAAI,iBAAiB,iDAAiD;AAAA,QAChF;AAEA,YAAI,CAAC,SAAS,UAAU,CAAC,QAAS;AAClC,YAAI,CAAC,SAAS,UAAU,SAAS;AAC7B,mBAAS,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,eAAe,aAAa,iBAAiB,MAAM,UAAU,CAAC,WAAW;AACzE;AAAA,QACJ;AAEA,uBAAe,aAAa,mBAAmB,MAAM;AAErD,YAAI;AACA,gBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,gBAAM,WAAW,MAAM,SAAS,YAAY;AAAA,YACxC,SAAS;AAAA,YACT,OAAO;AAAA,UACX,CAAC;AAED,gBAAM,EAAE,WAAW,UAAU,IAAI;AACjC,gBAAM,WAAW,KAAK,KAAK,SAAS;AAAA,YAChC,IAAI,YAAY,EAAE,OAAO,OAAO;AAAA,YAChC,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,YACtD,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,UAC1D;AAEA,yBAAe,aAAa,mBAAmB,OAAO;AACtD,iBAAO,KAAK,+BAA+B,EAAE,YAAY,UAAU,CAAC;AACpE,iBAAO,iCAAK,WAAL,EAAe,SAAS;AAAA,QACnC,SAAS,OAAO;AACZ,yBAAe,aAAa,mBAAmB,OAAO;AACtD,gBAAM,IAAI,iBAAiB,eAAe,gBAAgB,KAAc;AAAA,QAC5E;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AACX,YAAI,CAAC,mBAAmB,aAAa;AACjC,gBAAM,IAAI,iBAAiB,iDAAiD;AAAA,QAChF;AAEA,YAAI,CAAC,SAAS,UAAU,CAAC,QAAS;AAClC,YAAI,CAAC,SAAS,UAAU,SAAS;AAC7B,mBAAS,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,eAAe,aAAa,iBAAiB,MAAM,UAAU,CAAC,WAAW;AACzE;AAAA,QACJ;AAEA,uBAAe,aAAa,mBAAmB,MAAM;AAErD,YAAI;AACA,gBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AACrE,gBAAM,WAAgC,MAAM,SAAS,YAAY;AAAA,YAC7D,SAAS;AAAA,YACT,OAAO,SAAS,WAAW;AAAA,YAC3B,SAAS,SAAS,WAAW,CAAC;AAAA,UAClC,CAAC;AAED,cAAI,SAAS,YAAY,SAAS,aAAa,SAAS,WAAW;AAC/D,kBAAM,EAAE,WAAW,UAAU,IAAI;AACjC,kBAAM,WAAW,KAAK,KAAK,SAAS;AAAA,cAChC,IAAI,YAAY,EAAE,OAAO,OAAO;AAAA,cAChC,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,cACtD,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,YAC1D;AAEA,2BAAe,aAAa,mBAAmB,OAAO;AACtD,mBAAO,KAAK,+BAA+B,EAAE,YAAY,SAAS,CAAC;AACnE,mBAAO,iCAAK,WAAL,EAAe,SAAS;AAAA,UACnC,OAAO;AACH,2BAAe,aAAa,mBAAmB,OAAO;AACtD,kBAAM,IAAI,iBAAiB,SAAS,SAAS,eAAe,gBAAgB;AAAA,UAChF;AAAA,QACJ,SAAS,OAAO;AACZ,yBAAe,aAAa,mBAAmB,OAAO;AACtD,gBAAM,IAAI,iBAAiB,eAAe,gBAAgB,KAAc;AAAA,QAC5E;AAAA,MACJ;AAAA,MACA,SAAS;AACL,cAAM,IAAI;AAAA,UACN,6CAA6C,cAAc;AAAA,QAC/D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,YAAU,MAAM;AACZ,QAAI,mBAAmB,aAAa,mBAAmB,gBAAgB;AACnE,YAAM,wBAAwB,CAAC,UAAe;AAn4B1D;AAo4BgB,aAAI,0CAAO,SAAP,mBAAa,SAAb,mBAAmB,WAAW,aAAa;AAC3C,mBAAQ,oCAAO,SAAP,mBAAa,MAAM;AAAA,YACvB,KAAK,+BAA+B;AAChC,wCAA0B;AAC1B;AAAA,YACJ;AAAA,YACA,KAAK,0BAA0B;AAC3B,eAAC,YAAY;AACT,sBAAM,cAAc,MAAM,cAAc,QAAQ;AAChD,oBAAI,YAAY,QAAQ;AACpB,8BAAY,WAAW;AAEvB,yBAAO;AAAA,oBACH,IAAI,YAAY,cAAc,WAAW;AAAA,sBACrC,QAAQ;AAAA,wBACJ,WAAW,KAAK,IAAI;AAAA,wBACpB,SAAS,YAAY,CAAC;AAAA,sBAC1B;AAAA,oBACJ,CAAC;AAAA,kBACL;AAEA,wBAAM,cAAc;AACpB,wBAAM,eAAe;AAAA,gBACzB,OAAO;AACH,yBAAO,MAAM,uDAAuD;AACpE,kCAAgB;AAAA,gBAEpB;AACA,2BAAW,KAAK;AAAA,cACpB,GAAG;AACH;AAAA,YACJ;AAAA,YACA,KAAK,+BAA+B;AAChC,8BAAgB;AAChB,qBAAO,KAAK,GAAG;AACf,yBAAW,KAAK;AAChB;AAAA,YACJ;AAAA,YACA,KAAK,0BAA0B;AAC3B,yBAAW,KAAK;AAChB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,gCAA0B;AAC1B,aAAO,iBAAiB,WAAW,qBAAqB;AACxD,aAAO,MAAM,OAAO,oBAAoB,WAAW,qBAAqB;AAAA,IAC5E;AAAA,EACJ,GAAG,CAAC,gBAAgB,oBAAoB,aAAa,CAAC;AAEtD,QAAM,sBAAsB,YAAY,MAAM;AAC1C,UAAM,mBAKD,CAAC;AAGN,WAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,YAAYC,OAAM,MAAM;AAC7D,YAAM,WAAWA,QAAO,SAAS;AACjC,YAAM,cAAc,CAAC,CAAC;AAEtB,cAAQ,YAA0B;AAAA,QAC9B,KAAK,WAAW;AACZ,2BAAiB,KAAK;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,cAAcA,QAAO;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,2BAAiB,KAAK;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,cAAcA,QAAO;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB,CAAC,eAA2B;AACrD,sBAAkB,UAAU;AAC5B,0BAAsB,eAAe,UAAU,EAAE,YAAY;AAC7D,wBAAoB,UAAU;AAAA,EAClC;AAEA,SAAO;AAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,EAIJ;AACJ;AAEA,IAAO,8BAAQ;A;;;;;;;;AJt8BH,SA6ZgB,UA7ZhB,OAAAC,MAybwC,QAAAC,aAzbxC;AAnCL,IAAM,oBAAoB,aAAa;AACvC,IAAM,8BAA8B,aAAa;AA8BxD,IAAM,cAAc;AAAA,EAChB,SAAS;AAAA,IACL,MAAM;AAAA,IACN,MACI,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACd;AAAA,IAEJ,aAAa,qBAAqB;AAAA,EACtC;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,MACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACd;AAAA,IAEJ,aAAa,qBAAqB;AAAA,EACtC;AACJ;AAEO,IAAM,uBAA4D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AAEF,QAAM,oBAAoB,4BAAoB;AAC9C,QAAM,sBAAsB,kBAAkB;AAG9C,QAAM,CAAC,SAAS,UAAU,IAAIE,UAAkB,KAAK;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA6B,IAAI;AACvE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAiB,MAAM;AACjE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAO9C,CAAC,CAAC;AACJ,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA4B,IAAI;AACxE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAA4B,IAAI;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA4B,IAAI;AAC1E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAE5C,MAAM;AACR,QAAM,CAAC,0BAA0B,2BAA2B,IAAIA,UAAwB,IAAI;AAC5F,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAG5D,QAAM,sBAAsBC,aAAY,MAA2B;AAC/D,QAAI;AACA,UAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,YAAM,aAAa,eAAe,iBAAiB;AACnD,YAAM,YAAY,eAAe,2BAA2B;AAE5D,UAAI,CAAC,cAAc,CAAC,UAAW,QAAO;AAEtC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,YAAY,SAAS,SAAS;AAEpC,UAAI,MAAM,YAAY,UAAU,SAAS;AACrC,eAAO;AAAA,MACX;AAEA,aAAO,KAAK,MAAM,UAAU;AAAA,IAChC,SAAS,OAAO;AACZ,aAAO,MAAM,qCAAqC,KAAc;AAChE,aAAO;AAAA,IACX;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsBA,aAAY,YAAY;AAChD,UAAM,WAAW,kBAAkB,mBAAmB;AACtD,QAAI,CAAC,SAAU;AAEf,QAAI;AACA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAErD,cAAQ,kBAAkB,gBAAgB;AAAA,QACtC,KAAK,WAAW;AACZ,gBAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,cAAI,WAAW,QAAQ,kBAAkB;AACrC,6BAAiB,QAAQ,gBAAgB;AAAA,UAC7C;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,gBAAM,uBAAuB;AAAA,YACzB,SAAS,SAAS,QAAQ,IAAI,8BAA8B,GAAG;AAAA,YAC/D,cAAc;AAAA,YACd,UAAU;AAAA,UACd;AACA,cAAI;AACA,kBAAM,UAAU,MAAM,SAAS,iBAAiB,oBAAoB;AACpE,kBAAM,aAAa,QAAQ;AAC3B,mBAAO,MAAM,0BAA0B,EAAE,SAAS,WAAW,CAAC;AAC9D,gBAAI,YAAY;AACZ,+BAAiB,UAAU;AAAA,YAC/B;AAAA,UACJ,SAAS,OAAO;AACZ,mBAAO,MAAM,kCAAkC,KAAc;AAAA,UAEjE;AACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,mCAAmC,KAAc;AAAA,IAClE;AAAA,EACJ,GAAG,CAAC,kBAAkB,gBAAgB,kBAAkB,kBAAkB,CAAC;AAG3E,QAAM,gBAAgBA,aAAY,OAAO,eAA4B;AACjE,QAAI,YAAY;AACZ,iBAAW,IAAI;AACf,wBAAkB,UAAU;AAC5B,yBAAmB,YAAY;AAC/B,UAAI;AACA,cAAM,UAAU,MAAM,kBAAkB,cAAc,UAAU;AAChE,YAAI,SAAS;AACT,yBAAe,aAAa,eAAe,UAAU;AACrD,0BAAgB,UAAU;AAC1B,cAAI,kBAAkB,SAAS,SAAS,GAAG;AACvC,mDAAY,kBAAkB,SAAS,CAAC;AAAA,UAC5C;AAAA,QACJ;AAAA,MACJ,SAAS,OAAY;AACjB,eAAO,MAAM,4BAA4B,OAAgB,EAAE,WAAW,CAAC;AACvE,QAAAC,OAAM,MAAM,sBAAsB,MAAM,WAAW,eAAe,EAAE;AACpE,2BAAmB,MAAM;AAAA,MAC7B,UAAE;AACE,mBAAW,KAAK;AAAA,MACpB;AAAA,IACJ,OAAO;AACH,yBAAmB;AAAA,IACvB;AAAA,EACJ,GAAG,CAAC,mBAAmB,SAAS,CAAC;AAGjC,QAAM,qBAAqB,MAAM;AAC7B,UAAM,mBAAmB,iBAAiB,OAAO,CAAC,MAAM,EAAE,WAAW;AAErE,QAAI,iBAAiB,WAAW,GAAG;AAC/B,yBAAmB,IAAI;AAAA,IAC3B,WAAW,iBAAiB,WAAW,GAAG;AACtC,yBAAmB,IAAI;AAAA,IAE3B,OAAO;AACH,yBAAmB,IAAI;AAAA,IAC3B;AAAA,EACJ;AAGA,QAAM,yBAAyBD,aAAY,YAAY;AACnD,eAAW,IAAI;AACf,QAAI;AACA,YAAM,kBAAkB,iBAAiB;AACzC,qBAAe,IAAI;AACnB,uBAAiB,MAAM;AACvB;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,+BAA+B,KAAc;AAAA,IAC9D,UAAE;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAAC,mBAAmB,YAAY,CAAC;AAGpC,QAAM,yBAAyBA,aAAY,MAAM;AAC7C,UAAM,SAAS,iBAAiB,YAAY,cAAc,IAAI;AAE9D,YAAQ,iBAAiB;AAAA,MACrB,KAAK;AACD,eAAO;AAAA,UACH,OAAO,gBAAe,iCAAQ,SAAQ,QAAQ;AAAA,UAC9C,UAAU,oBAAoB;AAAA,UAC9B,YAAY;AAAA,QAChB;AAAA,MACJ,KAAK;AACD,eAAO;AAAA,UACH,OAAO;AAAA,UACP,UAAU,oBAAoB;AAAA,UAC9B,YAAY;AAAA,QAChB;AAAA,MACJ,KAAK;AACD,eAAO;AAAA,UACH,OAAO,iBAAgB,iCAAQ,KAAK,QAAQ,WAAW,QAAO,QAAQ;AAAA,UACtE,UAAU,oBAAoB;AAAA,UAC9B,YAAY;AAAA,QAChB;AAAA,MACJ,KAAK;AACD,eAAO;AAAA,UACH,OAAO;AAAA,UACP,UAAU,oBAAoB;AAAA,UAC9B,YAAY;AAAA,QAChB;AAAA,MAEJ,KAAK;AACD,eAAO;AAAA,UACH,OAAO,iBAAgB,iCAAQ,KAAK,QAAQ,WAAW,QAAO,QAAQ;AAAA,UACtE,UAAU,oBAAoB;AAAA,UAC9B,YAAY;AAAA,QAChB;AAAA,MACJ;AACI,eAAO;AAAA,IACf;AAAA,EACJ,GAAG,CAAC,iBAAiB,cAAc,CAAC;AAGpC,EAAAE,WAAU,MAAM;AACZ,UAAM,SAAS,eAAe,aAAa,aAAa;AACxD,QAAI,UAAU,CAAC,WAAW,QAAQ,EAAE,SAAS,MAAM,GAAG;AAClD,sBAAgB,MAAM;AAAA,IAC1B;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,EAAAA,WAAU,MAAM;AACZ,UAAM,eAAe,MAAM;AACvB,YAAM,UAAU,oBAAoB;AACpC,0BAAoB,OAAO;AAAA,IAC/B;AAEA,iBAAa;AACb,UAAM,WAAW,YAAY,cAAc,SAAS,qBAAqB;AACzE,UAAM,UAAU,WAAW,MAAM,cAAc,QAAQ,GAAG,SAAS,yBAAyB;AAE5F,WAAO,MAAM;AACT,oBAAc,QAAQ;AACtB,mBAAa,OAAO;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,mBAAmB,CAAC;AAGxB,EAAAA,WAAU,MAAM;AACZ,QAAI,kBAAkB,SAAS,SAAS,GAAG;AACvC,0BAAoB;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,kBAAkB,UAAU,kBAAkB,cAAc,CAAC;AAGjE,EAAAA,WAAU,MAAM;AACZ,UAAM,uBAAuB,MAAM;AAAE,yBAAmB,MAAM,SAAS;AAAA,IAAG;AAC1E,UAAM,wBAAwB,MAAM;AAChC,yBAAmB,SAAS;AAC5B,iBAAW,MAAM;AACb,2BAAmB,MAAM;AACzB,2BAAmB,KAAK;AACxB,4BAAoB;AAAA,MACxB,GAAG,SAAS,iBAAiB;AAAA,IACjC;AACA,UAAM,oBAAoB,MAAM;AAC5B,UAAI,mBAAmB,WAAW;AAC9B,2BAAmB,MAAM,sBAAsB;AAAA,MACnD,OAAO;AACH,2BAAmB,MAAM,OAAO;AAAA,MACpC;AAEA,iBAAW,MAAM;AACb,2BAAmB,KAAK;AACxB,0BAAkB,IAAI;AACtB,2BAAmB,MAAM;AACzB,mBAAW,KAAK;AAAA,MACpB,GAAG,SAAS,iBAAiB;AAAA,IACjC;AAEA,UAAM,sBAAsB,CAAC,UAAe;AAzUpD;AA0UY,WAAI,0CAAO,SAAP,mBAAa,SAAb,mBAAmB,WAAW,aAAa;AAC3C,iBAAQ,oCAAO,SAAP,mBAAa,MAAM;AAAA,UACvB,KAAK;AAAA,UACL,KAAK;AACD,uBAAW,qBAAqB,CAAC;AACjC;AAAA,UACJ,KAAK;AACD,6BAAiB,MAAM;AACvB;AAAA,QACR;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,iBAAiB,mBAAmB,oBAAoB;AAC/D,WAAO,iBAAiB,oBAAoB,qBAAqB;AACjE,WAAO,iBAAiB,gBAAgB,iBAAiB;AACzD,WAAO,iBAAiB,WAAW,mBAAmB;AAEtD,WAAO,MAAM;AACT,aAAO,oBAAoB,mBAAmB,oBAAoB;AAClE,aAAO,oBAAoB,oBAAoB,qBAAqB;AACpE,aAAO,oBAAoB,gBAAgB,iBAAiB;AAC5D,aAAO,oBAAoB,WAAW,mBAAmB;AAAA,IAC7D;AAAA,EACJ,GAAG,CAAC,eAAe,CAAC;AAGpB,EAAAA,WAAU,MAAM;AACZ,UAAM,uBAAuB,CAAC,UAAoC;AAC9D,YAAM,EAAE,SAAS,UAAU,aAAa,IAAI,MAAM;AAClD,UAAI,kBAAkB,SAAS,CAAC,MAAM,SAAS;AAC3C,uBAAe,EAAE,SAAS,UAAU,aAAa,CAAC;AAAA,MACtD;AAAA,IACJ;AAEA,WAAO,iBAAiB,mBAAmB,oBAAqC;AAChF,WAAO,MAAM;AACT,aAAO,oBAAoB,mBAAmB,oBAAqC;AAAA,IACvF;AAAA,EACJ,GAAG,CAAC,kBAAkB,QAAQ,CAAC;AAG/B,EAAAA,WAAU,MAAM;AACZ,QAAI,kBAAkB,SAAS,SAAS,GAAG;AAEvC,YAAM,yBAAyB,MAAM;AACjC,YAAI,CAAC,SAAS,QAAQ;AAClB,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,eAAS,iBAAiB,oBAAoB,sBAAsB;AACpE,YAAM,kBAAkB,YAAY,MAAM;AACtC,YAAI,CAAC,SAAS,QAAQ;AAClB,8BAAoB;AAAA,QACxB;AAAA,MACJ,GAAG,SAAS,qBAAqB;AAEjC,aAAO,MAAM;AACT,sBAAc,eAAe;AAC7B,iBAAS,oBAAoB,oBAAoB,sBAAsB;AAAA,MAC3E;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,kBAAkB,UAAU,mBAAmB,CAAC;AAGpD,EAAAA,WAAU,MAAM;AACZ,QAAI,oBAAoB,gBAAgB,oBAAoB,WAAW;AACnE,kCAA4B,KAAK,IAAI,CAAC;AACtC,yBAAmB,KAAK;AAExB,YAAM,QAAQ,WAAW,MAAM;AAC3B,2BAAmB,IAAI;AAAA,MAC3B,GAAG,SAAS,mBAAmB;AAE/B,aAAO,MAAM,aAAa,KAAK;AAAA,IACnC,OAAO;AACH,kCAA4B,IAAI;AAChC,yBAAmB,KAAK;AAAA,IAC5B;AAAA,EACJ,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,mBAAmBF,aAAY,CAAC,SAAkB;AACpD,QAAI,CAAC,MAAM;AAIP,UACI,oBAAoB,UACpB,oBAAoB,aACpB,oBAAoB,0BACpB,oBAAoB,WACnB,oBAAoB,oBAAoB,gBAAgB,oBAAoB,YAC/E;AACE,2BAAmB,KAAK;AACxB,0BAAkB,IAAI;AACtB,mBAAW,KAAK;AAChB,2BAAmB,KAAK;AACxB,oCAA4B,IAAI;AAChC,mBAAW,MAAM;AACb,6BAAmB,MAAM;AAAA,QAC7B,GAAG,GAAG;AAAA,MACV;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,iBAAiB,eAAe,CAAC;AAErC,SACI,gBAAAF,MAAA,YACK;AAAA,aAAS;AAAA,MACN,aAAa,kBAAkB,SAAS,SAAS;AAAA,MACjD,UAAU,kBAAkB;AAAA,MAC5B,SAAS,WAAW,kBAAkB;AAAA,MACtC,SAAS;AAAA,MACT;AAAA,MACA,eAAe;AAAA,MACf,kBAAkB;AAAA,IACtB,CAAC;AAAA,IAGD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,cAAc;AAAA,QAEd;AAAA,0BAAAD,KAAC,kBAAe,SAAO,MAAC,0BAAAA,KAAC,eAAY,6BAAe,GAAc;AAAA,UAClE,gBAAAA,KAAC,kBAAe,SAAO,MAAC,0BAAAA,KAAC,qBAAkB,kDAAoC,GAAoB;AAAA,UACnG,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cAKT;AAAA,oCAAoB,oBAAoB,gBAAgB,oBAAoB,cACzE,gBAAAD,KAAC,SAAI,WAAU,0BACX,0BAAAA,KAACM,IAAA,EAAE,WAAU,WAAU,GAC3B;AAAA,gBAGJ,gBAAAN,KAAC,SAAI,WAAU,IACV,8BAAoB,SACjB,gBAAAC,MAAA,YACI;AAAA,kCAAAD,KAAC,OAAE,WAAU,2DAA0D,2BAEvE;AAAA,kBAEA,gBAAAA,KAAC,SAAI,WAAU,aACV,2BAAiB,IAAI,CAAC,WAAW;AAC9B,2BACI,gBAAAA,KAAC,SAAsB,WAAU,mBAC7B,0BAAAC;AAAA,sBAAC,OAAO;AAAA,sBAAP;AAAA,wBACG,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,wBAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,wBAC5B,YAAY,EAAE,UAAU,MAAM,MAAM,YAAY;AAAA,wBAChD,SAAS,MAAM;AACX,iCAAO,cACD,cAAc,OAAO,IAAI,IACzB,OAAO,KAAK,YAAY,OAAO,IAAI,EAAE,aAAa,QAAQ;AAAA,wBACpE;AAAA,wBACA,MAAK;AAAA,wBACL,UAAU,WAAW,OAAO;AAAA,wBAC5B,cAAc,MAAM,iBAAiB,OAAO,IAAI;AAAA,wBAChD,cAAc,MAAM,iBAAiB,IAAI;AAAA,wBACzC,WAAU;AAAA,wBAEV;AAAA,0CAAAD,KAAC,SAAI,WAAU,iBACV,sBAAY,OAAO,IAAI,EAAE,MAC9B;AAAA,0BAEA,gBAAAC,MAAC,SAAI,WAAU,oBACX;AAAA,4CAAAD,KAAC,QAAG,WAAU,0BACT,sBAAY,OAAO,IAAI,EAAE,MAC9B;AAAA,4BACC,CAAC,OAAO,eACL,gBAAAA,KAAC,OAAE,WAAU,yBAAwB,+CAErC;AAAA,6BAER;AAAA,0BAEA,gBAAAA,KAAC,SAAI,WAAU,iBACV,2BAAiB,OAAO,QAAQ,OAAO,cACpC,gBAAAA,KAAC,UAAK,WAAU,yFAAwF,oBAExG,IACA,OAAO,cACP,WAAW,OAAO,SAAS,iBACvB,gBAAAA,KAAC,WAAQ,WAAU,sCAAqC,IAExD,kBAAkB,OAAO,QACrB,gBAAAA,KAAC,UAAK,WAAU,qCAAoC,qBAEpD,IAIR,gBAAAA,KAAC,gBAAa,WAAU,yBAAwB,GAExD;AAAA;AAAA;AAAA,oBACJ,KAlDM,OAAO,IAmDjB;AAAA,kBAER,CAAC,GACL;AAAA,mBAGJ,IAEgB,gBAAAA,KAAC,SAAI,WAAU,2BACzB,iBAAM;AACJ,wBAAM,YAAY,uBAAuB;AACzC,wBAAM,SAAS,iBAAiB,YAAY,cAAc,IAAI;AAE9D,yBACI,gBAAAC,MAAA,YACI;AAAA,oCAAAD,KAAC,SAAI,WAAU,qCACV,8BAAoB,aAAa,oBAAoB,yBAClD,gBAAAA,KAAC,SAAI,WAAU,qFACV,oBACG,gBAAAA,KAAC,SAAI,WAAU,8CACV,iBAAO,MACZ,GAER,IACA,oBAAoB,UACpB,gBAAAA,KAAC,SAAI,WAAU,mFACV,oBACG,gBAAAA,KAAC,SAAI,WAAU,8CACV,iBAAO,MACZ,GAER,IAEA,gBAAAC,MAAC,SAAI,WAAU,YACX;AAAA,sCAAAD,KAAC,SAAI,WAAU,kFAAiF;AAAA,sBAChG,gBAAAA,KAAC,SAAI,WAAU,qDACV,oBACG,gBAAAA,KAAC,SAAI,WAAU,8CACV,iBAAO,MACZ,GAER;AAAA,uBACJ,GAER;AAAA,oBAEA,gBAAAA,KAAC,QAAG,WAAU,yCACT,iDAAW,OAChB;AAAA,oBAEA,gBAAAA,KAAC,OAAE,WAAU,8BACR,iDAAW,UAChB;AAAA,oBAEA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,UAAQ;AAAA,wBACR,WAAU;AAAA,wBAET,iDAAW;AAAA;AAAA,oBAChB;AAAA,qBACJ;AAAA,gBAER,GAAG,GACP,GAER;AAAA;AAAA;AAAA,UACJ;AAAA;AAAA;AAAA,IACJ;AAAA,KACJ;AAER;;;AWtlBA,SAAS,YAAAO,WAAU,aAAAC,YAAmB,eAAAC,oBAA4B;AAClE,OAAOC,WAAU;AACjB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,SAAAC,cAAa;AAGtB;AAAA,EAMI,gBAAAC;AAAA,EAGA,WAAAC;AAAA,OAEG;AAkCP,IAAMC,kBAAiB;AAAA,EACnB,SAAS;AAAA,IACL,cAAc;AAAA,MACV,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,IACvB;AAAA,IACA,UAAU,MAAG;AA9DrB;AA+DY,oBAAO,WAAW,iBAAgB,sCAAgB,YAAhB,mBAAyB;AAAA;AAAA,EACnE;AAAA,EACA,QAAQ;AAAA,IACJ,cAAc;AAAA,MACV,aAAa;AAAA,MACb,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA;AAAA,IACvB;AAAA,IACA,UAAU,MAAMC,SAAQ;AAAA,EAC5B;AACJ;AAGO,IAAMC,iBAAgB;AAAA,EACzB,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,OAAO;AACX;AAGA,IAAMC,uBAAsB,CAAC,eAAiC;AAC1D,iBAAe,aAAa,iBAAiB,UAAU;AAC3D;AAEA,IAAMC,uBAAsB,MAAkB;AAC1C,QAAM,SAAS,eAAe,aAAa,eAAe;AAC1D,MAAI,UAAU,CAAC,WAAW,QAAQ,EAAE,SAAS,MAAM,GAAG;AAClD,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,IAAMC,yBAAwB,MAAY;AACtC,oBAAkB,aAAa,eAAe;AAClD;AAEA,IAAMC,uBAAsB,MAAM;AAC9B,QAAM,SAASC,WAAU;AAIzB,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAqB,SAAS;AAC1E,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA;AAAA,IAChDR,gBAAe,SAAS,EAAE;AAAA,EAC9B;AAGA,EAAAS,WAAU,MAAM;AACZ,UAAM,SAASL,qBAAoB;AACnC,QAAI,WAAW,WAAW;AACtB,wBAAkB,MAAM;AACxB,4BAAsBJ,gBAAe,MAAM,EAAE,YAAY;AAAA,IAC7D;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,eAAe,gBAAgB,IAAIQ;AAAA,IACtCR,gBAAe,QAAQ,SAAS;AAAA,EACpC;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAIQ;AAAA,IACxCR,gBAAe,OAAO,SAAS;AAAA,EACnC;AAGA,QAAM,CAAC,sBAAsB,uBAAuB,IAChDQ,UAAkB,KAAK;AAC3B,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,CAAC,CAAC;AACrD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAc;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAiB,EAAE;AACjD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,KAAK;AACrD,QAAM,CAAC,uBAAuB,wBAAwB,IAClDA,UAAkB,KAAK;AAC3B,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B,CAAC,CAAC;AACvE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAiB,EAAE;AAEjE,QAAM,kBAAkB,CAAC,SAAiB;AACtC,oBAAgB,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC;AAAA,EACjD;AAGA,QAAM,qBAAqB,MAAM;AAC7B,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,eAAO;AAAA,MACX;AAAA,MACA,KAAK,UAAU;AACX,eAAO;AAAA,MACX;AAAA,MACA,SAAS;AACL,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,0BAA0BE,aAAY,YAAY;AACpD,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,cAAM,WAAWV,gBAAe,QAAQ,SAAS;AACjD,yBAAiB,QAAQ;AACzB,gCAAwB,CAAC,CAAC,QAAQ;AAClC,eAAO,CAAC,CAAC;AAAA,MACb;AAAA,MACA,KAAK,UAAU;AACX,cAAM,WAAWA,gBAAe,OAAO,SAAS;AAChD,YAAI,CAAC,UAAU;AACX,4BAAkB,IAAI;AACtB,kCAAwB,KAAK;AAC7B,iBAAO;AAAA,QACX;AAEA,YAAI;AACA,4BAAkB,QAAQ;AAC1B,kCAAwB,IAAI;AAC5B,iBAAO;AAAA,QACX,SAAS,OAAO;AACZ,iBAAO,MAAM,0CAA0C,KAAc;AACrE,4BAAkB,IAAI;AACtB,kCAAwB,KAAK;AAC7B,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,MACA,SAAS;AACL,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,iBAAiBU,aAAY,YAAY;AAC3C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAEf,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,cAAc,MAAM,SAAS,QAAQ;AAC3C,gBAAM,cAAc,YAAY,SAAS,IAAI,cAAc,CAAC;AAC5D,sBAAY,WAAW;AACvB,cAAI,YAAY,SAAS,GAAG;AACxB,2BAAe,aAAa,kBAAkB,YAAY,CAAC,CAAC;AAAA,UAChE;AAEA,cAAI,YAAY,SAAS,GAAG;AACxB,kBAAMC,WAAU,MAAM,SAAS,QAAQ;AACvC,gBAAIA,UAAS;AACT,yBAAW,GAAGA,SAAQ,gBAAgB,IAAIA,SAAQ,WAAW,EAAE;AAAA,YACnE;AACA,kBAAMC,eAAc,MAAM,SAAS,WAAW;AAC9C,2BAAeA,gBAAe,CAAC,CAAC;AAAA,UACpC;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,SAAS,SAAS,cAAc;AACtC,cAAI,iCAAQ,WAAW;AACnB,wBAAY,CAAC,OAAO,aAAa,CAAC;AAClC,kBAAM,uBAA6C;AAAA,cAC/C,SAAS,SAAS,WAAW,CAAC;AAAA,cAC9B,cAAc;AAAA,cACd,UAAU;AAAA,YACd;AACA,kBAAM,aAAa,MAAM,SAAS,iBAAiB,oBAAoB;AACvE,mBAAO,MAAM,2BAA2B,EAAE,SAAS,WAAW,CAAC;AAC/D,uBAAW,IAAG,yCAAY,YAAW,CAAC,QAAQ;AAAA,UAClD,OAAO;AACH,wBAAY,CAAC,CAAC;AAAA,UAClB;AACA;AAAA,QACJ;AAAA,QACA,SAAS;AACL,sBAAY,CAAC,CAAC;AACd;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,6BAA6B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACxF,kBAAY,CAAC,CAAC;AACd,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,4BAAkB,aAAa,gBAAgB;AAC/C;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAGnB,EAAAH,WAAU,MAAM;AACZ,QAAI,UAAU;AAEd,UAAM,eAAe,YAAY;AAC7B,YAAM,cAAc,MAAM,wBAAwB;AAClD,UAAI,WAAW,aAAa;AACxB,uBAAe;AAAA,MACnB;AAAA,IACJ;AAEA,iBAAa;AAEb,WAAO,MAAM;AACT,gBAAU;AAAA,IACd;AAAA,EACJ,GAAG,CAAC,gBAAgB,yBAAyB,cAAc,CAAC;AAG5D,EAAAA,WAAU,MAAM;AACZ,UAAM,iBAAiB,YAAY;AAC/B,aAAO,MAAM,wBAAwB;AAAA,IACzC;AAGA,mBAAe,EAAE,KAAK,CAAC,gBAAgB;AACnC,UAAI,eAAe,mBAAmB,UAAU;AAC5C,uBAAe;AAAA,MACnB;AAAA,IACJ,CAAC;AAGD,UAAM,OAAO,YAAY,YAAY;AACjC,YAAM,cAAc,MAAM,eAAe;AACzC,UAAI,aAAa;AACb,sBAAc,IAAI;AAClB,YAAI,mBAAmB,UAAU;AAC7B,yBAAe;AAAA,QACnB;AAAA,MACJ;AAAA,IACJ,GAAG,GAAI;AAEP,eAAW,MAAM;AACb,oBAAc,IAAI;AAAA,IACtB,GAAG,SAAS,qBAAqB;AAEjC,WAAO,MAAM,cAAc,IAAI;AAAA,EACnC,GAAG,CAAC,gBAAgB,gBAAgB,uBAAuB,CAAC;AAE5D,QAAM,4BAA4BC,aAAY,MAAM;AAChD,UAAM,aAAa,YAAY,YAAY;AACvC,YAAM,cAAc,MAAM,wBAAwB;AAClD,UAAI,aAAa;AACb,sBAAc,UAAU;AACxB,uBAAe;AAAA,MACnB;AAAA,IACJ,GAAG,GAAG;AAEN,eAAW,MAAM,cAAc,UAAU,GAAG,SAAS,qBAAqB;AAAA,EAC9E,GAAG,CAAC,gBAAgB,uBAAuB,CAAC;AAE5C,QAAM,gBAAgBA,aAAY,YAAY;AAC1C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AAC/B,iBAAW,EAAE;AACb;AAAA,IACJ;AAEA,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAMC,WAAU,MAAM,SAAS,QAAQ;AACvC,cAAIA,UAAS;AACT,uBAAW,GAAGA,SAAQ,gBAAgB,IAAIA,SAAQ,WAAW,EAAE;AAAA,UACnE;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,gBAAM,uBAA6C;AAAA,YAC/C,SAAS,SAAS,WAAW,CAAC;AAAA,YAC9B,cAAc;AAAA,YACd,UAAU;AAAA,UACd;AACA,gBAAM,aAAa,MAAM,SAAS;AAAA,YAC9B;AAAA,UACJ;AACA,iBAAO,MAAM,2BAA2B,EAAE,SAAS,WAAW,CAAC;AAC/D,qBAAW,IAAG,yCAAY,YAAW,CAAC,QAAQ;AAC9C;AAAA,QACJ;AAAA,QACA,SAAS;AACL,qBAAW,EAAE;AACb;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,4BAA4B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACvF,iBAAW,EAAE;AAAA,IACjB;AAAA,EACJ,GAAG,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,QAAM,iBAAiBD,aAAY,YAAY;AAC3C,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,OAAO,MAAM,SAAS,WAAW;AACvC,yBAAe,QAAQ,CAAC,CAAC;AACzB,iBAAO,QAAQ,CAAC;AAAA,QACpB;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,UAAU,SAAS,WAAW,CAAC;AACrC,gBAAM,kBAAkB,EAAE,SAAS,QAAQ,SAAS,EAAE;AACtD,yBAAe,eAAe;AAC9B,iBAAO;AAAA,QACX;AAAA,QACA,SAAS;AACL,yBAAe,CAAC,CAAC;AACjB,iBAAO,CAAC;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,8BAA8B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACzF,qBAAe,CAAC,CAAC;AACjB,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,gBAAgB,OAAO,eAA4B;AAErD,QAAI,YAAY;AACZ,2BAAqB,UAAU;AAAA,IACnC;AAEA,UAAM,WAAW,aACXV,gBAAe,UAAU,EAAE,SAAS,IACpC,mBAAmB;AAEzB,QAAI,CAAC,UAAU;AACX,YAAM,QAAQ,IAAI,wBAAwB,cAAc,cAAc;AACtE,aAAO,KAAK,wBAAwB,EAAE,YAAY,cAAc,eAAe,CAAC;AAChF,MAAAa,OAAM,MAAM,eAAe,sBAAsB;AAAA,QAC7C,aAAa,sBAAsB,cAAc,cAAc;AAAA,MACnE,CAAC;AACD,aAAO;AAAA,IACX;AAEA,eAAW,IAAI;AAEf,QAAI;AACA,cAAQ,cAAc,gBAAgB;AAAA,QAClC,KAAK,WAAW;AACZ,gBAAM,SAAS,QAAQ;AACvB,iBAAO,KAAK,oCAAoC;AAChD,gBAAM,eAAe;AACrB,gBAAM,cAAc,MAAM,SAAS,QAAQ;AAE3C,cAAI,YAAY,WAAW,GAAG;AAC1B,kBAAM,IAAI,sBAAsB,eAAe,gBAAgB;AAAA,UACnE;AAEA,cAAI,YAAY,QAAQ;AACpB,wBAAY,WAAW;AACvB,2BAAe,aAAa,mBAAmB,OAAO;AACtD,2BAAe,aAAa,kBAAkB,YAAY,CAAC,CAAC;AAE5D,mBAAO;AAAA,cACH,IAAI,YAAYX,eAAc,iBAAiB;AAAA,gBAC3C,QAAQ;AAAA,kBACJ,WAAW,KAAK,IAAI;AAAA,kBACpB,SAAS,YAAY,CAAC;AAAA,gBAC1B;AAAA,cACJ,CAAC;AAAA,YACL;AAGA,mBAAO;AAAA,cACH,IAAI,YAAYA,eAAc,WAAW;AAAA,gBACrC,QAAQ;AAAA,kBACJ,WAAW,KAAK,IAAI;AAAA,kBACpB,SAAS,YAAY,CAAC;AAAA,kBACtB,QAAQ;AAAA,gBACZ;AAAA,cACJ,CAAC;AAAA,YACL;AAGA,gBAAI;AACA,oBAAM,UAAU;AAChB,oBAAM,QAAQ,cAAc;AAC5B,oBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,qBAAO,MAAM,+BAA+B,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AACvE,oBAAM,oBAAoB,MAAM,SAAS,YAAY;AAAA,gBACjD,SAAS;AAAA,gBACT;AAAA,cACJ,CAAC;AAED,kBAAI,mBAAmB;AACnB,uBAAO,KAAK,sBAAsB,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AAE7D,uBAAO;AAAA,kBACH,IAAI,YAAYA,eAAc,kBAAkB;AAAA,oBAC5C,QAAQ;AAAA,sBACJ,WAAW,KAAK,IAAI;AAAA,sBACpB,SAAS,YAAY,CAAC;AAAA,oBAC1B;AAAA,kBACJ,CAAC;AAAA,gBACL;AAAA,cACJ;AAAA,YACJ,SAAS,WAAW;AAChB,oBAAM,QAAQ,IAAI,iBAAiB,eAAe,gBAAgB,SAAkB;AACpF,qBAAO,MAAM,kBAAkB,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,CAAC;AACjE,qBAAO;AAAA,gBACH,IAAI,YAAYA,eAAc,OAAO;AAAA,kBACjC,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB;AAAA,kBACJ;AAAA,gBACJ,CAAC;AAAA,cACL;AACA,oBAAM;AAAA,YACV;AAAA,UACJ;AACA;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AAEX,gBAAM,eAA6B;AAAA,YAC/B,MAAM;AAAA,YACN,aAAa;AAAA,YACb,MAAM,OAAO,SAAS,SAAS;AAAA,YAC/B,KAAK,OAAO,SAAS;AAAA,UACzB;AAEA,gBAAM,WAAuB,MAAM,SAAS;AAAA,YACxC;AAAA,UACJ;AAEA,cAAI,qCAAU,WAAW;AACrB,mBAAO,KAAK,mCAAmC;AAAA,UACnD;AAEA,cAAI,SAAS,iBAAiB,MAAM;AAChC,kBAAM,IAAI,sBAAsB,eAAe,gBAAgB;AAAA,UACnE;AAEA,cAAI,qCAAU,WAAW;AACrB,kBAAM,eAAe;AAErB,gBAAI,SAAS,eAAe;AACxB,0BAAY,CAAC,SAAS,aAAa,CAAC;AACpC,6BAAe,aAAa,mBAAmB,OAAO;AAEtD,qBAAO;AAAA,gBACH,IAAI,YAAYA,eAAc,iBAAiB;AAAA,kBAC3C,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB,SAAS,SAAS;AAAA,kBACtB;AAAA,gBACJ,CAAC;AAAA,cACL;AAGA,qBAAO;AAAA,gBACH,IAAI,YAAYA,eAAc,WAAW;AAAA,kBACrC,QAAQ;AAAA,oBACJ,WAAW,KAAK,IAAI;AAAA,oBACpB,SAAS,SAAS;AAAA,oBAClB,QAAQ;AAAA,kBACZ;AAAA,gBACJ,CAAC;AAAA,cACL;AAGA,kBAAI;AACA,sBAAM,UAAU;AAChB,sBAAM,QAAQ,cAAc;AAC5B,sBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,uBAAO,MAAM,+BAA+B,EAAE,SAAS,SAAS,cAAc,CAAC;AAC/E,sBAAM,oBAAoB,MAAM,SAAS,YAAY;AAAA,kBACjD,SAAS;AAAA,kBACT,OAAO,SAAS,KAAK;AAAA,kBACrB,SAAS,SAAS,WAAW,CAAC;AAAA,gBAClC,CAAC;AAED,oBAAI,qBAAqB,kBAAkB,UAAU;AACjD,yBAAO,KAAK,sBAAsB,EAAE,SAAS,SAAS,cAAc,CAAC;AAErE,yBAAO;AAAA,oBACH,IAAI,YAAYA,eAAc,kBAAkB;AAAA,sBAC5C,QAAQ;AAAA,wBACJ,WAAW,KAAK,IAAI;AAAA,wBACpB,SAAS,SAAS;AAAA,sBACtB;AAAA,oBACJ,CAAC;AAAA,kBACL;AAAA,gBACJ,OAAO;AACH,wBAAM,IAAI,iBAAiB,kBAAkB,SAAS,eAAe,gBAAgB;AAAA,gBACzF;AAAA,cACJ,SAAS,WAAW;AAChB,sBAAM,QAAQ,IAAI,iBAAiB,eAAe,gBAAgB,SAAkB;AACpF,uBAAO,MAAM,kBAAkB,OAAO,EAAE,SAAS,SAAS,cAAc,CAAC;AACzE,uBAAO;AAAA,kBACH,IAAI,YAAYA,eAAc,OAAO;AAAA,oBACjC,QAAQ;AAAA,sBACJ,WAAW,KAAK,IAAI;AAAA,sBACpB;AAAA,oBACJ;AAAA,kBACJ,CAAC;AAAA,gBACL;AACA,sBAAM;AAAA,cACV;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,kBAAM,IAAI,sBAAsB,eAAe,mBAAmB;AAAA,UACtE;AACA;AAAA,QACJ;AAAA,QACA,SAAS;AACL,gBAAM,IAAI;AAAA,YACN,GAAG,eAAe,kBAAkB,KAAK,cAAc,cAAc;AAAA,UACzE;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,YAAM,cAAc,iBAAiB,wBAC/B,QACA,IAAI,sBAAsB,eAAe,mBAAmB,KAAc;AAEhF,aAAO,MAAM,4BAA4B,aAAa;AAAA,QAClD,YAAY,cAAc;AAAA,MAC9B,CAAC;AAED,aAAO;AAAA,QACH,IAAI,YAAYA,eAAc,OAAO;AAAA,UACjC,QAAQ;AAAA,YACJ,WAAW,KAAK,IAAI;AAAA,YACpB,OAAO;AAAA,UACX;AAAA,QACJ,CAAC;AAAA,MACL;AACA,aAAO;AAAA,IACX,UAAE;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAEA,QAAM,mBAAmB,YAAY;AACjC,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAEf,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,gBAAM,SAAS,WAAW;AAC1B;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,gBAAM,SAAS,WAAW;AAE1B;AAAA,QACJ;AAAA,MACJ;AAEA,sBAAgB;AAEhB,MAAAG,uBAAsB;AACtB,aAAO,KAAK,GAAG;AAAA,IACnB,SAAS,OAAO;AACZ,aAAO,MAAM,4BAA4B,OAAgB,EAAE,YAAY,eAAe,CAAC;AACvF,sBAAgB;AAEhB,MAAAA,uBAAsB;AAAA,IAC1B;AAAA,EACJ;AAEA,QAAM,kBAAkB,MAAM;AAC1B,gBAAY,CAAC,CAAC;AACd,eAAW,EAAE;AACb,mBAAe,CAAC,CAAC;AAEjB,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,uBAAe,aAAa,mBAAmB,OAAO;AACtD,0BAAkB,aAAa,gBAAgB;AAC/C;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAEX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,oBAAoB,OAAO,YAAqC;AAClE,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,oBAAoB,OAAO,EAAE;AAC/D,QAAI,CAAC,KAAK,IAAI;AACV,YAAM,IAAI,aAAa,uCAAuC,OAAO,EAAE;AAAA,IAC3E;AACA,UAAM,cAAc,MAAM,KAAK,KAAK;AACpC,WAAO,YAAY;AAAA,EACvB;AAEA,QAAM,qBAAqB,OACvB,eACA,YACA,cACA,QACA,gBAAuB,CAAC,GACxB,eAAuB,KAAK,KAAK,KAAK,IAAI,IAAI,GAAI,IAAI,QACrD;AACD,UAAM,WAAW,mBAAmB;AACpC,QACI,CAAC,YACD,CAAC,SAAS,UACV,CAAC,iBACD,CAAC,cACD,CAAC;AAED;AAEJ,QAAI;AACA,cAAQ,gBAAgB;AAAA,QACpB,KAAK,WAAW;AACZ,cAAI,CAAC,mBAAmB,iBAAiB;AACrC,kBAAM,IAAI,iBAAiB,kDAAkD;AAAA,UACjF;AAEA,cAAIO,eAAc,MAAM,eAAe;AACvC,gBAAM,iBAAiB,WAAW;AAClC,cAAIA,aAAY,YAAY,gBAAgB;AACxC,+BAAmB,cAAc;AACjC,kBAAM,SAAS,cAAc;AAAA,cACzB,SAAS;AAAA,YACb,CAAC;AAAA,UACL;AAEA,gBAAM,eAAe;AAAA,YACjB,SAAS,CAAC;AAAA,YACV;AAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,CAAC;AAAA,UACL;AAEA,gBAAM,OAAO,MAAM,SAAS,yBAAyB,YAAY;AACjE,gBAAM,SAAS,MAAM,SAAS,gBAAgB;AAAA,YAC1C;AAAA,YACA,MAAM,SAAS,CAAC;AAAA,YAChB,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,OAAO;AAAA,UACX,CAAC;AAED,0BAAgB,UAAU,QAAQ;AAClC,iBAAO,KAAK,iCAAiC,EAAE,QAAQ,YAAY,UAAU,CAAC;AAC9E,iBAAO;AAAA,QACX;AAAA,QACA,KAAK,UAAU;AACX,cAAI,CAAC,mBAAmB,iBAAiB;AACrC,kBAAM,IAAI,iBAAiB,kDAAkD;AAAA,UACjF;AAEA,gBAAM,iBAAiB,WAAW;AAClC,cAAI,UAAUE,cAAa;AAE3B,cAAI,mBAAmB,kBAAkB,SAAS;AAC9C,sBAAUA,cAAa;AAAA,UAC3B,WAAW,mBAAmB,kBAAkB,SAAS;AACrD,sBAAUA,cAAa;AAAA,UAC3B;AAEA,gBAAM,gBAA+B;AAAA,YACjC,QAAQ,SAAS,CAAC;AAAA;AAAA,YAClB;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA;AAAA,YACA,UAAU;AAAA;AAAA,YACV,MAAM,UAAU,CAAC;AAAA;AAAA,YACjB;AAAA,UACJ;AAEA,gBAAM,eACF,MAAM,SAAS,2BAA2B,aAAa;AAG3D,gBAAM,WACF,MAAM,SAAS,0BAA0B;AAAA,YACrC,QAAQ;AAAA,YACR;AAAA,YACA,MAAM;AAAA,cACF,aAAa,QAAQ,UAAU,KAAK,YAAY;AAAA;AAAA,YACpD;AAAA,UACJ,CAAC;AAEL,cAAI,SAAS,UAAU;AACnB,kBAAM,SAAS,SAAS,UAAU,SAAS,UAAU;AACrD,4BAAgB,MAAM;AACtB,mBAAO,KAAK,iCAAiC,EAAE,QAAQ,YAAY,SAAS,CAAC;AAC7E,mBAAO;AAAA,UACX,OAAO;AACH,kBAAM,IAAI,iBAAiB,SAAS,SAAS,eAAe,oBAAoB;AAAA,UACpF;AAAA,QACJ;AAAA,QACA,SAAS;AACL,gBAAM,IAAI;AAAA,YACN,8CAA8C,cAAc;AAAA,UAChE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,YAAM,UAAU,iBAAiB,mBAC3B,QACA,IAAI,iBAAiB,eAAe,oBAAoB,QAAW,KAAc;AACvF,aAAO,MAAM,sBAAsB,SAAS;AAAA,QACxC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AACD,YAAM;AAAA,IACV;AAAA,EACJ;AAEA,QAAM,cAAc,OAChB,SACA,OACA,SACA,YAAY,UACX;AACD,UAAM,WAAW,mBAAmB;AACpC,QAAI,CAAC,SAAU;AAGf,UAAM,cAAc,SAAS,cAAc;AAE3C,YAAQ,gBAAgB;AAAA,MACpB,KAAK,WAAW;AACZ,YAAI,CAAC,mBAAmB,aAAa;AACjC,gBAAM,IAAI,iBAAiB,iDAAiD;AAAA,QAChF;AAEA,YAAI,CAAC,SAAS,UAAU,CAAC,QAAS;AAClC,YAAI,CAAC,SAAS,UAAU,SAAS;AAC7B,mBAAS,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,eAAe,aAAa,iBAAiB,MAAM,UAAU,CAAC,WAAW;AACzE;AAAA,QACJ;AAEA,uBAAe,aAAa,mBAAmB,MAAM;AAErD,YAAI;AACA,gBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AAErE,gBAAM,WAAW,MAAM,SAAS,YAAY;AAAA,YACxC,SAAS;AAAA,YACT,OAAO;AAAA,UACX,CAAC;AAED,gBAAM,EAAE,WAAW,UAAU,IAAI;AACjC,gBAAM,WAAWC,MAAK,KAAK,SAAS;AAAA,YAChC,IAAI,YAAY,EAAE,OAAO,OAAO;AAAA,YAChC,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,YACtD,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,UAC1D;AAEA,yBAAe,aAAa,mBAAmB,OAAO;AACtD,iBAAO,KAAK,+BAA+B,EAAE,YAAY,UAAU,CAAC;AACpE,iBAAO,iCAAK,WAAL,EAAe,SAAS;AAAA,QACnC,SAAS,OAAO;AACZ,yBAAe,aAAa,mBAAmB,OAAO;AACtD,gBAAM,IAAI,iBAAiB,eAAe,gBAAgB,KAAc;AAAA,QAC5E;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AACX,YAAI,CAAC,mBAAmB,aAAa;AACjC,gBAAM,IAAI,iBAAiB,iDAAiD;AAAA,QAChF;AAEA,YAAI,CAAC,SAAS,UAAU,CAAC,QAAS;AAClC,YAAI,CAAC,SAAS,UAAU,SAAS;AAC7B,mBAAS,CAAC,IAAI;AAAA,QAClB;AACA,YAAI,eAAe,aAAa,iBAAiB,MAAM,UAAU,CAAC,WAAW;AACzE;AAAA,QACJ;AAEA,uBAAe,aAAa,mBAAmB,MAAM;AAErD,YAAI;AACA,gBAAM,aAAa,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,KAAK;AACrE,gBAAM,WAAgC,MAAM,SAAS,YAAY;AAAA,YAC7D,SAAS;AAAA,YACT,OAAO,SAAS,WAAW;AAAA,YAC3B,SAAS,SAAS,WAAW,CAAC;AAAA,UAClC,CAAC;AAED,cAAI,SAAS,YAAY,SAAS,aAAa,SAAS,WAAW;AAC/D,kBAAM,EAAE,WAAW,UAAU,IAAI;AACjC,kBAAM,WAAWA,MAAK,KAAK,SAAS;AAAA,cAChC,IAAI,YAAY,EAAE,OAAO,OAAO;AAAA,cAChC,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,cACtD,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,YAC1D;AAEA,2BAAe,aAAa,mBAAmB,OAAO;AACtD,mBAAO,KAAK,+BAA+B,EAAE,YAAY,SAAS,CAAC;AACnE,mBAAO,iCAAK,WAAL,EAAe,SAAS;AAAA,UACnC,OAAO;AACH,2BAAe,aAAa,mBAAmB,OAAO;AACtD,kBAAM,IAAI,iBAAiB,SAAS,SAAS,eAAe,gBAAgB;AAAA,UAChF;AAAA,QACJ,SAAS,OAAO;AACZ,yBAAe,aAAa,mBAAmB,OAAO;AACtD,gBAAM,IAAI,iBAAiB,eAAe,gBAAgB,KAAc;AAAA,QAC5E;AAAA,MACJ;AAAA,MACA,SAAS;AACL,cAAM,IAAI;AAAA,UACN,6CAA6C,cAAc;AAAA,QAC/D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,EAAAN,WAAU,MAAM;AACZ,QAAI,mBAAmB,aAAa,mBAAmB,gBAAgB;AACnE,YAAM,wBAAwB,CAAC,UAAe;AAn4B1D;AAo4BgB,aAAI,0CAAO,SAAP,mBAAa,SAAb,mBAAmB,WAAW,aAAa;AAC3C,mBAAQ,oCAAO,SAAP,mBAAa,MAAM;AAAA,YACvB,KAAK,+BAA+B;AAChC,wCAA0B;AAC1B;AAAA,YACJ;AAAA,YACA,KAAK,0BAA0B;AAC3B,eAAC,YAAY;AACT,sBAAM,cAAc,MAAM,cAAc,QAAQ;AAChD,oBAAI,YAAY,QAAQ;AACpB,8BAAY,WAAW;AAEvB,yBAAO;AAAA,oBACH,IAAI,YAAYP,eAAc,WAAW;AAAA,sBACrC,QAAQ;AAAA,wBACJ,WAAW,KAAK,IAAI;AAAA,wBACpB,SAAS,YAAY,CAAC;AAAA,sBAC1B;AAAA,oBACJ,CAAC;AAAA,kBACL;AAEA,wBAAM,cAAc;AACpB,wBAAM,eAAe;AAAA,gBACzB,OAAO;AACH,yBAAO,MAAM,uDAAuD;AACpE,kCAAgB;AAAA,gBAEpB;AACA,2BAAW,KAAK;AAAA,cACpB,GAAG;AACH;AAAA,YACJ;AAAA,YACA,KAAK,+BAA+B;AAChC,8BAAgB;AAChB,qBAAO,KAAK,GAAG;AACf,yBAAW,KAAK;AAChB;AAAA,YACJ;AAAA,YACA,KAAK,0BAA0B;AAC3B,yBAAW,KAAK;AAChB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,gCAA0B;AAC1B,aAAO,iBAAiB,WAAW,qBAAqB;AACxD,aAAO,MAAM,OAAO,oBAAoB,WAAW,qBAAqB;AAAA,IAC5E;AAAA,EACJ,GAAG,CAAC,gBAAgB,oBAAoB,aAAa,CAAC;AAEtD,QAAM,sBAAsBQ,aAAY,MAAM;AAC1C,UAAM,mBAKD,CAAC;AAGN,WAAO,QAAQV,eAAc,EAAE,QAAQ,CAAC,CAAC,YAAYgB,OAAM,MAAM;AAC7D,YAAM,WAAWA,QAAO,SAAS;AACjC,YAAM,cAAc,CAAC,CAAC;AAEtB,cAAQ,YAA0B;AAAA,QAC9B,KAAK,WAAW;AACZ,2BAAiB,KAAK;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,cAAcA,QAAO;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,2BAAiB,KAAK;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,cAAcA,QAAO;AAAA,UACzB,CAAC;AACD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB,CAAC,eAA2B;AACrD,sBAAkB,UAAU;AAC5B,0BAAsBhB,gBAAe,UAAU,EAAE,YAAY;AAC7D,IAAAG,qBAAoB,UAAU;AAAA,EAClC;AAEA,SAAO;AAAA;AAAA,IAEH;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,EAIJ;AACJ;AAEA,IAAOc,+BAAQX;;;AC//Bf,SAAS,eAAAY,oBAAmB;AAC5B,SAAS,OAAAC,MAAgB,uBAAuB;;;ACCzC,IAAM,kBAA6B;AAAA,EACtC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,mBAAmB;AAAA,IACf;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,WAAW,mBAAmB,aAAa;AAAA,MACpD,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;AAAA,MACzC,QAAQ,CAAC,WAAW,mBAAmB,aAAa;AAAA,MACpD,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,iCAAiC,WAAW,KAAK;AAAA,MAC1D,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;AAAA,MACzC,QAAQ,CAAC,WAAW,qBAAqB;AAAA,MACzC,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,WAAW,KAAK;AAAA,MACzB,QAAQ,CAAC,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,SAAS;AAAA,MAClB,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,WAAW,MAAM;AAAA,MAC1B,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,WAAW,WAAW,KAAK;AAAA,MACpC,QAAQ,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,qBAAqB,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;AAAA,MACzC,QAAQ,CAAC,WAAW,WAAW,KAAK;AAAA,MACpC,QAAQ,CAAC;AAAA,IACb;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACL;AAAA,MACI,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,CAAC,QAAQ,OAAO;AAAA,MAC3B,qBAAqB,CAAC;AAAA,MACtB,QAAQ;AAAA,QACJ,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,QACnC,EAAE,MAAM,8BAA8B,MAAM,OAAO;AAAA,MACvD;AAAA,IACJ;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,CAAC,QAAQ,OAAO;AAAA,MAC3B,qBAAqB,CAAC;AAAA,MACtB,QAAQ,CAAC,EAAE,MAAM,8BAA8B,MAAM,OAAO,CAAC;AAAA,IACjE;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,CAAC,KAAK;AAAA,MACjB,qBAAqB,CAAC;AAAA,MACtB,QAAQ;AAAA,QACJ,EAAE,MAAM,kCAAkC,MAAM,OAAO;AAAA,QACvD;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC3KA,SAAS,QAAAC,aAA6B;AACtC,SAAS,WAAAC,gBAAe;AAEjB,SAASC,OAAM,QAAsB;AACxC,SAAOD,SAAQD,MAAK,MAAM,CAAC;AAC/B;AAEO,SAAS,mBAAmB,SAAiB;AAChD,MAAI,eAAe,QAAQ,QAAQ,OAAO,EAAE;AAC5C,MAAI,aAAa,SAAS,IAAI;AAC1B,mBAAe,aAAa,SAAS,IAAI,GAAG;AAAA,EAChD;AACA,MAAI,aAAa,SAAS,IAAI;AAC1B,UAAM,IAAI,MAAM,WAAW,OAAO,yBAAyB;AAAA,EAC/D;AACA,SAAO,KAAK,YAAY;AAC5B;;;ACiBO,IAAM,aAAyB;AAAA,EAClC,CAAC,mBAAmB,KAAK,CAAC,GAAG;AAAA,IACzB,eAAe;AAAA,EACnB;AACJ;AAEO,SAAS,aACZ,eACA,YACgB;AA1CpB;AA4CI,QAAM,sBAAsB,mBAAmB,aAAa;AAC5D,QAAM,iBAAiB;AAEvB,OAAI,gBAAW,mBAAmB,MAA9B,mBAAkC,iBAAiB;AACnD,WAAO,WAAW,mBAAmB,EAAE,cAAc;AAAA,EACzD;AAEA,SAAO;AACX;;;AHhDA,IAAM,qBAAqB,MAAM;AAE7B,QAAM,qBAAqBG,aAAY,CAAC,qBAA6B;AACjE,WAAOC,KAAI,WAAW,IAAI,gBAAgB,WAAW,gBAAgB,CAAC;AAAA,EAC1E,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBD,aAAY,CAAC,qBAA6B;AAC9D,WAAOC,KAAI,gBAAgB,gBAAgB;AAAA,EAC/C,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsBD,aAAY,CAAC,kBAA0B;AAE/D,WAAOC,KAAI,WAAW,gBAAgB,eAAe,QAAQ,aAAa,CAAC;AAAA,EAC/E,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,CAAC,eAAuB;AAC9C,WAAOA,KAAI,gBAAgB,UAAU;AAAA,EACzC;AACA,QAAM,oBAAoB,CAAC,eAA2B;AAClD,UAAM,eAAe,IAAIA,KAAI,aAAa,UAAU;AACpD,WAAOA,KAAI,kBAAkB,cAAcA,KAAI,cAAc;AAAA,EACjE;AAGA,QAAM,iBAAiBD,aAAY,CAAC,UAA2B;AAC3D,UAAM,MAAM,OAAO,UAAU,WAAW,SAAS,OAAO,EAAE,IAAI;AAC9D,QAAI,MAAM,KAAK,MAAM,KAAK;AACtB,YAAM,IAAI,MAAM,0BAA0B,GAAG,EAAE;AAAA,IACnD;AACA,WAAOC,KAAI,eAAe,GAAG;AAAA,EACjC,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkBD,aAAY,CAAC,UAAoC;AACrE,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC3B,YAAM,SAAS,OAAO,EAAE;AAAA,IAC5B,WAAW,OAAO,UAAU,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACtB,OAAO;AACH,YAAM;AAAA,IACV;AACA,QAAI,MAAM,KAAK,MAAM,OAAO;AACxB,YAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,IACpD;AACA,WAAOC,KAAI,gBAAgB,GAAG;AAAA,EAClC,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkBD,aAAY,CAAC,UAAoC;AACrE,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC3B,YAAM,SAAS,OAAO,EAAE;AAAA,IAC5B,WAAW,OAAO,UAAU,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACtB,OAAO;AACH,YAAM;AAAA,IACV;AACA,QAAI,MAAM,KAAK,MAAM,YAAY;AAC7B,YAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,IACpD;AACA,WAAOC,KAAI,gBAAgB,GAAG;AAAA,EAClC,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkBD,aAAY,CAAC,UAAoC;AACrE,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC3B,YAAM,OAAO,KAAK;AAAA,IACtB,WAAW,OAAO,UAAU,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACtB,OAAO;AACH,YAAM;AAAA,IACV;AACA,QAAI,MAAM,GAAG;AACT,YAAM,IAAI,MAAM,iCAAiC,GAAG,EAAE;AAAA,IAC1D;AACA,WAAOC,KAAI,mBAAmB,GAAG;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAmBD,aAAY,CAAC,UAAoC;AACtE,QAAI;AACJ,QAAI,OAAO,UAAU,UAAU;AAC3B,YAAM,OAAO,KAAK;AAAA,IACtB,WAAW,OAAO,UAAU,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACtB,OAAO;AACH,YAAM;AAAA,IACV;AACA,QAAI,MAAM,GAAG;AACT,YAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,IAC3D;AACA,WAAOC,KAAI,iBAAiB,GAAG;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBD,aAAY,CAAC,UAAkB;AACjD,WAAOC,KAAI,iBAAiB,KAAK;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBD,aAAY,CAAC,UAAmB;AAClD,WAAOC,KAAI,iBAAiB,KAAK;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBD,aAAY,CAAC,QAAe,SAAuD;AACvG,UAAM,aAAa,IAAIC,KAAI,WAAW;AACtC,eAAW,sBAAsB,OAAO,MAAM;AAE9C,WAAO,QAAQ,WAAS;AACpB,UAAI,SAAS,OAAO;AAChB,mBAAW,aAAa,KAAe;AAAA,MAC3C,WAAW,SAAS,QAAQ;AACxB,mBAAW,cAAc,KAAgB;AAAA,MAC7C,WAAW,SAAS,UAAU;AAC1B,mBAAW,aAAa,KAAe;AAAA,MAC3C,WAAW,SAAS,WAAW;AAC3B,cAAM,iBAAiB,gBAAgB,eAAe,QAAQ,KAAe;AAC7E,mBAAW,oBAAoB,eAAe,OAAO;AAAA,MACzD,OAAO;AACH,mBAAW,aAAa,KAAe;AAAA,MAC3C;AAAA,IACJ,CAAC;AACD,WAAO,WAAW,SAAS;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,CAAC,KAAa,SAAiB;AAC/C,QAAI,CAAC,KAAK;AACN,aAAO;AAAA,IACX;AAEA,QAAI,SAAS,UAAU;AAGnB,UAAI;AACA,eAAO,OAAO,GAAG,EAAE,SAAS;AAAA,MAChC,SAAS,OAAO;AACZ,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,QAAI;AAEA,YAAM,WAAW,IAAI,MAAM,CAAC;AAE5B,aAAO,OAAO,KAAK,UAAU,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC;AAAA,IAC1D,SAAS,OAAO;AACZ,cAAQ,MAAM,mCAAmC,KAAK;AACtD,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,cAAc,CAAC,QAAgB;AAEjC,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,QAAQ,QAAQ,OAAO,GAAG;AAGhC,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,MAAM,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACjD,mBAAa;AAAA,IACjB;AAEA,WAAO;AAAA,EACX;AAKA,QAAM,uBAAuBD;AAAA,IACzB,CAAC,OAAY,MAAc,eAA4C;AAhL/E;AAiLY,YAAM,MAAM,cAAc,IAAIC,KAAI,WAAW;AAC7C,YAAM,oBAAoB,CAAC;AAG3B,UAAI,KAAK,WAAW,sBAAsB,GAAG;AACzC,YAAI,UAAU,QAAQ,UAAU,QAAW;AACvC,cAAI,YAAY,CAAC;AAAA,QACrB,OAAO;AACH,cAAI,YAAY,CAAC;AACjB,gBAAM,YAAY,KAAK,MAAM,IAAI,EAAE;AACnC,+BAAqB,OAAO,WAAW,GAAG;AAAA,QAC9C;AACA,eAAO,oBAAoB,IAAI,SAAS,IAAI,IAAI,WAAW,CAAC;AAAA,MAChE;AAGA,UAAI,KAAK,WAAW,SAAS,GAAG;AAE5B,cAAM,cAAc,KAAK,MAAM,eAAe;AAC9C,YAAI,CAAC,aAAa;AACd,gBAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;AAAA,QACzD;AACA,cAAM,YAAY,YAAY,CAAC;AAG/B,YAAI,cAAc,MAAM;AACpB,cAAI;AAEJ,cAAI,OAAO,UAAU,UAAU;AAE3B,kBAAM,WAAW,MAAM,WAAW,IAAI,IAAI,MAAM,MAAM,CAAC,IAAI;AAC3D,oBAAQ,IAAI;AAAA,gBACR,cAAS,MAAM,SAAS,MAAxB,mBAA2B,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,OAAM,CAAC;AAAA,YACrE;AAAA,UACJ,WAAW,iBAAiB,YAAY;AAEpC,oBAAQ;AAAA,UACZ,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE7B,oBAAQ,IAAI;AAAA,cACR,MAAM,IAAI,CAAC,SAAS;AAChB,sBAAM,KAAK,OAAO,SAAS,WAAW,SAAS,MAAM,EAAE,IAAI;AAC3D,oBAAI,KAAK,KAAK,KAAK,KAAK;AACpB,wBAAM,IAAI,MAAM,oCAAoC,EAAE,EAAE;AAAA,gBAC5D;AACA,uBAAO;AAAA,cACX,CAAC;AAAA,YACL;AAAA,UACJ,OAAO;AACH,kBAAM,IAAI;AAAA,cACN,gEAAgE,OAAO,KAAK;AAAA,YAChF;AAAA,UACJ;AAGA,cAAI,sBAAsB,MAAM,MAAM;AACtC,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,gBAAI,YAAY,MAAM,CAAC,CAAC;AAAA,UAC5B;AAAA,QACJ,OAAO;AAEH,cAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,kBAAM,IAAI;AAAA,cACN,6BAA6B,SAAS,UAAU,OAAO,KAAK;AAAA,YAChE;AAAA,UACJ;AACA,cAAI,sBAAsB,MAAM,MAAM;AACtC,qBAAW,QAAQ,OAAO;AACtB,iCAAqB,MAAM,WAAW,GAAG;AAAA,UAC7C;AAAA,QACJ;AACA,eAAO,oBAAoB,IAAI,SAAS,IAAI,IAAI,WAAW,CAAC;AAAA,MAChE;AAGA,UAAI,KAAK,WAAW,qBAAqB,GAAG;AACxC,YAAI,OAAO,UAAU,UAAU;AAC3B,gBAAM,IAAI,MAAM,mCAAmC,OAAO,KAAK,EAAE;AAAA,QACrE;AACA,cAAM,gBAAgB,gBAAgB,eAAe,QAAQ,KAAK;AAClE,YAAI,oBAAoB,cAAc,OAAO;AAC7C,eAAO,oBAAoB,IAAI,SAAS,IAAI,IAAI,WAAW,CAAC;AAAA,MAChE;AAGA,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,cAAI,OAAO,UAAU,UAAU;AAC3B,kBAAM,IAAI,MAAM,oCAAoC,OAAO,KAAK,EAAE;AAAA,UACtE;AACA,gBAAM,iBAAiB,gBAAgB,eAAe,QAAQ,KAAK;AACnE,cAAI,oBAAoB,eAAe,OAAO;AAC9C;AAAA,QAEJ,KAAK;AACD,gBAAM,KAAK,OAAO,UAAU,WAAW,SAAS,OAAO,EAAE,IAAI;AAC7D,cAAI,KAAK,KAAK,KAAK,KAAK;AACpB,kBAAM,IAAI,MAAM,0BAA0B,EAAE,EAAE;AAAA,UAClD;AACA,cAAI,YAAY,EAAE;AAClB;AAAA,QAEJ,KAAK;AACD,gBAAM,MACF,OAAO,UAAU,WACX,SAAS,OAAO,EAAE,IAClB,OAAO,UAAU,WACb,OAAO,KAAK,IACZ;AACd,cAAI,MAAM,KAAK,MAAM,OAAO;AACxB,kBAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,UACpD;AACA,cAAI,aAAa,GAAG;AACpB;AAAA,QAEJ,KAAK;AACD,gBAAM,MACF,OAAO,UAAU,WACX,SAAS,OAAO,EAAE,IAClB,OAAO,UAAU,WACb,OAAO,KAAK,IACZ;AACd,cAAI,MAAM,KAAK,MAAM,YAAY;AAC7B,kBAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,UACpD;AACA,cAAI,aAAa,GAAG;AACpB;AAAA,QAEJ,KAAK;AACD,gBAAM,MACF,OAAO,UAAU,WACX,OAAO,KAAK,IACZ,OAAO,UAAU,WACb,OAAO,KAAK,IACZ;AACd,cAAI,MAAM,GAAG;AACT,kBAAM,IAAI,MAAM,iCAAiC,GAAG,EAAE;AAAA,UAC1D;AACA,cAAI,aAAa,GAAG;AACpB;AAAA,QAEJ,KAAK;AACD,gBAAM,OACF,OAAO,UAAU,WACX,OAAO,KAAK,IACZ,OAAO,UAAU,WACb,OAAO,KAAK,IACZ;AACd,cAAI,OAAO,GAAG;AACV,kBAAM,IAAI,MAAM,kCAAkC,IAAI,EAAE;AAAA,UAC5D;AACA,cAAI,cAAc,IAAI;AACtB;AAAA,QAEJ,KAAK;AACD,cAAI,OAAO,UAAU,UAAU;AAC3B,kBAAM,IAAI,MAAM,iCAAiC,OAAO,KAAK,EAAE;AAAA,UACnE;AACA,cAAI,cAAc,KAAK;AACvB;AAAA,QAEJ,KAAK;AACD,cAAI,OAAO,UAAU,WAAW;AAC5B,kBAAM,IAAI,MAAM,yBAAyB,OAAO,KAAK,EAAE;AAAA,UAC3D;AACA,cAAI,cAAc,KAAK;AACvB;AAAA,QAEJ,KAAK;AACD,cAAI,OAAO,UAAU,UAAU;AAC3B,kBAAM,IAAI,MAAM,wBAAwB,OAAO,KAAK,EAAE;AAAA,UAC1D;AACA,cAAI,aAAa,KAAK;AACtB;AAAA,QAEJ;AACI,gBAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,MACnD;AAEA,aAAO,oBAAoB,IAAI,SAAS,IAAI,IAAI,WAAW,CAAC;AAAA,IAChE;AAAA,IACA,CAAC;AAAA,EACL;AAGA,QAAM,yBAAyBD;AAAA,IAC3B,CAAC,MAAa,eAAuC;AACjD,UAAI,KAAK,WAAW,WAAW,QAAQ;AACnC,cAAM,IAAI;AAAA,UACN,qCAAqC,WAAW,MAAM,SAAS,KAAK,MAAM;AAAA,QAC9E;AAAA,MACJ;AAEA,aAAO,KAAK,IAAI,CAAC,KAAK,UAAU;AAC5B,YAAI;AAEA,gBAAM,YAAY,WAAW,KAAK,EAAE,QAAQ,WAAW,EAAE,EAAE,KAAK;AAChE,iBAAO,qBAAqB,KAAK,SAAS;AAAA,QAC9C,SAAS,OAAO;AACZ,gBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,gBAAM,IAAI;AAAA,YACN,gCAAgC,KAAK,KAAK,WAAW,KAAK,CAAC,MAAM,YAAY;AAAA,UACjF;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA,CAAC,oBAAoB;AAAA,EACzB;AAEA,QAAM,iBAAiBA;AAAA,IACnB,OAAO,eAAuB,YAAoB,WAAwC;AACtF,YAAM,YAAY,aAAa,eAAe,UAAU;AACxD,UAAI,WAAW;AACX,eAAO;AAAA,MACX;AAEA,YAAM,UACF,WACC,QAAQ,IAAI,+BAA+B,MACtC,kCACA;AAEV,YAAM,MAAM,GAAG,OAAO,oBAAoB,aAAa,YAAY,UAAU;AAE7E,UAAI;AACA,cAAM,WAAW,MAAM,MAAM,GAAG;AAChC,YAAI,CAAC,SAAS,IAAI;AACd,gBAAM,IAAI,MAAM,wBAAwB,SAAS,UAAU,EAAE;AAAA,QACjE;AACA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,eAAO,KAAK;AAAA,MAChB,SAAS,OAAO;AACZ,gBAAQ,MAAM,8BAA8B,KAAK;AACjD,cAAM,IAAI;AAAA,UACN,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACpF;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EACL;AAGA,QAAM,wBAAwBA;AAAA,IAC1B,OACI,eACA,YACA,cACA,WACoB;AACpB,YAAM,YAAY,MAAM,eAAe,eAAe,YAAY,MAAM;AAExE,UAAI,CAAC,UAAU,mBAAmB;AAC9B,cAAM,IAAI,MAAM,6BAA6B;AAAA,MACjD;AAEA,YAAM,cAAc,UAAU,kBAAkB;AAAA,QAC5C,CAAC,SAAc,KAAK,SAAS;AAAA,MACjC;AAEA,UAAI,CAAC,aAAa;AACd,cAAM,IAAI,MAAM,YAAY,YAAY,wBAAwB,UAAU,EAAE;AAAA,MAChF;AAIA,aAAO,YAAY,OAAO,OAAO,CAAC,UAAkB;AAChD,cAAM,UAAU,MAAM,KAAK;AAC3B,eAAO,YAAY,YAAY,YAAY;AAAA,MAC/C,CAAC;AAAA,IACL;AAAA,IACA,CAAC,cAAc;AAAA,EACnB;AAGA,QAAM,2BAA2BA;AAAA,IAC7B,OACI,MACA,eACA,YACA,cACA,WACwB;AACxB,YAAM,aAAa,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,aAAO,uBAAuB,MAAM,UAAU;AAAA,IAClD;AAAA,IACA,CAAC,uBAAuB,sBAAsB;AAAA,EAClD;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EACJ;AACJ;AAEA,IAAO,6BAAQ;;;AIjff,YAAYE,YAAW;AACvB,SAAS,QAAAC,aAAY;AACrB,SAAS,OAAAC,YAA8B;AA2C3B,gBAAAC,YAAA;AAvCZ,IAAMC,kBAAiBC;AAAA,EACnB;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN,SAAS;AAAA,QACL,SAAS;AAAA,QACT,aACI;AAAA,QACJ,SACI;AAAA,QACJ,WACI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACF,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACb,SAAS;AAAA,MACT,MAAM;AAAA,IACV;AAAA,EACJ;AACJ;AAQA,IAAMC,UAAe;AAAA,EACjB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1C3C,IA0CK,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AACzB,UAAM,OAAO,UAAUC,QAAO;AAC9B,WACI,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACG,WAAWK,IAAGJ,gBAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,SACI;AAAA,IACR;AAAA,EAER;AACJ;AACAE,QAAO,cAAc;;;ACnDrB,YAAYG,YAAW;AACvB,YAAYC,sBAAqB;AACjC,SAAS,KAAAC,UAAS;AAiBV,gBAAAC,MA2BI,QAAAC,aA3BJ;AAbR,IAAMC,UAAyB;AAE/B,IAAM,gBAAgC;AAEtC,IAAMC,gBAA+B;AAErC,IAAM,cAA8B;AAEpC,IAAMC,iBAAsB,kBAG1B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAnBL,IAmBG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,yBAAAJ,KAACG,eAAA,EACG,0BAAAH;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAWK;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR,GACJ;AAAA,CACH;AACDD,eAAc,cAA8B,yBAAQ;AAEpD,IAAME,iBAAsB,kBAG1B,CAAC,IAAmC,QAAK;AAAxC,eAAE,aAAW,SApChB,IAoCG,IAA0B,kBAA1B,IAA0B,CAAxB,aAAW;AACZ,yBAAAL,MAACE,eAAA,EACG;AAAA,oBAAAH,KAACI,gBAAA,EAAc;AAAA,IACf,gBAAAH;AAAA,MAAiB;AAAA,MAAhB;AAAA,QACG;AAAA,QACA,WAAWI;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,SACI,QANP;AAAA,QAQI;AAAA;AAAA,UACD,gBAAAJ,MAAiB,wBAAhB,EAAsB,WAAU,iRAC7B;AAAA,4BAAAD,KAACO,IAAA,EAAE,WAAU,WAAU;AAAA,YACvB,gBAAAP,KAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACnC;AAAA;AAAA;AAAA,IACJ;AAAA,KACJ;AAAA,CACH;AACDM,eAAc,cAA8B,yBAAQ;AAEpD,IAAME,gBAAe,CAAC,OAGmB;AAHnB,eAClB;AAAA;AAAA,EA1DJ,IAyDsB,IAEf,kBAFe,IAEf;AAAA,IADH;AAAA;AAGA,yBAAAR;AAAA,IAAC;AAAA;AAAA,MACG,WAAWK;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA;AAEJG,cAAa,cAAc;AAE3B,IAAMC,gBAAe,CAAC,OAGmB;AAHnB,eAClB;AAAA;AAAA,EAxEJ,IAuEsB,IAEf,kBAFe,IAEf;AAAA,IADH;AAAA;AAGA,yBAAAT;AAAA,IAAC;AAAA;AAAA,MACG,WAAWK;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA;AAEJI,cAAa,cAAc;AAE3B,IAAMC,eAAoB,kBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAxFL,IAwFG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,yBAAAV;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAWK;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAAA,CACH;AACDK,aAAY,cAA8B,uBAAM;AAEhD,IAAMC,qBAA0B,kBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvGL,IAuGG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,yBAAAX;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACG;AAAA,MACA,WAAWK,IAAG,iCAAiC,SAAS;AAAA,OACpD;AAAA,EACR;AAAA,CACH;AACDM,mBAAkB,cAA8B,6BAAY;;;AC5G5D,SAAS,WAAW,cAAc;AAM1B,gBAAAC,YAAA;AAFR,IAAM,UAAU,CAAC,OAAiD;AAAjD,eAAE,UAAQ,SAN3B,IAMiB,IAAuB,kBAAvB,IAAuB,CAArB;AACf,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAU;AAAA,MACV,cAAc;AAAA,QACV,YAAY;AAAA,UACR,OACI;AAAA,UACJ,aAAa;AAAA,UACb,cACI;AAAA,UACJ,cACI;AAAA,QACR;AAAA,MACJ;AAAA,OACI;AAAA,EACR;AAER;;;AClBO,IAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,QAAQ;AACV;","names":["useEffect","useState","useCallback","toast","React","jsx","X","balance","networkData","config","jsx","jsxs","useState","useCallback","toast","useEffect","X","useState","useEffect","useCallback","nacl","useRouter","toast","SupraChainId","initSdk","WALLET_CONFIGS","initSdk","WALLET_EVENTS","setStoredWalletType","getStoredWalletType","clearStoredWalletType","useSupraMultiWallet","useRouter","useState","useEffect","useCallback","balance","networkData","toast","SupraChainId","nacl","config","useSupraMultiWallet_default","useCallback","BCS","clsx","twMerge","cn","useCallback","BCS","React","Slot","cva","jsx","buttonVariants","cva","Button","Slot","cn","React","DialogPrimitive","X","jsx","jsxs","Dialog","DialogPortal","DialogOverlay","cn","DialogContent","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","jsx"]}
|