@rango-dev/widget-embedded 0.27.2 → 0.27.3-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/constants/index.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/store/wallets.ts", "../src/services/httpService.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/utils/configs.ts", "../src/store/selectors.ts", "../src/utils/providers.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/utils/common.ts", "../src/utils/meta.ts", "../src/utils/settings.ts", "../src/store/slices/data.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/store/slices/settings.ts", "../src/store/ui.ts", "../src/libs/tabManager/tabManager.constants.ts", "../src/libs/tabManager/tabManager.ts", "../src/containers/Widget/Widget.tsx", "../src/components/AppRouter.tsx", "../src/containers/App/App.tsx", "../src/components/AppRoutes.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/constants/quote.ts", "../src/types/quote.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.ts", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/common/WatermarkedModal/WatermarkedModal.tsx", "../src/components/CustomCollapsible/CustomCollapsible.tsx", "../src/components/CustomCollapsible/CustomCollapsible.styles.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/pages/WalletsPage.tsx", "../src/components/Layout/Layout.tsx", "../src/hooks/useIframe/useIframe.ts", "../src/hooks/useIframe/useIframe.helpers.ts", "../src/hooks/useNavigateBack.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/colors.ts", "../src/utils/hash.ts", "../src/utils/queue.ts", "../src/components/common/ActivateTabAlert/ActivateTabAlert.tsx", "../src/components/common/ActivateTabModal/ActivateTabModal.tsx", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HeaderButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/InProgressTransactionBadge.tsx", "../src/components/HeaderButtons/RefreshButton.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/RefreshModal/RefreshModal.tsx", "../src/components/RefreshModal/RefreshModal.styles.ts", "../src/components/Layout/Layout.helpers.ts", "../src/components/Layout/Layout.styles.ts", "../src/components/Layout/ScrollableArea.tsx", "../src/components/Layout/PageContainer.tsx", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx", "../src/components/NoResult/NoResult.tsx", "../src/components/NoResult/NoResult.helpers.ts", "../src/components/NoResult/NoResult.styles.ts", "../src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx", "../src/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts", "../src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx", "../src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx", "../src/containers/QuoteInfo/QuoteInfo.tsx", "../src/components/Quote/Quote.tsx", "../src/containers/QuoteInfo/QuoteInfo.styles.ts", "../src/components/Quote/Quote.styles.ts", "../src/components/Quote/QuoteCostDetails.tsx", "../src/components/Quote/QuoteCostDetails.styles.ts", "../src/components/Quote/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteTrigger.tsx", "../src/hooks/useScreenDetect.ts", "../src/components/QuoteSkeleton/QuoteSkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSkeleton.styles.ts", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts", "../src/components/QuoteSkeleton/StepSkeleton.tsx", "../src/components/QuoteSkeleton/StepSkeleton.styles.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetch.ts", "../src/hooks/useFetchConfirmQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/HistoryPage.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.helpers.ts", "../src/components/HistoryGroupedList/HistoryGroupedList.styles.ts", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/utils/date.ts", "../src/pages/Home.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.tsx", "../src/components/Quotes/Quotes.tsx", "../src/components/Quotes/Quotes.styles.ts", "../src/components/Quotes/SelectStrategy.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts", "../src/containers/Inputs/Inputs.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.styles.ts", "../src/containers/Inputs/Inputs.styles.ts", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchAllQuotes.ts", "../src/pages/LanguagePage.tsx", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/pages/Routes.tsx", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/pages/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.tsx", "../src/containers/Settings/Lists.tsx", "../src/pages/SwapDetailsPage.tsx", "../src/components/SwapDetails/SwapDetails.tsx", "../src/utils/time.ts", "../src/components/SwapDetailsModal/SwapDetailsModal.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Cancel.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Delete.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.helpers.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.styles.ts", "../src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx", "../src/components/SwapDetails/SwapDetails.helpers.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/hooks/useBootstrap/useBootstrap.ts", "../src/globalStyles.ts", "../src/hooks/useFetchApiConfig.ts", "../src/hooks/useForceAutoConnect.ts", "../src/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx", "../src/containers/WidgetInfo/WidgetInfo.helpers.ts"],
4
- "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n Tokens,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteEventData,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepEventData,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n readAccountAddress,\n useWallets,\n Events as WalletEvents,\n} from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n RouteEventData,\n StepEvent,\n StepEventData,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n ConnectedWallet,\n Tokens,\n WidgetVariant,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://explorer.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type {\n OnWalletConnectionChange,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useMemo, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n onDisconnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const { updateConfig, updateSettings, fetch: fetchMeta } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const config = useAppStore().config;\n\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnWalletConnectionChange>();\n const onDisconnectWalletHandler = useRef<OnWalletConnectionChange>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n window['__rango'] = {\n config,\n dappConfig: props.config,\n };\n }\n }, [props.config]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, tokens);\n }\n } else {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const handlers = useMemo(\n () => ({\n onConnectWallet: (handler: OnWalletConnectionChange) => {\n onConnectWalletHandler.current = handler;\n },\n onDisconnectWallet: (handler: OnWalletConnectionChange) => {\n onDisconnectWalletHandler.current = handler;\n },\n }),\n []\n );\n\n return (\n <WidgetContext.Provider value={handlers}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { ProvidersOptions } from '../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../store/wallets';\nimport { matchAndGenerateProviders } from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { httpService } from '../services/httpService';\nimport {\n createTokenHash,\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, tokens) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts, tokens);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n\n const connectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n const walletSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType !== connectedWallet.walletType &&\n connectedWallet.selected\n );\n const walletNotSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType === connectedWallet.walletType &&\n !connectedWallet.selected\n );\n if (walletSelected) {\n return { ...connectedWallet, selected: false };\n } else if (walletNotSelected) {\n return { ...connectedWallet, selected: true };\n }\n\n return connectedWallet;\n }),\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, tokens, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n }))\n )\n);\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokenHash,\n TokensBalance,\n Wallet,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Asset,\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, Token, WalletDetail } from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\nimport {\n detectInstallLink,\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport { isCosmosBlockchain } from 'rango-types';\n\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\n showOnMobile,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedBlockchains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedBlockchains) {\n return null;\n }\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedBlockchains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null,\n isContractWallet: boolean\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedBlockchains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedBlockchains.length > 0;\n const isSupported = supportedBlockchains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n /*\n * Here we check given `network` is not supported by wallet\n * And also the network is known.\n */\n if (notSupportedNetworkByWallet) {\n return;\n }\n\n /*\n * In some cases we can handle unknown network by checking its address\n * pattern and act on it.\n * Example: showing our evm compatible network when the unknown network is evm.\n * Otherwise, we stop executing this function.\n */\n const isUnknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUnknownAndEvmBased) {\n return;\n }\n\n const isEvmBasedChain = evmBasedChains.includes(network);\n\n // If it's an evm network, we will add the address to all the evm chains.\n if (isEvmBasedChain || isUnknownAndEvmBased) {\n if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n retrievedBalance: WalletDetail,\n tokens: Token[]\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return (\n cosmosExperimentalChainInfo &&\n cosmosExperimentalChainInfo[wallet]?.experimental\n );\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: Wallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.usdValue || '0') -\n parseFloat(token1Balance?.usdValue || '0')\n );\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.CONNECTED) ||\n Number(\n b.state === WalletStatus.DISCONNECTED ||\n b.state === WalletStatus.CONNECTING\n ) -\n Number(\n a.state === WalletStatus.DISCONNECTED ||\n a.state === WalletStatus.CONNECTING\n )\n );\n}\n\nexport function getConciseAddress(\n address: string,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxChars = 8,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ellipsisLength = 3\n): string {\n if (address.length < 2 * maxChars + ellipsisLength) {\n return address;\n }\n const start = address.slice(0, maxChars);\n const end = address.slice(-maxChars);\n return `${start}${'.'.repeat(ellipsisLength)}${end}`;\n}\n\nexport function getAddress({\n chain,\n connectedWallets,\n walletType,\n}: {\n connectedWallets: ConnectedWallet[];\n walletType: string;\n chain: string;\n}): string | undefined {\n return connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n )?.address;\n}\n\nexport function createTokenHash(token: Asset): TokenHash {\n return `${token.blockchain}-${token.symbol}-${token.address ?? ''}`;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nimport { TOOLTIP_DECIMALS } from '../constants/routing';\n\n/*\n * if time > 1h -> rounded with 5 minutes precision\n * if time < 1h -> rounded with 15 seconds precision\n */\nexport const roundedSecondsToString = (s: number): string => {\n const seconds = Math.floor((s % 60) / 15) * 15;\n const minutes = parseInt((s / 60).toString());\n if (minutes >= 60) {\n return `${Math.floor(minutes / 5) * 5}:00`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n\nexport function formatTooltipNumbers(\n number: BigNumber | string | number | null | undefined\n) {\n return numberToString(number, TOOLTIP_DECIMALS, TOOLTIP_DECIMALS).replace(\n /(?:\\.0*|(\\.\\d+?)0*)$/,\n '$1'\n );\n}\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import { StoreApi, UseBoundStore } from 'zustand';\n\ntype State = object;\n\ntype WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nconst createSelectors = <S extends UseBoundStore<StoreApi<State>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let k of Object.keys(store.getState())) {\n (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]);\n }\n\n return store;\n};\n\nexport default createSelectors;\n", "import type { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n variant: 'default',\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import type { Token } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\n function wrapper(...args: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, time);\n }\n}\n\nexport function containsText(text: string, searchText: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { areTokensEqual } from './wallets';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => areTokensEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { Balance } from '../../types';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { isTokenExcludedInConfig } from '../../utils/configs';\nimport { isTokenNative } from '../../utils/meta';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokens: Token[];\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map<string, BlockchainMeta>(),\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const tokensFromState = get()._tokens;\n const blockchainsMapByName = get()._blockchainsMapByName;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n {};\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n if (\n supportedTokensConfig &&\n isTokenExcludedInConfig(token, supportedTokensConfig)\n ) {\n return false;\n }\n\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //3. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //4. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //5. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Chinese,\n English,\n Finland,\n French,\n German,\n Greece,\n Italian,\n Japanese,\n Netherlands,\n Poland,\n Portuguese,\n Russian,\n Spanish,\n Swedish,\n Ukrainian,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Chinese', label: '\u4E2D\u56FD\u4EBA', local: 'zh', SVGFlag: Chinese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Ukrainian', label: '\u0423\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Swedish', label: 'svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'Greek', label: 'Grieks', local: 'el', SVGFlag: Greece },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\n", "const LOW = 0.5;\nconst MEDIUM = 1;\nconst HIGH = 3;\n\nexport const SLIPPAGES = [LOW, MEDIUM, HIGH];\n\nexport const DEFAULT_SLIPPAGE = 1;\n\nexport const HIGH_SLIPPAGE = 5;\n\nexport const MAX_SLIPPAGE = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { ConfigSlice } from './config';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features, theme } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const singleTheme = theme?.singleTheme;\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(singleTheme && { theme: nextConfig.theme?.mode || 'light' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n });\n },\n});\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { PropsWithChildren } from 'react';\n\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nexport function AppRouter({ children }: PropsWithChildren) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n\n return <Router>{children}</Router>;\n}\n", "import { I18nManager } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { useBootstrap } from '../../hooks/useBootstrap';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n useBootstrap();\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <AppRoutes />\n </MainContainer>\n </I18nManager>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n ],\n },\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\nimport { areTokensEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.from?.token || null)\n );\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.to?.token || null)\n );\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type { QuoteError, QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { createRetryQuote, getQuoteToTokenUsdPrice } from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\n\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\n subscribeWithSelector((set) => ({\n fromBlockchain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toBlockchain: null,\n toToken: null,\n refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: state.toToken\n ? getUsdValue(state.toToken, state.outputAmount?.toString() || '')\n : new BigNumber(0),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n },\n tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote?.outputAmount ?? '');\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, tokens);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { SwapFee, TagValue } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport const NAME_OF_FEES: Record<NameOfFees, string> = {\n 'Network Fee': i18n.t('Network Fee'),\n 'Swapper Fee': i18n.t('Protocol Fee'),\n 'Affiliate Fee': i18n.t('Affiliate Fee'),\n 'Outbound network fee': i18n.t('Outbound Fee'),\n 'Rango Fee': i18n.t('Rango Fee'),\n};\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type {\n BlockchainValidationStatus,\n RouteTag,\n RoutingResultType,\n SwapResult,\n} from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n\nexport type QuoteResponse = {\n requestId: string;\n swaps?: SwapResult[];\n diagnosisMessages: string[] | null;\n};\n\nexport type SelectedQuote = {\n swaps: SwapResult[];\n requestId: string;\n outputAmount?: string;\n resultType?: RoutingResultType;\n tags?: RouteTag[];\n validationStatus: BlockchainValidationStatus[] | null;\n requestAmount: string;\n};\n\nexport type QuoteErrorResponse = {\n message: string;\n options: QuoteError;\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getRequiredChains } from './wallets';\n\nexport function getOutputRatio(\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n if (\n !inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)\n ) {\n return 0;\n }\n return outputUsdValue\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote\n );\n}\n\nexport function requiredWallets(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = ZERO;\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n swaps: SwapResult[],\n allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\n };\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n default:\n message = message || '';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return pendingSwap.status === 'failed';\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n", "import type { BlockchainMeta, SwapResult } from 'rango-sdk';\n\nexport function getRequiredWallets(swaps: SwapResult[] | null): string[] {\n const wallets: string[] = [];\n\n swaps?.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\n chain: BlockchainMeta,\n address: string\n): boolean {\n const regex = chain.addressPatterns;\n const valid = regex.filter((r) => new RegExp(r).test(address)).length > 0;\n return valid;\n}\n", "import type { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n searchParamToToken,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n\n const getUrlSearchParams = () => {\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl } = getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n const fromToken = searchParamToToken(\n tokens,\n searchParams.fromToken,\n fromBlockchain ?? null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n const toToken = searchParamToToken(\n tokens,\n searchParams.toToken,\n toBlockchain ?? null\n );\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nexport function searchParamToToken(\n tokens: Token[],\n searchParam: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParam?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n styled,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const location = useLocation();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const [isConfirming, setIsConfirming] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n setIsConfirming(true);\n await addNewSwap();\n setIsConfirming(false);\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain =\n selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!selectedQuote?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n quoteWalletsChanged = true;\n }\n }\n\n if (selectedQuote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!selectedQuote) {\n navigate(`../${location.search}`);\n }\n }, []);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={false}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n }}\n footer={\n <Buttons>\n <div className={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!isActiveTab}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded\n tagHidden\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { confirmSwapDisabled } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n alarmsStyles,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const config = useAppStore().config;\n\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n\n const requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!selectedQuote?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const getInitialSelectableWallets = () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n });\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const isAddressMatched =\n !!customDestination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, customDestination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setCustomDestination(null);\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\n });\n });\n };\n\n const onChange = (wallet: Wallet) => {\n if (showMoreWalletFor) {\n setShowMoreWalletFor('');\n }\n const selected = isSelected(wallet.walletType, wallet.chain);\n if (selected) {\n return;\n }\n const connectedWallet = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.walletType &&\n connectedWallet.chain === wallet.chain\n );\n\n if (!connectedWallet) {\n return;\n }\n\n onCancel();\n if (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\n return (\n <div key={key}>\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CustomCollapsible\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}\n hasSelected\n open={showCustomDestination}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() =>\n setShowCustomDestination((prev) => !prev)\n }>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={customDestination || ''}\n onChange={(e) => {\n const value = e.target.value;\n if (!value.length) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n } else {\n setCustomDestination(value.length ? value : null);\n }\n }}\n />\n </CustomCollapsible>\n\n {isAddressMatched && (\n <div className={alarmsStyles()}>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n overflow: 'hidden',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { css, darkTheme, IconButton, styled, TextField } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n outline: 0,\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral100',\n },\n});\n\nexport const alarmsStyles = css({\n paddingTop: '$5',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$0 $15 $15 $15',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomRightRadius: '0',\n borderBottomLeftRadius: '0',\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n $$background: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n", "import type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { WalletModal } from '../WalletModal';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\n const [experimentalChainWallet, setExperimentalChainWallet] =\n useState<Wallet | null>(null);\n const [showExperimentalChainModal, setShowExperimentalChainModal] =\n useState(false);\n const [addingExperimentalChainStatus, setAddingExperimentalChainStatus] =\n useState<'in-progress' | 'completed' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick, disconnectConnectingWallets } =\n useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(list);\n const numberOfSupportedWallets = list.length;\n const shouldShowMoreWallets = limit && numberOfSupportedWallets - limit > 0;\n\n const addExperimentalChain = async (wallet: Wallet) => {\n setShowExperimentalChainModal(false);\n setAddingExperimentalChainStatus('in-progress');\n try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenWalletStateModal('');\n };\n\n return (\n <>\n {sortedList.slice(0, limit).map((wallet) => {\n const address = getAddress({\n connectedWallets,\n walletType: wallet.type,\n chain,\n });\n const conciseAddress = address\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\n\n const experimentalChain = isExperimentalChain(blockchains(), chain);\n\n const experimentalChainNotAdded = !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.type &&\n connectedWallet.chain === chain\n );\n\n const couldAddExperimentalChain =\n experimentalChain &&\n experimentalChainNotAdded &&\n wallet.state === WalletState.CONNECTED;\n\n const connectedWalletDescription = couldAddExperimentalChain\n ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\n : conciseAddress;\n\n const onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\n } else if (couldAddExperimentalChain) {\n setExperimentalChainWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n setShowExperimentalChainModal(true);\n } else {\n selectWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n }\n };\n\n const blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains()\n )\n : undefined;\n return (\n <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={handleCloseWalletModal}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\n type=\"loading\"\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\n type=\"error\"\n title={i18n.t('Request Rejected')}\n description={i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n detectMobileScreens,\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n\n /** It can be what has been set by widget config or as a fallback we use all the supported wallets by our library */\n const listAvailableWalletTypes =\n configWalletsToWalletName(config?.wallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n let wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n wallets = detectMobileScreens()\n ? wallets.filter(\n (wallet) => wallet.showOnMobile || state(wallet.type).installed\n )\n : wallets;\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!config?.multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = useCallback(() => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n // don't show default injected wallet when it's not installed\n const defaultWallet = wallets.find(\n (wallet) => wallet.type === WalletTypes.DEFAULT\n );\n if (!defaultWallet || defaultWallet.state === WalletState.NOT_INSTALLED) {\n return false;\n }\n\n /*\n * if we have another evm wallet installed (except wallet connect),\n * there is no need to show default injected wallet anymore\n */\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![WalletTypes.DEFAULT, WalletTypes.WALLET_CONNECT_2].includes(\n wallet.type as WalletTypes\n ) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n disconnectConnectingWallets,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list, handleClick, error, disconnectConnectingWallets } =\n useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenModal(false);\n };\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={handleCloseWalletModal}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\nimport { RefreshModal } from '../RefreshModal';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const { fetchStatus } = useAppStore();\n const [openRefreshModal, setOpenRefreshModal] = useState(false);\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n useEffect(() => {\n setOpenRefreshModal(fetchStatus === 'failed');\n }, [fetchStatus]);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n <>\n {showBackButton && (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n )}\n </>\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n <RefreshModal\n open={openRefreshModal}\n onClose={() => setOpenRefreshModal(false)}\n />\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n const { theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport function generateShades(\n baseColor: string,\n prefix: string,\n reverse?: boolean\n): { [key: string]: string } {\n const BASE_SHADE_INDEX = 100;\n const NUMBER_OF_COLORS = 9;\n const SHADING_INCREMENT_MAX = 10; // For bright colors\n const SHADING_INCREMENT_MIN = 6; // For dark colors\n\n const HALF_NUMBER_OF_COLORS = 4;\n\n const shadeIncrements: number[] = [];\n let increment = 90;\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n shadeIncrements.push(increment);\n if (i + 1 === HALF_NUMBER_OF_COLORS) {\n increment = 0;\n } else {\n increment -=\n i >= HALF_NUMBER_OF_COLORS\n ? SHADING_INCREMENT_MIN\n : SHADING_INCREMENT_MAX;\n }\n }\n\n // If 'reverse' is true, that means the color should be from dark to light\n const decrementAmounts = reverse\n ? shadeIncrements.slice().reverse()\n : shadeIncrements;\n\n const shades: { [key: string]: string } = {};\n\n // Generate shades\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n const shadeIndex = BASE_SHADE_INDEX + i * BASE_SHADE_INDEX;\n const decrementAmount = decrementAmounts[i];\n\n const shade: { [key: string]: string } = {\n [`${prefix}${shadeIndex}`]: generateShade(baseColor, decrementAmount),\n };\n Object.assign(shades, shade);\n }\n\n return { ...shades, [prefix]: baseColor };\n}\n\nexport function generateShade(\n baseColor: string,\n decrementAmount: number\n): string {\n const [r, g, b] = convertToRGB(baseColor);\n return `#${clamp(r + decrementAmount)}${clamp(g + decrementAmount)}${clamp(\n b + decrementAmount\n )}`;\n}\n\nexport function convertToRGB(baseColor: string): number[] {\n const COLOR_SLICE_START = 1;\n const COLOR_SLICE_END = 3;\n const BASE_COLOR_LENGTH = 7;\n\n // Convert the base color to RGB components\n const r: number = parseInt(\n baseColor.slice(COLOR_SLICE_START, COLOR_SLICE_END),\n 16\n );\n const g: number = parseInt(\n baseColor.slice(COLOR_SLICE_END, COLOR_SLICE_END + 2),\n 16\n );\n const b: number = parseInt(\n baseColor.slice(COLOR_SLICE_END + 2, BASE_COLOR_LENGTH),\n 16\n );\n\n return [r, g, b];\n}\n\n// Function to clamp color component to valid range [0, 255] and convert to hex\nfunction clamp(color: number): string {\n const MAX_COLOR_VALUE = 255;\n const HEX_BASE = 16;\n const HEX_LENGTH = -2;\n return (\n '0' + Math.max(0, Math.min(MAX_COLOR_VALUE, color)).toString(HEX_BASE)\n )\n .slice(HEX_LENGTH)\n .toUpperCase();\n}\n\nexport function isBright(baseColor: string) {\n const BRIGHTNESS_THRESHOLD = 188;\n const RED_COEFFICIENT = 299;\n const GREEN_COEFFICIENT = 587;\n const BLUE_COEFFICIENT = 114;\n const BRIGHTNESS_DIVISOR = 1000;\n\n const [r, g, b] = convertToRGB(baseColor);\n const brightness =\n (r * RED_COEFFICIENT + g * GREEN_COEFFICIENT + b * BLUE_COEFFICIENT) /\n BRIGHTNESS_DIVISOR;\n if (brightness > BRIGHTNESS_THRESHOLD) {\n return true;\n }\n return false;\n}\n\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else {\n const reverse = colorKey === 'neutral' && reverseNeutralRange;\n listOfColors = {\n ...listOfColors,\n ...generateShades(color, colorKey, reverse),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$info100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\n },\n width: '$6',\n height: '$6',\n borderRadius: '$lg',\n right: '$4',\n border: '1px solid $surface100',\n});\n\nexport const SuffixContainer = styled('div', {\n display: 'flex',\n justifyContent: 'flex-end',\n minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button variant=\"ghost\" onClick={props.onClick} size=\"xsmall\">\n <Typography variant=\"label\" size=\"medium\" color=\"error500\">\n {i18n.t('Cancel')}\n </Typography>\n </Button>\n </SuffixContainer>\n );\n}\n\nexport { CancelButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { config } = useAppStore();\n\n const { list } = useWalletList({ config });\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n {props.isConnected && <ConnectedIcon />}\n <WalletIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n );\n}\n\nexport { WalletButton };\n", "import type { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { RefreshButton } from './RefreshButton';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n container,\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={container || getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport {\n ChainToken,\n ChevronRightIcon,\n Divider,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { areTokensEqual } from '../../utils/wallets';\n\nimport {\n Container,\n Images,\n List,\n ListItem,\n} from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem, index) => {\n const { route, requestId, event } = notificationItem;\n const fromToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.from)\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.from.blockchain\n );\n\n const toToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.to)\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.to.blockchain\n );\n\n return (\n <React.Fragment key={requestId}>\n {index > 0 && <Divider size={4} />}\n <ListItem\n onClick={() => handleOnClick(requestId)}\n actionRequired={\n event.messageSeverity === EventSeverity.WARNING\n }\n title={\n <Typography\n variant=\"body\"\n size=\"small\"\n color={\n event.messageSeverity === EventSeverity.WARNING\n ? '$foreground'\n : '$neutral700'\n }>\n {i18n.t(event.message)}\n </Typography>\n }\n id={requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n </React.Fragment>\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { darkTheme, ListItemButton, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n maxWidth: '90vw',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const ListItem = styled(ListItemButton, {\n variants: {\n actionRequired: {\n true: {\n backgroundColor: '$error300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$error600',\n },\n },\n },\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral700\">\n {i18n.t('There are no notifications.')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsList = getUnreadNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import type { PropTypes } from './RefreshModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, MessageBox, RefreshIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { RefreshButton } from './RefreshModal.styles';\n\nexport function RefreshModal(props: PropTypes) {\n const { open, onClose } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Something went wrong')}\n type=\"error\"\n description={i18n.t('Something went wrong. Please refresh the app.')}>\n <Divider size={30} />\n <RefreshButton\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={() => location.reload()}>\n <RefreshIcon size={20} color=\"primary\" />\n <Divider size={4} direction=\"horizontal\" />\n {i18n.t('Refresh')}\n </RefreshButton>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const RefreshButton = styled(Button, {\n '& span': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === WalletState.CONNECTED) {\n return (\n <MessageBox\n type=\"success\"\n title={i18n.t('Wallet Connected')}\n description={i18n.t(\n 'Your wallet is connected, you can use it to swap.'\n )}\n />\n );\n }\n\n if (error) {\n return (\n <MessageBox\n type=\"error\"\n title={i18n.t('Failed to Connect')}\n description={\n error || i18n.t('Your wallet is not connected. Please try again.')\n }\n />\n );\n }\n\n return (\n <MessageBox\n type=\"loading\"\n title={i18n.t('Connecting to your wallet')}\n description={i18n.t('Click connect in your wallet popup.')}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n backgroundColor: '$success300',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${spin} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n couldChangeSettings,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n if (alertInfo && !couldChangeSettings) {\n alertInfo.action = null;\n }\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\n type={info.alert.type}\n prefix={\n <PrefixIcon>\n <RefreshIcon size={8} />\n </PrefixIcon>\n }\n onClick={info.alert.action.onClick}>\n {info.alert.action.title}\n </Button>\n )\n }\n variant=\"alarm\"\n />\n </Footer>\n )}\n </Container>\n );\n}\n", "import type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size=\"4\" />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '$5',\n width: '100%',\n});\n\nexport const Item = styled('div', {\n display: 'flex',\n padding: '$5 0',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n alertInfo.action = 'change-settings';\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n container,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n container={container}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n formatTooltipNumbers,\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd, getUsdFeeOfStep } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (\n swaps: SwapResult[],\n internalSwap?: boolean\n ): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const hasBridgeLimitError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId;\n\n const hasSlippageError =\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index);\n\n const hasSlippageWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n const stepHasError = hasBridgeLimitError || hasSlippageError;\n const stepHasWarning = hasSlippageWarning;\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (hasBridgeLimitError) {\n alertTitle = error?.recommendation;\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers),\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0 && !internalSwap\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(\n index === 0 ? input.value : swap.fromAmount\n ),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.from.usdPrice ?? 0).multipliedBy(\n swap.fromAmount\n )\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(swap.toAmount),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.to.usdPrice ?? 0).multipliedBy(swap.toAmount)\n ),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm dense={fullExpandedMode}>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n !fullExpandedMode ? (\n <FooterAlert>\n {hasBridgeLimitError && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </>\n )}\n {(hasSlippageError || hasSlippageWarning) &&\n !hasBridgeLimitError && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n )}\n </FooterAlert>\n ) : null\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n time: roundedSecondsToString(swap.estimatedTimeInSeconds),\n fee: numberToString(\n getUsdFeeOfStep(swap, tokens),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n internalSwaps: swap.internalSwaps\n ? getQuoteSteps(swap.internalSwaps)\n : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = propContainer || getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = roundedSecondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], tokens);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\">\n <Typography color=\"secondary\" variant=\"label\" size=\"medium\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.value)}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n &nbsp;\n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </Tooltip>\n </ContainerInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.usdValue)}\n container={container}>\n <Divider size={2} direction=\"horizontal\" />\n <Typography color=\"$neutral600\" size=\"xsmall\" variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </Tooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n container={container}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n variants: {\n dense: {\n true: {\n paddingBottom: 0,\n },\n },\n },\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary',\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n QuoteCost,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { NAME_OF_FEES } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {NAME_OF_FEES[payableFeesKey as NameOfFees]}\n </Typography>\n <Tooltip\n content={formatTooltipNumbers(fee.amount)}\n container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </Tooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = NAME_OF_FEES[nonPayableFeesKey as NameOfFees];\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const { content, src, className, open, state, container } = props;\n const tooltipContainer = container || getContainer();\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type, container } =\n props;\n const tooltipContainer = container || getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n content={blockchain.displayName}\n sideOffset={4}>\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n </Tooltip>\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n container={container}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useLayoutEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useLayoutEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container expanded={expanded} rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={24} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n expanded: {\n true: {\n paddingBottom: '3px',\n },\n false: {\n paddingBottom: '$12',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={85} height={24} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n <Divider size={12} />\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '14px $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$24',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens extraSpace={separator}>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n variants: {\n extraSpace: {\n true: {\n paddingBottom: '$40',\n },\n },\n },\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n const proceedAnyway = !!confirmSwapWarnings.balance;\n\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n proceedAnyway ? false : true,\n { blockchains, tokens }\n );\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n tokens: params.meta.tokens,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\n});\n\nconst isStepContainsText = (steps: PendingSwapStep[], value: string) => {\n if (!steps?.length) {\n return false;\n }\n return steps.filter(\n (step) =>\n containsText(step.fromBlockchain, value) ||\n containsText(step.toBlockchain, value) ||\n containsText(step.toSymbol, value) ||\n containsText(step.fromSymbol, value)\n ).length;\n};\n\nexport function HistoryPage() {\n const navigate = useNavigate();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const loading = !state.loadedFromPersistor;\n\n const searchHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n }}>\n <PageContainer>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(swap.inputAmount),\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable\n ),\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './SearchInput.types';\n\nimport { CloseIcon, IconButton, SearchIcon, TextField } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { IconWrapper } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const IconWrapper = styled('div', {\n width: '$24',\n height: '$24',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "import type { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { isVariantExpandable } from '../utils/configs';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'auto auto',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0 !important',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n new BigNumber(inputAmount).gt(0) &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n onHandleNavigation(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n isExpandable={isExpandable}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={true}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n const container = getExpanded();\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={container} />\n <HeaderButtons\n container={container}\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n container={getExpanded()}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const tokens = useAppStore().tokens();\n const container = propContainer || getContainer();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={container} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n container={container}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import type { PreferenceType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n ];\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken, isExpandable } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(inputUsdValue),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!isExpandable && (!!selectedQuote || fetchingQuote)}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(outputAmount),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(outputUsdValue),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n ROTATE_ANIMATION_DURATION,\n StyledButton,\n SwitchButtonContainer,\n} from './SwitchFromAndTo.styles';\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={(event) => {\n const button = event.currentTarget;\n\n button.classList.add('rotate');\n\n setTimeout(() => {\n button.classList.remove('rotate');\n }, ROTATE_ANIMATION_DURATION);\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const ROTATE_ANIMATION_DURATION = 450;\n\nconst rotateAnimation = keyframes({\n '0%': {\n transform: 'rotateX(0deg) rotateY(0deg) rotateZ(0deg)',\n },\n '33%': {\n transform: 'rotateX(0deg) rotateZ(78deg) rotateY(66deg)',\n },\n '66%': {\n transform: 'rotateX(0deg) rotateZ(163deg) rotateY(66deg)',\n },\n '100%': {\n transform: 'rotateX(0deg) rotateZ(180deg) rotateY(0deg)',\n },\n});\n\nexport const SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nexport const StyledButton = styled('div', {\n borderRadius: '$md',\n border: '3px solid $background',\n background: '$neutral100',\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n color: '$foreground',\n '&.rotate': {\n '& svg': {\n animation: `${rotateAnimation} ${ROTATE_ANIMATION_DURATION}ms ease-in-out forwards`,\n },\n },\n '&:hover': {\n color: '$secondary500',\n transform: 'translateY(1px) scale(1.04)',\n boxShadow: '1px 1px 1px 1px rgba(0, 0, 0, 0.05)',\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n\n const [loading, setLoading] = useState(true);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n const navigateBack = useNavigateBack();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => {\n changeLanguage(languageItem.local);\n navigateBack();\n },\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n variant=\"alarm\"\n title=\"Important Notice: Machine translations are in use\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter((sourceItem) =>\n containsText(sourceItem.groupTitle, searchedFor)\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={searchHandler}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => navigate(settings_url)}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const fetchStatus = useAppStore().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n\n <BlockchainList\n list={blockchains}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List as=\"ul\" key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\n hasDivider\n onClick={() => onChange(item)}\n start={<Image src={item.logo} size={30} />}\n title={\n <Typography variant=\"title\" size=\"medium\">\n {item.displayName}\n </Typography>\n }\n id={item.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Token')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n <TokenList\n list={tokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === 'success' && (\n <>\n <BlockchainsChip\n selected={!blockchain}\n onClick={() => {\n if (type === 'from') {\n resetFromBlockchain();\n } else {\n resetToBlockchain();\n }\n }}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n.t('All')}\n </Typography>\n </BlockchainsChip>\n {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateShade, isBright } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n StyledLink,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <Divider size={4} direction=\"horizontal\" />\n <StyledLink\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n <ExternalLinkIcon size={12} />\n </StyledLink>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\n\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list.length]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const tokenBalance = formatBalance(getBalanceFor(token));\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const lightShade = generateShade(\n blockchain?.color || '',\n isBright(blockchain?.color || '') ? 5 : 125\n );\n const darkShade = generateShade(blockchain?.color || '', -100);\n\n const customCssForTag = {\n $$color: lightShade,\n [`.${darkTheme} &`]: {\n $$color: darkShade,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: darkShade,\n [`.${darkTheme} &`]: {\n $$color: lightShade,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n height: '60px',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.name || undefined\n }\n end={\n loadingWallet ? (\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n ) : (\n tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n totalCount={tokens.length}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List as=\"ul\">{renderList()}</List>}\n </Container>\n );\n}\n", "import type { LoadingTokenListProps } from './TokenList.types';\n\nimport { Divider, ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { End, List } from './TokenList.styles';\n\nexport function LoadingTokenList(props: LoadingTokenListProps) {\n return (\n <List>\n {Array.from(Array(props.size), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n ))}\n </List>\n );\n}\n", "import {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n display: 'flex',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const Title = styled('div', {\n display: 'flex',\n alignItems: 'center',\n '._typography': {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n },\n});\nexport const List = styled('ul', {\n flexGrow: 1,\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const StyledLink = styled('a', {\n '& svg:hover': {\n color: '$colors$info',\n },\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n InfoIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n return (\n <BaseContainer>\n <Head>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage || ''}\n color=\"dark\"\n onChange={(event) => {\n const value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgesIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n ExchangeIcon,\n InfinityIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 16 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n const { activeLanguage, languages } = useLanguage();\n const currentLanguage = languages.find(\n (language) => language.local === activeLanguage\n )?.label;\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleSwapperEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n start: <BridgesIcon color=\"gray\" size={16} />,\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(\n totalSelectedExchangeSources,\n totalExchangeSources\n )}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <ExchangeIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n start: <LanguageIcon color=\"gray\" size={16} />,\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {currentLanguage}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <InfinityIcon color=\"gray\" size={16} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n LinkIcon,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n formatTooltipNumbers,\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n ErrorMessages,\n HeaderDetails,\n MessageText,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\n const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n } else if (showCompletedModal) {\n setShowCompletedModal(null);\n }\n }\n }, [swap.status, swap.requestId]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const swapDate = getSwapDate(swap);\n const shouldRetry = shouldRetrySwap(swap);\n\n const isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\n blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? formatTooltipNumbers(\n new BigNumber(outputAmount).multipliedBy(lastStep.toUsdPrice || 0)\n )\n : '';\n\n const realInputUsdValue = formatTooltipNumbers(\n new BigNumber(swap.inputAmount).multipliedBy(firstStep.fromUsdPrice || 0)\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const stepDetailMessage =\n stepMessage.detailedMessage.content || stepMessage.shortMessage;\n\n const completeModalDesc =\n swap.status === 'success' ? (\n i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n ) : (\n <ErrorMessages>\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {!stepDetailMessage ? i18n.t('Transaction was not sent.') : ''}\n {lastConvertedTokenInFailedSwap\n ? `${i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })}`\n : ''}\n </Typography>\n {stepDetailMessage && (\n <MessageText\n align=\"center\"\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\">\n <b>Reason:</b> {stepDetailMessage}\n </MessageText>\n )}\n </ErrorMessages>\n );\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('delete')}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Delete')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}\n footer={\n shouldRetry &&\n !showCompletedModal && (\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n retry(swap, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <LinkIcon size={16} />\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t(swap.finishTime ? 'Finished at' : 'Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={roundedSecondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount,\n },\n token: {\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n },\n chain: {\n image: steps[numberOfSteps - 1].to.chain.image,\n displayName: steps[numberOfSteps - 1].to.chain.displayName,\n },\n }}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = getStepState(swap.steps[index]);\n const isFocused =\n state === 'error' ||\n state === 'in-progress' ||\n state === 'warning' ||\n (state === 'completed' && index === steps.length - 1);\n return (\n <StepDetails\n key={key}\n step={step}\n type=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\n walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={formatTooltipNumbers(outputAmount)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </>\n );\n};\n", "import type { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\n\nimport { debug } from '@rango-dev/logging-core';\nimport { MessageBox, Wallet } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const { connect, getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\n // TODO we need to show an error modal when user reject the connection\n onClick={async () =>\n connect(walletType).catch((error) => debug(error))\n }\n />\n </WalletContainer>\n )}\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const TooltipErrorContent = styled('div', {\n maxWidth: 280,\n '& ._typography': {\n wordWrap: 'break-word',\n display: 'block',\n },\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n {i18n.t('Diagnosis')}\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert,\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers),\n image: step.swapperLogo ?? '',\n type: step.swapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.fromBlockchainLogo ?? '',\n },\n },\n to: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.toBlockchainLogo ?? '',\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(\n internalSwap.swapperId,\n swappers\n ),\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n switchNetwork,\n showNetworkModal,\n setNetworkModal,\n message,\n step,\n hasAlreadyProceededToSign,\n } = props;\n\n const hasWarning = isNetworkStatusInWarningState(step);\n const waitingForApproval =\n step.status === 'waitingForApproval' && !hasWarning;\n const inProgress = step.status === 'running' && !hasWarning;\n const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\n showNetworkModal={showNetworkModal}\n setNetworkModal={setNetworkModal}\n message={message}\n />\n )}\n\n {step.status === 'failed' && <FailedAlert message={message} />}\n </Alerts>\n );\n}\n", "import type { FailedAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { Alert, ChevronDownIcon, IconButton } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { MessageText } from '../SwapDetails/SwapDetails.styles';\n\nimport { ActionIcon, AlertFooter } from './SwapDetailsAlerts.styles';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n containerStyles={{\n '& .footer': {\n paddingTop: '$0',\n },\n }}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n <ActionIcon rotated={showContentError}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ActionIcon>\n </IconButton>\n )\n }\n footer={\n <AlertFooter open={showContentError}>\n <MessageText variant=\"body\" size=\"xsmall\" color=\"neutral700\">\n {message.detailedMessage.content}\n </MessageText>\n </AlertFooter>\n }\n />\n );\n}\n", "import { css, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const ErrorMessages = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n});\nexport const MessageText = styled(Typography, {\n wordBreak: 'break-word',\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const ActionIcon = styled('div', {\n transition: 'transform 0.3s ease-in-out',\n variants: {\n rotated: {\n true: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const AlertFooter = styled('div', {\n transition: 'max-height 0.3s ease-in-out',\n maxHeight: '0px',\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n maxHeight: '200px',\n },\n },\n },\n});\n", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\n }}>\n {i18n.t('Change')}\n </Button>\n }\n />\n );\n }\n if (\n showNetworkModal === PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import type { WalletType } from '../..';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { splitWalletNetwork } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WidgetContext } from '../../containers/Wallets';\nimport { globalFont } from '../../globalStyles';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { tabManager } from '../../store/ui';\nimport { useFetchApiConfig } from '../useFetchApiConfig';\nimport { useForceAutoConnect } from '../useForceAutoConnect';\nimport { useSubscribeToWidgetEvents } from '../useSubscribeToWidgetEvents';\n\nexport function useBootstrap() {\n globalFont();\n useForceAutoConnect();\n useSubscribeToWidgetEvents();\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n const { fetchApiConfig } = useFetchApiConfig();\n\n // At the moment, we only detect the disconnection of EVM wallets.\n useQueueManager({\n lastConnectedWallet: lastConnectedWalletWithNetwork,\n clearDisconnectedWallet: () => {\n setDisconnectedWallet(undefined);\n },\n disconnectedWallet: disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n useEffect(() => {\n tabManager.init();\n\n if (!useNotificationStore.persist.hasHydrated()) {\n void useNotificationStore.persist.rehydrate();\n }\n\n /**\n * Add handlers to the widget context for connecting and disconnecting wallets.\n * We pass these handlers to the wallet provider to keep track of the last connected and last disconnected wallets.\n * The 'queue-manager' uses these details to spot any changes in the connection status of the required wallet during the swap process.\n *\n * with this approch anyone who use the widget context can override these handlers and causes some bugs happens.\n * it the future we should add a safer soloution like considering array of handlers .\n * https://github.com/rango-exchange/rango-client/pull/630/files#r1518846728\n */\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n widgetContext.onDisconnectWallet((walletType) => {\n setDisconnectedWallet(walletType);\n if (\n walletType === splitWalletNetwork(lastConnectedWalletWithNetwork)?.[0]\n ) {\n setLastConnectedWalletWithNetwork('');\n }\n });\n\n void fetchApiConfig().catch(console.log);\n\n return tabManager.destroy;\n }, []);\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = () =>\n globalCss({\n '@import': [\n \"url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap')\",\n \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "import { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import type { RouteEventData, StepEventData } from '../..';\n\nimport {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useWalletsStore } from '../../store/wallets';\n\nexport function useSubscribeToWidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n const handleStepEvent = (widgetEvent: StepEventData) => {\n const { event, step, route } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n\n setNotification(event, route);\n };\n widgetEvents.on(MainEvents.StepEvent, handleStepEvent);\n\n return () => widgetEvents.off(MainEvents.StepEvent, handleStepEvent);\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n const handleRouteEvent = (widgetEvent: RouteEventData) => {\n const { event, route } = widgetEvent;\n\n if (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n ) {\n setNotification(event, route);\n }\n };\n widgetEvents.on(MainEvents.RouteEvent, handleRouteEvent);\n\n return () => widgetEvents.off(MainEvents.RouteEvent, handleRouteEvent);\n }, [widgetEvents, connectedWallets.length]);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = async (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const history = new WidgetHistory(manager, { retrySwap });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getUnreadNotifications();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { Meta } from '../../store/quote';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\ninterface WidgetHistoryActions {\n retrySwap: (pendingSwap: PendingSwap, meta: Meta) => void;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n return this.actions.retrySwap(swap, meta);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n"],
5
- "mappings": "iFA2CA,OACE,iBAAAA,GACA,cAAAC,GACA,kBAAAC,GACA,iBAAAC,GACA,mCAAAC,GACA,4BAAAC,GACA,aAAaC,OACR,wCACP,OACE,sBAAAC,GACA,cAAAC,GACA,UAAUC,OACL,2BACP,OAAS,YAAAC,GAAU,eAAAC,OAAmB,4BACtC,OAAS,4BAAAC,OAAgC,cC1DzC,OAAS,SAAAC,OAAa,gBAEf,IAAMC,GAAuB,uCACvBC,GAAmB,6BACnBC,GAAmB,kCAEnBC,GAAe,CAC1B,YAAa,iBACb,gBAAiB,qBACjB,GAAGJ,EACL,ECDA,OAAS,UAAAK,GAAQ,YAAAC,OAAgB,2BAEjC,OAAS,mBAAAC,OAAuB,YAChC,OAAOC,IAAS,iBAAAC,GAAe,aAAAC,GAAW,WAAAC,GAAS,UAAAC,OAAc,QCRjE,OAAS,aAAAC,OAAiB,QCA1B,OAAS,UAAAC,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCLtC,OAAS,eAAAC,OAAmB,YCmB5B,OAAS,eAAeC,OAAoB,gBAC5C,OAAS,sBAAAC,OAA0B,2BACnC,OACE,qBAAAC,GACA,kCAAAC,GACA,gBAAAC,GACA,4BAAAC,GACA,YAAAC,OACK,4BACP,OAAOC,OAAe,eACtB,OAAS,sBAAAC,OAA0B,cC7BnC,OAAOC,OAAe,eAEf,IAAMC,GAAO,IAAID,GAAU,CAAC,ECFnC,OAAS,eAAAE,OAAmB,4BAErB,IAAMC,GAAmB,CAACD,GAAY,IAAI,ECEjD,OAAS,aAAAE,OAAiB,eAQnB,IAAMC,GAAyBC,EAACC,GAAsB,CAC3D,IAAMC,EAAU,KAAK,MAAOD,EAAI,GAAM,EAAE,EAAI,GACtCE,EAAU,UAAUF,EAAI,IAAI,SAAS,CAAC,EAC5C,OAAIE,GAAW,GACN,GAAG,KAAK,MAAMA,EAAU,CAAC,EAAI,CAAC,MAEhC,GAAGA,EAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,IAAID,EAC9C,SAAS,EACT,SAAS,EAAG,GAAG,CAAC,EACrB,EATsC,0BAWzBE,EAAiBJ,EAAA,CAC5BK,EACAC,EAA6B,KAC7BC,EAA6B,OAClB,CAIX,GAHIF,GAAW,MAGXA,IAAW,GACb,MAAO,GAET,IAAM,EAAI,IAAIG,GAAUH,CAAM,EACxBI,EAAe,EACjBC,EAAO,IACX,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtB,GAAI,IAAIH,GAAU,EAAE,QAAQG,EAAGF,CAAY,CAAC,EAAE,GAAG,CAAC,EAAG,CACnDC,EAAOC,EACP,KACF,CAGF,GAAI,EAAE,IAAI,GAAK,EACb,OAAO,EAAE,SAAS,EAAGF,CAAY,EAWnC,GATI,EAAE,IAAI,GAAI,GASV,EAAE,IAAI,GAAG,EACX,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,GAAI,EAAE,IAAI,CAAC,EACT,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,GAAI,EAAE,IAAI,GAAI,EACZ,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,QAASE,EAAIL,GAAe,EAAGK,EAAI,GAAIA,IACrC,GAAI,EAAE,IAAI,KAAK,IAAI,GAAI,CAACA,CAAC,CAAC,EACxB,OAAO,EAAE,SACP,KAAK,IACHD,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAGK,CAAC,CAAC,CAC5D,EACAF,CACF,EAGJ,OAAI,EAAE,UAAU,CAAC,EACR,IAGF,EAAE,SACP,KAAK,IAAIC,EAAM,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAAC,EAC1EG,CACF,CACF,EA/E8B,kBAwFvB,IAAMG,GAAmBC,EAC9BC,GACGA,GAAM,OAAO,CAACC,EAAGC,IAAMD,GAAKC,EAAE,wBAA0B,GAAI,CAAC,GAAK,EAFvC,oBAazB,IAAMC,GAAeC,EAAA,CAACC,EAAcC,IACzCD,EAAK,YAAY,EAAE,QAAQC,EAAW,YAAY,CAAC,EAAI,GAD7B,gBAGfC,GAAmBH,EAACC,GAC/B,CAAC,CAACA,GAAQ,WAAWA,CAAI,EAAI,EADC,oBAIzB,SAASG,GACdC,EACA,CACA,OAAOC,EAAeD,EAAQ,GAAkB,EAAgB,EAAE,QAChE,uBACA,IACF,CACF,CAPgBL,EAAAI,GAAA,wBHzFT,SAASG,GAAuBC,EAAkC,CACvE,OAAQ,GAAM,CACZ,KAAKA,EAAM,UACT,OAAOC,GAAa,UACtB,KAAKD,EAAM,WACT,OAAOC,GAAa,WACtB,IAAK,CAACD,EAAM,UACV,OAAOC,GAAa,cACtB,QACE,OAAOA,GAAa,YACxB,CACF,CAXgBC,EAAAH,GAAA,0BAaT,SAASI,GACdC,EACAC,EACAC,EACAC,EACmB,CACnB,OAAOD,EACJ,OAAQE,GAAW,CAACC,GAAiB,SAASD,CAAqB,CAAC,EACpE,OAAQA,GAAW,CAClB,GAAM,CAAE,gBAAAE,EAAiB,iBAAAC,CAAiB,EAAIN,EAAcG,CAAM,EAC5D,CAAE,UAAAI,EAAW,QAAAC,CAAQ,EAAIT,EAASI,CAAM,EAG9C,OADEG,IAAqB,CAACC,GAAc,CAAC,CAACL,GAASM,IAAYN,GAEpD,GAELA,EACK,CAAC,CAACG,EAAgB,KACtBI,GAAmBA,EAAe,OAASP,CAC9C,EAEK,EACT,CAAC,EACA,IAAKQ,GAAS,CACb,GAAM,CACJ,KAAAC,EACA,IAAKC,EACL,YAAAC,EACA,aAAAC,CACF,EAAId,EAAcU,CAAI,EAChBf,EAAQD,GAAuBK,EAASW,CAAI,CAAC,EACnD,MAAO,CACL,MAAOC,EACP,MAAAC,EACA,KAAMG,GAAkBF,CAAW,EACnC,MAAAlB,EACA,KAAAe,EACA,aAAAI,CACF,CACF,CAAC,CACL,CAxCgBjB,EAAAC,GAAA,8BA0CT,SAASkB,GACdC,EACkB,CAClB,GAAI,CAACA,EACH,OAAO,KAET,IAAID,EAA2C,CAAC,EAChD,OAAAA,EAAgCC,EAAqB,IAClDC,GAAmBA,EAAe,IACrC,EAEOF,CACT,CAZgBnB,EAAAmB,GAAA,iCAcT,SAASG,GACdhB,EACAiB,EACAC,EACAC,EACAhB,EACU,CACV,IAAMiB,EAAmB,CAAC,EAE1B,SAASC,EAAWhB,EAAkBiB,EAAiB,CAIrD,GAAI,CAHiC,CAAC,CAACF,EAAO,KAC3CG,GAAYA,EAAQ,QAAUlB,CACjC,EACmC,CACjC,IAAMmB,EAAqB,CACzB,QAAAF,EACA,MAAOjB,EACP,WAAYL,CACd,EAEAoB,EAAO,KAAKI,CAAU,CACxB,CACF,CAbS9B,EAAA2B,EAAA,cAeT,IAAMP,EAAuBK,GAAuB,CAAC,EAErD,OAAAF,EAAS,QAASM,GAAY,CAC5B,GAAM,CAAE,QAAAD,EAAS,QAAAjB,CAAQ,EAAIoB,GAAmBF,CAAO,EAEjDG,EAAgBZ,EAAqB,OAAS,EAC9Ca,EAAcb,EAAqB,SAAST,CAAO,EACnDuB,EAAYvB,IAAYwB,GAAS,QAQvC,GANEH,GAAiB,CAACC,GAAe,CAACC,EAOlC,OASF,IAAME,EACJzB,IAAYwB,GAAS,SAAWE,GAAaT,CAAO,EACtD,GAAIM,GAAa,CAACE,EAChB,OAGsBZ,EAAe,SAASb,CAAO,GAGhCyB,EACjB3B,EAKFkB,EAAWhB,EAASiB,EAAQ,YAAY,CAAC,EAMNR,EAAqB,OACrDf,GAAUmB,EAAe,SAASnB,CAAK,CAC1C,EAE2B,QAASM,GAAY,CAK9CgB,EAAWhB,EAASiB,EAAQ,YAAY,CAAC,CAC3C,CAAC,EAGHD,EAAWhB,EAASiB,CAAO,CAE/B,CAAC,EAEMF,CACT,CAxFgB1B,EAAAsB,GAAA,iCA0FT,SAASgB,GAAkBC,EAA6B,CAC7D,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,MAAM,QAASE,GAAS,CAC7B,IAAMC,EAA4BD,EAAK,KAAK,WACtCE,EAA0BF,EAAK,GAAG,WACnCD,EAAQ,SAASE,CAAyB,GAC7CF,EAAQ,KAAKE,CAAyB,EAEnCF,EAAQ,SAASG,CAAuB,GAC3CH,EAAQ,KAAKG,CAAuB,EAIlCF,EAAK,eAAiB,MAAM,QAAQA,EAAK,aAAa,GACxDA,EAAK,cAAc,QAASG,GAAiB,CAC3C,IAAMC,EAA6BD,EAAa,KAAK,WAC/CE,EAA2BF,EAAa,GAAG,WAC5CJ,EAAQ,SAASK,CAA0B,GAC9CL,EAAQ,KAAKK,CAA0B,EAEpCL,EAAQ,SAASM,CAAwB,GAC5CN,EAAQ,KAAKM,CAAwB,CAEzC,CAAC,CAEL,CAAC,EACMN,CACT,CA5BgBxC,EAAAsC,GAAA,qBAgCT,SAASS,GACdlB,EACAmB,EACA,CACA,OACEnB,EAAQ,UAAYmB,EAAgB,SACpCnB,EAAQ,QAAUmB,EAAgB,OAClCnB,EAAQ,aAAemB,EAAgB,UAE3C,CATgBhD,EAAA+C,GAAA,6BAWT,SAASE,GACdC,EACAC,EACgB,CAChB,GAAM,CAAE,WAAY9C,EAAO,SAAA+C,EAAW,CAAC,CAAE,EAAIF,EAC7C,OACEE,GAAU,IAAKC,IAAkB,CAC/B,MAAAhD,EACA,OAAQgD,EAAa,MAAM,OAC3B,OAAQA,EAAa,MAAM,OAC3B,QAASA,EAAa,MAAM,SAAW,KACvC,UAAWA,EAAa,OAAO,OAC/B,QAASA,EAAa,OAAO,SAC7B,OAAQ,IAAIC,GAAUD,EAAa,OAAO,MAAM,EAC7C,UAAU,CAACA,EAAa,OAAO,QAAQ,EACvC,QAAQ,EACX,KAAM,GACN,SACEE,GACElD,EACAgD,EAAa,MAAM,OACnBA,EAAa,MAAM,QACnBF,CACF,GAAK,IACT,EAAE,GAAK,CAAC,CAEZ,CA1BgBnD,EAAAiD,GAAA,kBA4BT,SAASO,GACdR,EACiB,CACjB,MAAO,CAAE,GAAGA,EAAiB,QAAS,GAAO,MAAO,EAAK,CAC3D,CAJgBhD,EAAAwD,GAAA,6BAMT,IAAMC,GAA0BzD,EAACgD,GAAuC,CAC7E,IAAMU,EAAyB,IAAI,IAa7BC,EAZmCX,GAAiB,OACxD,CAACY,EAAwBC,IAChBD,EAAI,UACRE,GAAMA,EAAE,UAAYD,EAAQ,SAAWC,EAAE,QAAUD,EAAQ,KAE9D,IAAM,GACF,CAAC,GAAGD,EAAKC,CAAO,EAChBD,EAEN,CAAC,CACH,GAEiD,IAAKvD,GAAU,CAC9D,IAAM0D,EAAuC,CAC3C,KAAM1D,EAAM,MACZ,SAAU,CAAC,CACb,EACA,OAAKqD,EAAuB,IAAIrD,EAAM,OAAO,GAC3CqD,EAAuB,IAAIrD,EAAM,OAAO,EAE1CqD,EAAuB,QAASM,GAAmB,CAC7C3D,EAAM,UAAY2D,GACpBD,EAAyB,SAAS,KAAK1D,CAAK,CAEhD,CAAC,EACM0D,CACT,CAAC,EACKE,EAAQC,EACZP,GACI,QAASQ,GAAMA,EAAE,QAAQ,GACzB,QAASC,GAAMA,GAAG,QAAQ,GAC1B,IAAKD,GACL,IAAIb,GAAUa,GAAG,QAAUE,EAAI,EAAE,aAAaF,GAAG,UAAY,CAAC,CAChE,GACE,OAAO,CAACC,EAAGD,IAAMC,EAAE,KAAKD,CAAC,EAAGE,EAAI,GAAKA,EAC3C,EAAE,SAAS,EAEX,OAAOC,GAA4BL,CAAK,CAC1C,EAxCuC,2BA0CvC,SAASK,GAA4BC,EAAiC,CACpE,IAAMC,EAAQD,EAAO,SAAS,EAAE,MAAM,GAAG,EACzC,OAAAC,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAE,QAAQ,wBAAyB,GAAG,EACjDA,EAAM,KAAK,GAAG,CACvB,CAJSxE,EAAAsE,GAAA,+BAMF,IAAMf,GAAcvD,EAAA,CACzByE,EACAC,EACA9C,EACA+C,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeH,GACjBG,EAAE,QAAQ,YAAY,IAAMF,GAAQ,YAAY,GAChDE,EAAE,UAAYhD,CAClB,GACc,UAAY,KAZD,eAcdiD,GAAsB7E,EAAA,CACjC8E,EACAxE,IACY,CACZ,IAAMyE,EAA8BC,GAClC,OAAO,QAAQF,CAAW,EACvB,IAAI,CAAC,CAAC,CAAEzD,CAAc,IAAMA,CAAc,EAC1C,OAAO4D,EAAkB,CAC9B,EACA,OACEF,GACAA,EAA4BzE,CAAM,GAAG,YAEzC,EAbmC,uBA6B5B,SAAS4E,GAAcC,EAAyC,CAiBrE,OAhByCA,EACrC,CACE,GAAGA,EACH,OAAQC,EACND,EAAQ,OACR,EACA,CACF,EACA,SAAUC,EACRD,EAAQ,SACR,EACA,CACF,CACF,EACA,IAGN,CAlBgBE,EAAAH,GAAA,iBAoBT,SAASI,GACdC,EACAC,EACQ,CACR,OAAID,GAAe,UAAYC,GAAe,SAE1C,WAAWA,GAAe,UAAY,GAAG,EACzC,WAAWD,GAAe,UAAY,GAAG,EAIzCA,GAAe,QAAUC,GAAe,OAExC,WAAWA,GAAe,QAAU,GAAG,EACvC,WAAWD,GAAe,QAAU,GAAG,EAIpC,CACT,CAnBgBF,EAAAC,GAAA,uBAqBT,SAASG,GACdC,EACAC,EACA,CACA,OACED,GAAQ,aAAeC,GAAQ,YAC/BD,GAAQ,SAAWC,GAAQ,QAC3BD,GAAQ,UAAYC,GAAQ,OAEhC,CATgBN,EAAAI,GAAA,kBAWT,SAASG,GACdC,EACmB,CACnB,OAAOA,EAAQ,KACb,CAACC,EAAGC,IACF,EAAOA,EAAE,QAAUC,GAAa,WAC9B,EAAOF,EAAE,QAAUE,GAAa,YAClC,EACED,EAAE,QAAUC,GAAa,cACvBD,EAAE,QAAUC,GAAa,YAE3B,EACEF,EAAE,QAAUE,GAAa,cACvBF,EAAE,QAAUE,GAAa,WAEnC,CACF,CAhBgBX,EAAAO,GAAA,qCAkBT,SAASK,GACdC,EAEAC,EAAW,EAEXC,EAAiB,EACT,CACR,GAAIF,EAAQ,OAAS,EAAIC,EAAWC,EAClC,OAAOF,EAET,IAAMG,EAAQH,EAAQ,MAAM,EAAGC,CAAQ,EACjCG,EAAMJ,EAAQ,MAAM,CAACC,CAAQ,EACnC,MAAO,GAAGE,CAAK,GAAG,IAAI,OAAOD,CAAc,CAAC,GAAGE,CAAG,EACpD,CAbgBjB,EAAAY,GAAA,qBAeT,SAASM,GAAW,CACzB,MAAAC,EACA,iBAAAC,EACA,WAAAC,CACF,EAIuB,CACrB,OAAOD,EAAiB,KACrBE,GACCA,EAAgB,aAAeD,GAC/BC,EAAgB,QAAUH,CAC9B,GAAG,OACL,CAdgBnB,EAAAkB,GAAA,cAgBT,SAASK,GAAgBC,EAAyB,CACvD,MAAO,GAAGA,EAAM,UAAU,IAAIA,EAAM,MAAM,IAAIA,EAAM,SAAW,EAAE,EACnE,CAFgBxB,EAAAuB,GAAA,mBAIT,SAASE,GAAkBL,EAAqC,CACrE,OAAOA,EACJ,QAASM,GAAWA,EAAO,QAAQ,EACnC,OAAO,CAACC,EAAyB7B,IAAY,CAC5C,IAAM8B,EAAiB,CACrB,OAAQ9B,GAAS,QAAU,GAC3B,SAAUA,GAAS,SAAW,EAC9B,SAAUA,GAAS,SACf,IAAI+B,GAAU/B,GAAS,UAAYgC,EAAI,EACpC,aAAahC,GAAS,MAAM,EAC5B,SAAS,EACZ,EACN,EAEMiC,EAAYjC,EACdyB,GAAgB,CACd,OAAQzB,EAAQ,OAChB,WAAYA,EAAQ,MACpB,QAASA,EAAQ,OACnB,CAAC,EACD,KAEEkC,EAAcD,EAAYJ,EAASI,CAAS,EAAI,KAOtD,OAJEA,IACC,CAACC,GACCA,GAAeA,EAAY,OAASJ,EAAe,UAGtDD,EAASI,CAAS,EAAIH,GAGjBD,CACT,EAAG,CAAC,CAAC,CACT,CAnCgB3B,EAAAyB,GAAA,qBAqCT,IAAMQ,GAAoBjC,EAAA,CAC/BoB,EACAc,IAEA,CAAC,CAACd,EAAiB,KAChBM,GAAWA,EAAO,QAAUQ,GAAcR,EAAO,OACpD,EAN+B,qBAQ1B,SAASS,GAAiBC,EAAgC,CAC/D,OAAOA,EAAY,IAAKC,GAAMA,EAAE,KAAK,EAAE,KAAK,GAAG,CACjD,CAFgBrC,EAAAmC,GAAA,oBIrfhB,IAAIG,GAAmB,CACrB,QAASC,EACX,EAEO,SAASC,GAAUC,EAAqB,CAC7C,OAAOH,GAAQG,CAAI,GAAK,EAC1B,CAFgBC,EAAAF,GAAA,aAaT,SAASG,GAAWC,EAAsB,CAC/C,IAAIC,EACJ,OAAI,OAAO,iBAAoB,WAC7BA,EAAgB,gBAAgBD,CAAW,EAE3CC,EAAgB,KAAK,MAAM,KAAK,UAAUD,CAAW,CAAC,EAExDE,GAAUD,EACHC,EACT,CATgBC,EAAAJ,GAAA,cAWT,IAAMK,GAAyB,GACzBC,GAA2B,GAC3BC,GAAsB,SAEtBC,GAA0B,eAE1BC,GAA0BL,EAAA,CACrCM,EACAC,IACG,CACH,IAAIC,EAAS,GACb,GAAID,GAAgBD,GAClB,GAAI,MAAM,QAAQC,CAAY,EAC5BC,EAAS,CAACD,EAAa,KAAME,GAAUC,GAAeD,EAAOH,CAAK,CAAC,UAC1D,CAAC,MAAM,QAAQC,CAAY,GAAKA,EAAaD,EAAM,UAAU,EAAG,CACzEE,EAASD,EAAaD,EAAM,UAAU,EAAE,OAAO,KAAMG,GACnDC,GAAeD,EAAOH,CAAK,CAC7B,EACA,IAAMK,EAAaJ,EAAaD,EAAM,UAAU,EAAE,WAClD,MAAQ,CAACK,GAAc,CAACH,GAAYG,GAAcH,CACpD,EAEF,OAAOA,CACT,EAjBuC,2BAmB1BI,GAA+BZ,EAAA,CAC1Ca,EACAC,IAGED,GACAC,GACA,CAACA,EAAkB,SAASD,EAAW,IAAI,EAPH,gCAW/BE,GAAsBf,EAAA,CACjCgB,EACAC,EACAC,IAGGA,IAAY,aAAeF,GAAiBC,IAC5CC,IAAY,iBAAmBD,EAPD,uBL9EnC,IAAIE,GAESC,GAAcC,EAAA,IACrBF,KAGJA,GAAQ,IAAIG,GAAYC,GAAU,SAAS,EAAGA,GAAU,UAAU,CAAC,EAC5DJ,IALkB,eME3B,IAAMK,GAAkBC,EAA2CC,GAAc,CAC/E,IAAIC,EAAQD,EACZC,EAAM,IAAM,CAAC,EACb,QAASC,KAAK,OAAO,KAAKD,EAAM,SAAS,CAAC,EACvCA,EAAM,IAAYC,CAAC,EAAI,IAAMD,EAAOE,GAAMA,EAAED,CAAmB,CAAC,EAGnE,OAAOD,CACT,EARwB,mBAUjBG,GAAQN,GPmCR,IAAMO,EAAkBC,GAC7BC,GAAqB,EACnBC,GAAsB,CAACC,EAAKC,KAAS,CACnC,iBAAkB,CAAC,EACnB,SAAU,CAAC,EACX,QAAS,GACT,cAAe,CAACC,EAAUC,IAAW,CACnC,IAAMC,EAAoBH,EAAI,EAAE,kBAChCD,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBACrB,OAAQC,GAAWA,EAAO,aAAeJ,EAAS,CAAC,EAAE,UAAU,EAC/D,OACCA,EAAS,IAAKK,GAAY,CACxB,IAAMC,EAA6B,CAACH,EAAM,iBAAiB,KACxDI,GACCA,EAAgB,QAAUF,EAAQ,OAClCE,EAAgB,QACpB,EACA,MAAO,CACL,SAAU,CAAC,EACX,QAASF,EAAQ,QACjB,MAAOA,EAAQ,MACf,YAAa,KACb,WAAYA,EAAQ,WACpB,SAAUC,EACV,QAAS,GACT,MAAO,EACT,CACF,CAAC,CACH,CACJ,EAAE,EACFJ,EAAkBF,EAAUC,CAAM,CACpC,EACA,iBAAmBO,GAAe,CAChCV,EAAKK,GAAU,CACb,IAAMM,EAAkBN,EAAM,iBAC3B,OACEI,GACCA,EAAgB,UAChBA,EAAgB,aAAeC,CACnC,EACC,IAAKE,GAAmBA,EAAe,KAAK,EAEzCC,EAAmBR,EAAM,iBAC5B,OACEI,GAAoBA,EAAgB,aAAeC,CACtD,EACC,IAAKD,GACmCE,EAAgB,SACrDF,EAAgB,KAClB,EAESA,GAETE,EAAgB,KAAKF,EAAgB,KAAK,EACnC,CAAE,GAAGA,EAAiB,SAAU,EAAK,EAC7C,EAIH,MAAO,CACL,SAHeK,GAAkBD,CAAgB,EAIjD,iBAAAA,CACF,CACF,CAAC,CACH,EACA,cAAgBE,GACdf,EAAKK,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IAAKI,GAAoB,CAChE,IAAMO,EAAiB,CAAC,CAACD,EAAQ,KAC9BT,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtCA,EAAgB,QACpB,EACMQ,EAAoB,CAAC,CAACF,EAAQ,KACjCT,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtC,CAACA,EAAgB,QACrB,EACA,OAAIO,EACK,CAAE,GAAGP,EAAiB,SAAU,EAAM,EACpCQ,EACF,CAAE,GAAGR,EAAiB,SAAU,EAAK,EAGvCA,CACT,CAAC,CACH,EAAE,EACJ,qBAAsB,IACpBT,EAAI,KAAO,CACT,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,CACpB,EAAE,EACJ,kBAAmB,MAAOE,EAAUC,EAAQe,EAAc,KAAS,CACjE,IAAMd,EAAoBH,EAAI,EAAE,kBAChCD,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBAAiB,IAAKC,GACrCJ,EAAS,KAAMK,GACpBY,GAA0BZ,EAASD,CAAM,CAC3C,EACI,CAAE,GAAGA,EAAQ,QAAS,EAAK,EAC3BA,CACL,CACH,EAAE,EACF,GAAI,CACF,IAAMc,EAAOlB,EAAS,IAAI,CAAC,CAAE,QAAAmB,EAAS,MAAAC,CAAM,KAAO,CACjD,QAAAD,EACA,WAAYC,CACd,EAAE,EAEIC,GADW,MAAMC,GAAY,EAAE,kBAAkBJ,CAAI,GACzB,QAClC,GAAIG,EACFvB,EAAKK,GAAU,CACb,IAAMQ,EAAmBR,EAAM,iBAAiB,IAC7CI,GAAoB,CACnB,IAAMgB,EAAiBvB,EAAS,KAAMK,GACpCY,GAA0BZ,EAASE,CAAe,CACpD,EACMiB,EAA0BH,EAAiB,KAC9CI,GACCA,EAAQ,UAAYlB,EAAgB,SACpCkB,EAAQ,aAAelB,EAAgB,KAC3C,EACA,OACEiB,GAAyB,QACzBD,GACAP,GAEAd,EAAkB,CAACqB,CAAc,EAAGtB,EAAQ,EAAK,EAE5CsB,GAAkBC,EACrB,CACE,GAAGjB,EACH,YAAaiB,EAAwB,YACrC,SAAUE,GACRF,EACAvB,CACF,EACA,QAAS,EACX,EACAM,CACN,CACF,EAIA,MAAO,CACL,QAAS,GACT,SAJeK,GAAkBD,CAAgB,EAKjD,iBAAAA,CACF,CACF,CAAC,MAED,OAAM,IAAI,MAAM,kBAAkB,CAEtC,MAAgB,CACdb,EAAKK,GAAU,CACb,IAAMQ,EAAmBR,EAAM,iBAAiB,IAAKsB,GAC5CzB,EAAS,KAAMK,GACpBY,GAA0BZ,EAASoB,CAAO,CAC5C,EACIE,GAA0BF,CAAO,EACjCA,CACL,EAID,MAAO,CACL,QAAS,GACT,SAJeb,GAAkBD,CAAgB,EAKjD,iBAAAA,CACF,CACF,CAAC,CACH,CACF,EACA,cAAgBiB,GAAU,CACxB,GAAM,CAAE,SAAAC,CAAS,EAAI9B,EAAI,EACnB+B,EAAYC,GAAgBH,CAAK,EAEvC,OADgBC,EAASC,CAAS,GAChB,IACpB,CACF,EAAE,CACJ,CACF,EQ7OA,OAAS,gBAAAE,OAAoB,0BAYtB,SAASC,GACdC,EACAC,EACqB,CACrB,IAAMC,EAAMC,GAAa,CACvB,eAAgB,CACd,cAAeF,GAAS,wBAA0B,EACpD,CACF,CAAC,EAED,GAAID,EAAW,CACb,IAAMI,EAAyC,CAAC,EAEhD,OAAAJ,EAAU,QAASK,GAAsB,CAMvC,GAAI,OAAOA,GAAsB,SAAU,CACzC,IAAMC,EAAwCJ,EAAI,KAAMK,GAC/CA,EAAS,OAAO,OAASF,CACjC,EACGC,EACFF,EAAkB,KAAKE,CAAM,EAE7B,QAAQ,KACN,iBAAiBD,CAAiB,+DACpC,CAEJ,MAEED,EAAkB,KAAKC,CAAiB,CAE5C,CAAC,EACMD,CACT,CAEA,OAAOF,CACT,CAvCgBM,EAAAT,GAAA,6BAyCT,SAASU,GACdC,EACAT,EACU,CAKV,OAJkBF,GAA0BW,EAAQT,CAAO,EACnC,IAAKM,GACpBA,EAAS,OAAO,IACxB,CAEH,CATgBC,EAAAC,GAAA,6BT/CT,SAASE,GACdC,EACAC,EACA,CACA,IAAMC,EAAuBC,EAAgB,IAAI,qBAAqB,EAClEC,EAAyCC,GAC3C,OACAJ,CACF,EAEA,OAAAK,GAAU,IAAM,CACdJ,EAAqB,EACrBE,EAAoBC,GAA0BL,EAAW,CACvD,uBAAwBC,GAAS,sBACnC,CAAC,CACH,EAAG,CAACD,GAAW,MAAM,CAAC,EAEf,CACL,UAAWI,CACb,CACF,CApBgBG,EAAAR,GAAA,sBUNhB,OAAOS,IAAS,iBAAAC,GAAe,cAAAC,GAAY,aAAAC,GAAW,UAAAC,OAAc,QCGpE,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,OAAe,qBCHjB,IAAMC,GAA+B,CAC1C,OAAQ,GACR,MAAO,OACP,aAAc,GACd,wBAAyB,GACzB,kBAAmB,GACnB,QAAS,SACX,EAUMC,GAAwC,CAC5C,UAAW,MACb,EAEMC,GAAsC,CAC1C,iBAAkB,MACpB,EAuBaC,GAITC,EAAA,CAACC,EAAaC,EAAKC,KACd,CACL,OAAQ,CAAE,GAAGP,GAAgB,GAAGK,CAAY,EAC5C,OAAQJ,GACR,aAAcC,GACd,oBAAqB,IAAM,CACzB,GAAM,CAAE,OAAAM,EAAQ,aAAAC,CAAa,EAAIF,EAAI,EACrC,OAAOE,EAAa,kBAAkB,OAClCA,EAAa,iBACbD,EAAO,kBAAoB,CAAC,CAClC,EACA,4BAA6B,IAAM,CACjC,GAAM,CAAE,yBAAAE,EAA0B,aAAAD,CAAa,EAAIF,EAAI,EACvD,OAAOE,EAAa,kBAAkB,OAClC,CAAC,EACDC,CACN,EACA,wBAAyB,IAAM,CAC7B,GAAM,CAAE,OAAAF,EAAQ,aAAAC,CAAa,EAAIF,EAAI,EACrC,OAAOE,EAAa,kBAAkB,OAClC,GACA,CAAC,CAACD,EAAO,uBACf,EACA,iBAAkB,IAAM,CACtB,GAAM,CAAE,aAAAC,CAAa,EAAIF,EAAI,EAC7B,MAAO,CAAC,CAACE,EAAa,kBAAkB,MAC1C,EAGA,aAAeE,GAA6B,CAC1C,IAAMC,EAAgBL,EAAI,EAAE,OAE5BD,EAAI,CACF,OAAQ,CACN,GAAGM,EACH,GAAGD,CACL,CACF,CAAC,CACH,EAEA,mBAAoB,CAACE,EAAMC,IAAU,CACnC,IAAMC,EAAsBR,EAAI,EAAE,aAElCD,EAAI,CACF,aAAc,CACZ,GAAGS,EACH,CAACF,CAAI,EAAGC,CACV,CACF,CAAC,CACH,EAEA,aAAc,CAACD,EAAMC,IAAU,CAC7B,IAAME,EAAsBT,EAAI,EAAE,OAElCD,EAAI,CACF,OAAQ,CACN,GAAGU,EACH,CAACH,CAAI,EAAGC,CACV,CACF,CAAC,CACH,CACF,GA7DE,qBC3CG,SAASG,GAAuBC,EAAiB,CACtD,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAK,CAAC,CAClC,CAFgBC,EAAAF,GAAA,uBAIT,SAASG,GACdC,EACAC,EACA,CACA,OACED,EAAO,SAAWC,EAAO,QAAUD,EAAO,MAAM,CAACE,EAAGC,IAAMD,IAAMD,EAAOE,CAAC,CAAC,CAE7E,CAPgBL,EAAAC,GAAA,YAST,SAASK,GAASC,EAAcC,EAAc,CACnD,IAAIC,EACJ,OAAOC,EACP,SAASA,KAAWC,EAAW,CACzBF,GACF,aAAaA,CAAS,EAExBA,EAAY,WAAW,IAAM,CAC3BA,EAAY,KACZF,EAAG,GAAGI,CAAI,CACZ,EAAGH,CAAI,CACT,CACF,CAZgBR,EAAAM,GAAA,YAcT,SAASM,GAAaC,EAAcC,EAA6B,CAEtE,OAAOD,EAAK,YAAY,EAAE,QAAQC,EAAW,YAAY,CAAC,EAAI,EAChE,CAHgBd,EAAAY,GAAA,gBAKT,SAASG,GAAUF,EAAcC,EAA6B,CACnE,OAAOD,EAAK,YAAY,IAAMC,EAAW,YAAY,CACvD,CAFgBd,EAAAe,GAAA,aAIT,SAASC,GAAcH,EAAcC,EAA6B,CACvE,OAAOD,EAAK,YAAY,EAAE,WAAWC,EAAW,YAAY,CAAC,CAC/D,CAFgBd,EAAAgB,GAAA,iBAIT,IAAMC,EAAejB,EAAA,IAC1B,SAAS,eAAekB,GAAa,WAAW,EADtB,gBAGfC,GAAcnB,EAAA,IACzB,SAAS,eAAekB,GAAa,eAAe,EAD3B,eAG3B,SAASE,GACPC,EACAC,EACAC,EACA,CACA,IAAMC,EAAc,CAAC,CAACF,GAASP,GAAUO,EAAOD,CAAS,EACnDI,EAAc,CAAC,CAACF,GAASR,GAAUQ,EAAOF,CAAS,EACzD,OAAIG,IAAgBC,EACXD,EAAc,GAAK,EAGrB,CACT,CAZSxB,EAAAoB,GAAA,yBAcT,SAASM,GACPL,EACAC,EACAC,EACA,CACA,IAAMI,EAAgB,CAAC,CAACL,GAASV,GAAaU,EAAOD,CAAS,EACxDO,EAAgB,CAAC,CAACL,GAASX,GAAaW,EAAOF,CAAS,EAC9D,OAAIM,IAAkBC,EACbD,EAAgB,GAAK,EAI1BA,GAAiBC,GAAiBN,GAAO,SAAWC,GAAO,OACtDD,GAAO,OAASC,GAAO,OAGzB,CACT,CAjBSvB,EAAA0B,GAAA,uBAmBT,SAASG,GACPR,EACAC,EACAC,EACA,CACA,IAAMO,EAAiB,CAAC,CAACR,GAASN,GAAcM,EAAOD,CAAS,EAC1DU,EAAiB,CAAC,CAACR,GAASP,GAAcO,EAAOF,CAAS,EAChE,OAAIS,IAAmBC,EACdD,EAAiB,GAAK,EAI3BA,GAAkBC,GAAkBT,GAAO,SAAWC,GAAO,OACxDD,GAAO,OAASC,GAAO,OAGzB,CACT,CAjBSvB,EAAA6B,GAAA,wBAmBF,SAASG,GACdC,EACAC,EACAb,EACQ,CACR,GAAI,CAACA,EACH,MAAO,GAIT,IAAMc,EAA0Bf,GAC9BC,EACAY,EAAO,OACPC,EAAO,MACT,EACA,GAAIC,EACF,OAAOA,EAIT,GAAId,EAAU,QAAU,EAAmC,CACzD,IAAMe,EAA6BhB,GACjCC,EACAY,EAAO,KACPC,EAAO,IACT,EACA,GAAIE,EACF,OAAOA,CAEX,CAGA,GAAIf,EAAU,QAAU,EAA8B,CACpD,IAAMgB,EAAyBR,GAC7BR,EACAY,EAAO,OACPC,EAAO,MACT,EAEA,GAAIG,EACF,OAAOA,CAEX,CAGA,GAAIhB,EAAU,QAAU,EAA4B,CAClD,IAAMiB,EAAwBZ,GAC5BL,EACAY,EAAO,OACPC,EAAO,MACT,EAEA,GAAII,EACF,OAAOA,CAEX,CAGA,GAAIjB,EAAU,QAAU,EAAgC,CACtD,IAAMkB,EAA4BV,GAChCR,EACAY,EAAO,KACPC,EAAO,IACT,EAEA,GAAIK,EACF,OAAOA,CAEX,CAGA,GAAIlB,EAAU,QAAU,EAAgC,CACtD,IAAMmB,EAA2Bd,GAC/BL,EACAY,EAAO,KACPC,EAAO,IACT,EAEA,GAAIM,IAA6B,EAC/B,OAAOA,CAEX,CAGA,GAAInB,EAAU,QAAU,EAAmC,CACzD,IAAMoB,EAA0BZ,GAC9BR,EACAY,EAAO,QACPC,EAAO,OACT,EAEA,GAAIO,EACF,OAAOA,CAEX,CAGA,GAAIpB,EAAU,QAAU,EAAmC,CACzD,IAAMqB,EAAwBhB,GAC5BL,EACAY,EAAO,QACPC,EAAO,OACT,EAEA,GAAIQ,IAA0B,EAC5B,OAAOA,CAEX,CAEA,MAAO,EACT,CA9GgB1C,EAAAgC,GAAA,wBCzGT,SAASW,GACdC,EACAC,EACoB,CACpB,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASF,CAAc,GACtE,WACN,CANgBG,EAAAJ,GAAA,+BAOT,SAASK,GACdJ,EACAC,EACoB,CACpB,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASF,CAAc,GACtE,SACN,CANgBG,EAAAC,GAAA,6BAQT,SAASC,GACdC,EACAC,EACA,CACA,OAAOA,EAAS,KAAMC,GAAYA,EAAQ,KAAOF,CAAS,GAAG,YAC/D,CALgBH,EAAAE,GAAA,yBAOT,SAASI,GAAU,EAAUC,EAAiB,CACnD,OAAOA,EAAO,KAAMC,GAAUC,GAAeD,EAAO,CAAC,CAAC,GAAK,IAC7D,CAFgBR,EAAAM,GAAA,aAIT,SAASI,GAAeC,EAAcb,EAA+B,CAC1E,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASY,CAAI,GAAK,IACvE,CAFgBX,EAAAU,GAAA,kBAIT,SAASE,GACdJ,EACAT,EACA,CACA,GAAI,CAACA,GAAc,CAACS,EAClB,MAAO,GAGT,QAAWK,KAAYd,EAAW,UAChC,GACES,GAAO,aAAeK,GAAU,YAChCL,GAAO,SAAWK,GAAU,QAC5BL,GAAO,UAAYK,GAAU,QAE7B,MAAO,GAIX,MAAO,EACT,CAnBgBb,EAAAY,GAAA,iBCrBT,SAASE,GACdC,EACAC,EAC2B,CAC3B,IAAMC,EAAoBF,EAAS,IAAKG,GAAYA,EAAQ,YAAY,EAElEC,EAAgE,CAAC,EAIvE,OAFoBC,GAAoBL,EAAS,IAAK,GAAM,EAAE,YAAY,CAAC,EAE/D,IAAKM,GAAoB,CACnC,IAAMC,EAAcP,EAAS,KAC1BG,GAAYA,EAAQ,eAAiBG,CACxC,EAEA,GAAIC,EAAa,CACf,IAAIC,EAAqB,GACrBN,IACFM,EAAqBN,EAAkB,KACpCO,GAAkBA,IAAkBF,EAAY,YACnD,GAGEC,GACFD,EAAY,MAAM,IAAKG,GAAoB,CACzCN,EAA8B,KAAK,CACjC,GAAIG,EAAY,aAChB,WAAYA,EAAY,aACxB,KAAMA,EAAY,KAClB,KAAMG,EACN,SAAU,CAACT,EAAyB,SAClCM,EAAY,YACd,CACF,CAAC,CACH,CAAC,CAEL,CACF,CAAC,EAEMH,CACT,CAxCgBO,EAAAZ,GAAA,2BA0CT,SAASa,GACdC,EACAC,EACA,CACA,OAAID,EAAE,aAAeC,EAAE,aACd,GAGLD,EAAE,aAAeC,EAAE,aACd,EAGF,CACT,CAbgBH,EAAAC,GAAA,oCAeT,SAASG,GAAgBC,EAAyBC,EAAqB,CAC5E,OAAOA,IAAWD,CAAO,IAAM,QACjC,CAFgBL,EAAAI,GAAA,mBAIT,SAASG,GAAiBF,EAAyBC,EAAqB,CAC7E,OAAOA,IAAWD,CAAO,IAAM,SACjC,CAFgBL,EAAAO,GAAA,oBClCT,IAAMC,GAKTC,EAAA,CAACC,EAAKC,KAAS,CAEjB,sBAAuB,IAAI,IAC3B,QAAS,CAAC,EACV,eAAgB,CAAC,EACjB,UAAW,CAAC,EACZ,YAAa,UAEb,YAAcC,GAAY,CACxB,IAAMC,EAAuBF,EAAI,EAAE,sBAC7BG,EAAuB,MAAM,KACjCD,GAAsB,OAAO,GAAK,CAAC,CACrC,EAEA,GAAI,CAACD,GAAW,CAACA,GAAS,KACxB,OAAOE,EAGT,IAAMC,EAASJ,EAAI,EAAE,OACfK,GACHJ,EAAQ,OAAS,SACdG,EAAO,MAAM,YACbA,EAAO,IAAI,cAAgB,CAAC,EAalC,OAXaD,EAAqB,OAAQG,GAEtC,EAAAD,EAA+B,OAAS,GACxC,CAACA,EAA+B,SAASC,EAAW,IAAI,EAM3D,CAGH,EACA,OAASL,GAAY,CACnB,IAAMM,EAAkBP,EAAI,EAAE,QACxBE,EAAuBF,EAAI,EAAE,sBAEnC,GAAI,CAACC,GAAW,CAACA,GAAS,KACxB,OAAOM,EAGT,IAAMH,EAASJ,EAAI,EAAE,OACfQ,GACHP,EAAQ,OAAS,SAAWG,EAAO,MAAM,OAASA,EAAO,IAAI,SAC9D,CAAC,EACGK,EAAcT,EAAI,EAAE,YAAY,CACpC,KAAMC,EAAQ,IAChB,CAAC,EAqGD,OAnGaM,EACV,OAAQG,GAELF,GACAG,GAAwBD,EAAOF,CAAqB,GAMhDP,EAAQ,YAAcS,EAAM,aAAeT,EAAQ,YAMvD,CAACQ,EAAY,KAAMH,GACVA,EAAW,OAASI,EAAM,UAClC,EAEM,GAILT,EAAQ,UAER,GAAAW,GAAaF,EAAM,OAAQT,EAAQ,SAAS,GAC5CW,GAAaF,EAAM,SAAW,GAAIT,EAAQ,SAAS,GACnDW,GAAaF,EAAM,MAAQ,GAAIT,EAAQ,SAAS,GAQ7C,EACR,EACA,KAAK,CAACY,EAAQC,IAAW,CAExB,IAAMC,EAAiBf,EAAI,EAAE,cAAca,EAAQZ,EAAQ,IAAI,EACzDe,EAAiBhB,EAAI,EAAE,cAAcc,EAAQb,EAAQ,IAAI,EAC/D,GAAIc,IAAmBC,EACrB,OAAOD,EAAiB,GAAK,EAI/B,GAAId,EAAQ,cAAe,CACzB,IAAMgB,EAAgBhB,EAAQ,cAAcY,CAAM,EAC5CK,EAAgBjB,EAAQ,cAAca,CAAM,EAC5CK,EAAiBC,GACrBH,EACAC,CACF,EACA,GAAIC,IAAmB,EACrB,OAAOA,CAEX,CAEA,IAAME,EAAcnB,EAAqB,IAAIW,EAAO,UAAU,EACxDS,EAAcpB,EAAqB,IAAIY,EAAO,UAAU,EAGxDS,EAAiBC,GAAcX,EAAQQ,CAAW,EAClDI,EAAiBD,GAAcV,EAAQQ,CAAW,EACxD,GAAIC,IAAmBE,EACrB,OAAOF,EAAiB,GAAK,EAI/B,GAAIV,EAAO,YAAcC,EAAO,UAC9B,OAAOD,EAAO,UAAY,GAAK,EAIjC,GAAIZ,EAAQ,UAAW,CACrB,IAAMyB,EAAyBC,GAC7Bd,EACAC,EACAb,EAAQ,SACV,EACA,GAAIyB,EACF,OAAOA,CAEX,CAGA,OAAIb,EAAO,kBAAoBC,EAAO,gBAC7BD,EAAO,gBAAkB,EAAI,GAIhCQ,GAAiBC,EACdD,EAAY,KAAOC,EAAY,KAGjC,CACT,CAAC,CAGL,EACA,cAAe,CAACZ,EAAOkB,IAKN,CAAC,EAHdA,IAAS,SACL5B,EAAI,EAAE,OAAO,MAAM,aACnBA,EAAI,EAAE,OAAO,IAAI,eACQ,KAAM6B,GACnCC,GAAeD,EAAanB,CAAK,CACnC,EAGF,SAAU,IAAM,CACd,GAAM,CAAE,OAAAN,EAAQ,aAAA2B,CAAa,EAAI/B,EAAI,EAE/BgC,EAA8BD,EAAa,kBAAkB,OAC/DA,EAAa,iBACb,KAEEE,EACJD,GAA+B5B,EAAO,iBAElC8B,EAA0BF,EAC5B,GACA5B,EAAO,wBAuBX,OAjBiBJ,EAAI,EAAE,UAAU,OAAQmC,GAAY,CACnD,IAAMC,EAAyCH,GAAkB,SAC/DE,EAAQ,YACV,EAOA,OAJED,GACA,CAACD,GACDA,EAAiB,SAAW,EAG1B,CAACG,EACDA,CACN,CAAC,EAE+B,KAAKC,EAAgC,CAGvE,EAEA,MAAO,SAAY,CACjB,GAAI,CACF,GAAM,CAAE,0BAAAC,CAA0B,EAAItC,EAAI,EAAE,OACtCuC,EAAW,MAAMC,GAAI,EAAE,eAAe,CAC1C,0BAAAF,CACF,CAAC,EAEDvC,EAAI,CAAE,YAAa,SAAU,CAAC,EAC9B,IAAMG,EAAoD,IAAI,IAKxDuC,EAAkB,CAAC,EACnBC,EAAyBH,EAAS,cAClCI,EAA0BJ,EAAS,SAEnCK,EAAiC,IAAI,IAE3CL,EAAS,OAAO,QAAS7B,GAAU,CACjCkC,EAA+B,IAAIlC,EAAM,UAAU,EAEnD+B,EAAO,KAAK/B,CAAK,CACnB,CAAC,EAEwB6B,EAAS,YAAY,KAC5C,CAACM,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IACvB,EAEiB,QAASxC,GAAe,CAErCA,EAAW,SACXsC,EAA+B,IAAItC,EAAW,IAAI,GAElDJ,EAAqB,IAAII,EAAW,KAAMA,CAAU,CAExD,CAAC,EAEDP,EAAI,CACF,sBAAuBG,EACvB,QAASuC,EACT,eAAgBC,EAChB,UAAWC,CACb,CAAC,CACH,OAASI,EAAO,CACd,MAAAhD,EAAI,CAAE,YAAa,QAAS,CAAC,EACvBgD,CACR,CACF,CACF,GA3PI,mBC3CJ,OACE,WAAAC,GACA,WAAAC,GACA,WAAAC,GACA,UAAAC,GACA,UAAAC,GACA,UAAAC,GACA,WAAAC,GACA,YAAAC,GACA,eAAAC,GACA,UAAAC,GACA,cAAAC,GACA,WAAAC,GACA,WAAAC,GACA,WAAAC,GACA,aAAAC,OACK,gBASA,IAAMC,GAA4B,CACvC,CAAE,MAAO,UAAW,MAAO,UAAW,MAAO,KAAM,QAASd,EAAQ,EACpE,CAAE,MAAO,UAAW,MAAO,aAAW,MAAO,KAAM,QAASW,EAAQ,EACpE,CAAE,MAAO,SAAU,MAAO,cAAY,MAAO,KAAM,QAAST,EAAO,EACnE,CAAE,MAAO,WAAY,MAAO,qBAAO,MAAO,KAAM,QAASI,EAAS,EAClE,CAAE,MAAO,aAAc,MAAO,eAAa,MAAO,KAAM,QAASG,EAAW,EAC5E,CAAE,MAAO,UAAW,MAAO,qBAAO,MAAO,KAAM,QAASV,EAAQ,EAChE,CAAE,MAAO,UAAW,MAAO,6CAAW,MAAO,KAAM,QAASW,EAAQ,EACpE,CAAE,MAAO,SAAU,MAAO,UAAW,MAAO,KAAM,QAASP,EAAO,EAClE,CAAE,MAAO,YAAa,MAAO,6CAAW,MAAO,KAAM,QAASU,EAAU,EACxE,CAAE,MAAO,UAAW,MAAO,UAAW,MAAO,KAAM,QAASD,EAAQ,EACpE,CAAE,MAAO,UAAW,MAAO,cAAe,MAAO,KAAM,QAASX,EAAQ,EACxE,CAAE,MAAO,QAAS,MAAO,aAAc,MAAO,KAAM,QAASM,EAAY,EACzE,CAAE,MAAO,QAAS,MAAO,SAAU,MAAO,KAAM,QAASH,EAAO,EAChE,CAAE,MAAO,UAAW,MAAO,WAAY,MAAO,KAAM,QAASC,EAAQ,EACrE,CAAE,MAAO,SAAU,MAAO,SAAU,MAAO,KAAM,QAASG,EAAO,CACnE,EAEaO,GAAmB,KCzCzB,IAAMC,GAAY,CAAC,GAAK,EAAQ,CAAI,EAE9BC,GAAmB,EAEnBC,GAAgB,EAEhBC,GAAe,IAEfC,GAAe,ECmCrB,IAAMC,GAKTC,EAAA,CAACC,EAAKC,KAAS,CACjB,yBAA0B,CAAC,EAC3B,MAAO,OACP,SAAU,KACV,qBAAsB,CAAC,EACvB,SAAUC,GACV,eAAgB,KAChB,gBAAiB,GACjB,aAAc,KACd,iBAAkB,KAClB,iBAAkB,KAElB,uBAAyBC,GAAe,CACtC,IAAMC,EAA8BH,EAAI,EAAE,qBAW1C,GAT2BG,EAA4B,KACrD,CAACC,EAAqBC,IAAU,CAC9B,IAAMC,EAAmBF,IAAwBF,EAC3CK,EAAkBF,GAAS,EAEjC,OAAOC,GAAoBC,CAC7B,CACF,EAGE,OAGF,IAAMC,EACJL,EAA4B,OAAQC,GAG3B,EAFkBA,IAAwBF,EAGlD,EAEHH,EAAI,KAAO,CACT,qBAAsB,CAACG,EAAY,GAAGM,CAAwB,CAChE,EAAE,CACJ,EACA,YAAcC,GACZV,EAAI,KAAO,CACT,SAAUU,CACZ,EAAE,EACJ,kBAAoBC,GAClBX,EAAI,KAAO,CACT,eAAgBW,CAClB,EAAE,EACJ,gBAAkBC,GAChBZ,EAAI,KAAO,CACT,aAAAY,CACF,EAAE,EACJ,oBAAsBC,GACpBb,EAAI,KAAO,CACT,iBAAAa,CACF,EAAE,EAEJ,oBAAsBC,GACpBd,EAAI,KAAO,CACT,iBAAAc,CACF,EAAE,EACJ,0BAA2B,CAACC,EAAUC,IACpChB,EAAKiB,GAAU,CACb,GAAID,EACF,MAAO,CAAE,yBAA0B,CAAC,CAAE,EAExC,IAAME,EAAgBC,GACpBJ,EAAS,IAAKK,GAAYA,EAAQ,YAAY,CAChD,EAEA,OAAIF,EAAc,SAAWD,EAAM,yBAAyB,OACnD,CAAE,yBAA0B,CAAC,CAAE,EAGjC,CACL,yBAA0BC,CAC5B,CACF,CAAC,EACH,sBAAuB,IACrBlB,EAAKiB,IAAW,CACd,gBAAiB,CAACA,EAAM,eAC1B,EAAE,EACJ,sBAAwBI,GACtBrB,EAAKiB,GACCA,EAAM,yBAAyB,SAASI,CAAI,EACvC,CACL,yBAA0BJ,EAAM,yBAAyB,OACtDK,GAAoBA,GAAmBD,CAC1C,CACF,EAEK,CACL,yBAA0BJ,EAAM,yBAAyB,OAAOI,CAAI,CACtE,CACD,EACH,SAAWE,GACTvB,EAAI,KAAO,CACT,MAAAuB,CACF,EAAE,EACJ,YAAcC,GACZxB,EAAI,KAAO,CACT,SAAAwB,CACF,EAAE,EACJ,eAAiBC,GAA6B,CAC5C,GAAM,CAAE,SAAAC,EAAU,MAAAH,CAAM,EAAIE,EAEtBE,EAAgBC,GAAgB,QAASF,CAAQ,EACjDG,EAAmBD,GAAgB,WAAYF,CAAQ,EACvDI,EAAoBF,GAAgB,kBAAmBF,CAAQ,EAC/DK,EAAcR,GAAO,YAE3BvB,EAAI,CACF,GAAI2B,GAAiB,CAAE,MAAOF,EAAW,OAAO,MAAQ,MAAO,EAC/D,GAAIM,GAAe,CAAE,MAAON,EAAW,OAAO,MAAQ,OAAQ,EAC9D,GAAII,GAAoB,CACtB,SAAUJ,EAAW,UAAYO,EACnC,EACA,GAAIF,GAAqB,CACvB,yBAA0BL,EAAW,kBAAoB,CAAC,CAC5D,CACF,CAAC,CACH,CACF,GAzHI,uBR5BG,SAASQ,GAAeC,EAA4B,CACzD,OAAOC,GAAsB,EAC3BC,GACE,IAAIC,KAAO,CACT,GAAGC,GAAgB,GAAGD,CAAC,EACvB,GAAGE,GAAoB,GAAGF,CAAC,EAC3B,GAAGG,GAAkBN,EAAa,GAAGG,CAAC,CACxC,GACA,CACE,KAAM,gBACN,cAAe,GACf,WAAaI,IACJ,CACL,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,iBAAkBA,EAAM,iBACxB,aAAcA,EAAM,aACpB,iBAAkBA,EAAM,iBACxB,SAAUA,EAAM,SAChB,eAAgBA,EAAM,eACtB,gBAAiBA,EAAM,gBACvB,qBAAsBA,EAAM,qBAC5B,yBAA0BA,EAAM,wBAClC,EAEJ,CACF,CACF,CACF,CA5BgBC,EAAAT,GAAA,kBDdT,IAAMU,GAAkBC,GAA+B,IAAI,EAE3D,SAASC,GAAc,CAC5B,IAAMC,EAAQC,GAAWJ,EAAe,EAQxC,GANAK,GAAU,IAAM,CACVF,GAAS,CAACA,EAAM,QAAQ,YAAY,GACjCA,EAAM,QAAQ,UAAU,CAEjC,EAAG,CAAC,CAAC,EAED,CAACA,EACH,MAAM,IAAI,MAAM,8CAA8C,EAGhE,OAAOA,EAAM,CACf,CAdgBG,EAAAJ,EAAA,eAgBT,SAASK,GAAiBC,EAA8B,CAC7D,IAAMC,EAAcC,GAAiB,EAErC,OAAKD,EAAY,UACfA,EAAY,QAAUE,GAAeH,EAAM,MAAM,GAIjDI,GAAA,cAACZ,GAAgB,SAAhB,CAAyB,MAAOS,EAAY,SAC1CD,EAAM,QACT,CAEJ,CAZgBF,EAAAC,GAAA,oBUzBhB,OAAS,UAAAM,OAAc,UCDhB,IAAMC,GAAe,eCOrB,IAAMC,GAAN,KAAgD,CATvD,MASuD,CAAAC,EAAA,mBAC7C,MACA,MAAqD,gBACrD,aACA,OAAiB,CAAC,EAClB,QAER,YAAYC,EAAgB,CAC1B,KAAK,QAAU,IAAI,iBAAiBC,EAAY,EAChD,KAAK,MAAQ,KAAK,MAAM,KAAK,OAAO,EAAI,GAAc,EACtD,KAAK,OAASD,CAChB,CAEA,KAAO,IAAM,CACX,KAAK,WAAW,EACX,KAAK,SAAS,CACrB,EAKA,WAAa,IAAM,CACjB,GAAI,CAAC,KAAK,UAAU,EAAG,CACrB,IAAME,EAAmB,CAAE,KAAM,cAAe,YAAa,KAAK,KAAM,EACxE,KAAK,QAAQ,YAAYA,CAAO,EAChC,WAAW,IAAM,CACV,KAAK,UAAU,GAClB,KAAK,MAAM,CAEf,EAAG,GAAO,CACZ,CACF,EAEA,UAAY,IACH,KAAK,QAAU,UAMxB,QAAU,IAAM,CACd,KAAK,QAAQ,oBAAoB,UAAW,KAAK,kBAAkB,EACnE,SAAS,oBACP,mBACA,KAAK,sBACP,EACA,SAAS,oBAAoB,SAAU,KAAK,YAAY,CAC1D,EAKQ,YAAa,CACnB,KAAK,QAAQ,iBAAiB,UAAW,KAAK,kBAAkB,EAEhE,SAAS,iBAAiB,mBAAoB,KAAK,sBAAsB,EAWzE,SAAS,iBAAiB,SAAU,KAAK,YAAY,CACvD,CAaQ,oBAAoBC,EAAgB,CAC1C,IAAMC,EAAmB,KAAK,cAAgB,KAAK,aAAeD,EAElE,GAAI,KAAK,UAAU,GAAKC,EAAkB,CACxC,IAAMF,EAAmB,CACvB,KAAM,MACR,EACA,KAAK,QAAQ,YAAYA,CAAO,EAChC,MACF,CACF,CAEQ,mBAAsBG,GAAiC,CAC7D,IAAMC,EAAOD,EAAM,KAAK,KAExB,OAAQC,EAAM,CACZ,IAAK,OACH,KAAK,oBAAoBD,EAAM,KAAK,MAAM,EAC1C,MAEF,IAAK,OACH,KAAK,2BAA2B,EAChC,MAEF,IAAK,cACH,KAAK,aAAaA,EAAM,KAAK,WAAW,EACxC,MAEF,IAAK,gBACC,KAAK,QAAUA,EAAM,KAAK,aAC5B,KAAK,MAAM,EAEb,MAEF,QACE,MAAM,IAAI,MAAM,GAAGC,CAAI,oBAAoB,CAC/C,CACF,EAEQ,uBAAyB,SAAY,CACvC,SAAS,kBAAoB,WAC/B,MAAM,KAAK,SAAS,CAExB,EAEQ,aAAe,SAAY,CAC7B,KAAK,UAAU,IACjB,MAAM,KAAK,SAAS,EACf,KAAK,UAAU,GAClB,KAAK,OAAO,YAAY,EAG9B,EAIQ,4BAA6B,CACnC,KAAK,eAAe,CACtB,CAMA,MAAc,UAAW,CAIvB,YAAK,aAAa,EACX,IAAI,QAAeC,GAAY,CACpC,WAAW,IAAM,CACf,KAAK,MAAM,EACXA,EAAQ,CACV,EAAG,GAAO,CACZ,CAAC,CACH,CAMQ,OAAQ,CACV,KAAK,QAAU,iBACjB,KAAK,OAAO,SAAS,EAKnB,KAAK,cACP,KAAK,MAAM,EACX,KAAK,eAAe,GAEpB,KAAK,MAAQ,aAEjB,CAEQ,OAAQ,CACd,KAAK,MAAQ,UACb,KAAK,OAAO,UAAU,CACxB,CAKQ,cAAe,CACrB,KAAK,aAAe,KAAK,IAAI,EAC7B,IAAML,EAAmB,CACvB,KAAM,OACN,OAAQ,KAAK,YACf,EACA,KAAK,QAAQ,YAAYA,CAAO,CAClC,CAEQ,gBAAiB,CACvB,KAAK,aAAe,MACtB,CAMQ,aAAaM,EAAmB,CACtC,GAAI,KAAK,UAAU,EAAG,CACpB,KAAK,MAAQ,cAEb,KAAK,OAAO,YAAY,EAExB,IAAMN,EAAmB,CACvB,KAAM,gBACN,YAAaM,CACf,EAEA,KAAK,QAAQ,YAAYN,CAAO,CAClC,CACF,CACF,EF1MO,IAAMO,GAAaC,GACxBC,GAAgB,EAAE,CAACC,EAAKC,KAAS,CAC/B,YAAa,GACb,oBAAqB,GACrB,qBAAsB,GACtB,UAAW,OACX,kBAAmB,GACnB,mBAAoB,CAACC,EAAuBC,IAAoB,CAC9D,GAAM,CAAE,qBAAAC,CAAqB,EAAIH,EAAI,EAEjC,CAACG,GAAwBD,EAC3BH,EAAI,CAAE,qBAAsB,EAAK,CAAC,GACzBI,GAAwB,CAACD,IAClCD,EAAsB,CAE1B,EACA,wBAA0BG,GAAS,CACjCL,EAAI,CAAE,qBAAsBK,CAAK,CAAC,CACpC,EACA,aAAeC,GAAc,CAC3BN,EAAI,CAAE,UAAAM,CAAU,CAAC,CACnB,CACF,EAAE,CACJ,EAEaC,GAAkC,IAAIC,GAAW,CAC5D,OAAQ,IAAMX,GAAW,SAAS,CAAE,oBAAqB,EAAK,CAAC,EAC/D,QAAS,IACPA,GAAW,SAAS,CAAE,YAAa,GAAM,qBAAsB,EAAM,CAAC,EACxE,UAAW,IAAMA,GAAW,SAAS,CAAE,YAAa,EAAM,CAAC,CAC7D,CAAC,ErB7BM,IAAMY,GAAgBC,GAAsC,CACjE,gBAAiB,IAAM,CAEvB,EACA,mBAAoB,IAAM,CAE1B,CACF,CAAC,EAED,SAASC,GAAKC,EAAqC,CACjD,GAAM,CAAE,aAAAC,EAAc,eAAAC,EAAgB,MAAOC,CAAU,EAAIC,EAAY,EACjEC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAASH,EAAY,EAAE,OAEvBI,EAAkC,CACtC,uBAAwBR,EAAM,QAAQ,sBACxC,EACM,CAAE,UAAAS,CAAU,EAAIC,GAAmBV,EAAM,OAAO,QAASQ,CAAa,EACtE,CAAE,cAAAG,EAAe,iBAAAC,CAAiB,EAAIC,EAAgB,EACtDC,EAAyBC,GAAiC,EAC1DC,EAA4BD,GAAiC,EAEnEE,GAAU,IAAM,CACTd,EAAU,EAAE,MAAM,QAAQ,GAAG,CACpC,EAAG,CAAC,CAAC,EAELc,GAAU,IAAM,CACVjB,EAAM,SACRC,EAAaD,EAAM,MAAM,EACzBE,EAAeF,EAAM,MAAM,EAC3B,OAAO,QAAa,CAClB,OAAAO,EACA,WAAYP,EAAM,MACpB,EAEJ,EAAG,CAACA,EAAM,MAAM,CAAC,EAEjB,IAAMkB,EAAqBb,EACxB,OAAOc,EAAe,EACtB,IAAKC,GAAUA,EAAM,IAAI,EAEtBC,EAA8BC,EAAA,CAACC,EAAMC,EAAOC,EAAOC,EAAOC,IAAS,CACvE,GAAIH,IAAUI,GAAO,SACnB,GAAIH,EAAO,CACT,IAAMI,EACJC,GAA8BH,EAAK,oBAAoB,EACnDI,EAAOC,GACXT,EACAE,EACAP,EACAW,EACAF,EAAK,gBACP,EACII,EAAK,QACPpB,EAAcoB,EAAMzB,CAAM,CAE9B,MACEM,EAAiBW,CAAI,EACfP,EAA0B,QAC9BA,EAA0B,QAAQO,CAAI,EAEtC,QAAQ,KACN,2DACF,EAIN,GAAIC,IAAUI,GAAO,UAAYF,EAAM,UAAW,CAChD,IAAMO,EAAM,GAAGV,CAAI,IAAIG,EAAM,OAAO,IAAID,CAAK,GAEzCC,EAAM,YACFZ,EAAuB,QAC3BA,EAAuB,QAAQmB,CAAG,EAElC,QAAQ,KACN,wDACF,EAGN,CAEA,GAAIT,IAAUI,GAAO,SAAWF,EAAM,QAAS,CAC7C,IAAMO,EAAM,GAAGV,CAAI,IAAIG,EAAM,OAAO,GAC9BZ,EAAuB,QAC3BA,EAAuB,QAAQmB,CAAG,EAElC,QAAQ,KAAK,wDAAwD,CAEzE,CAGIjC,EAAM,eACRA,EAAM,cAAcuB,EAAMC,EAAOC,EAAOC,EAAOC,CAAI,CAEvD,EArDoC,iBAsD9BO,EAAcC,GAAW,IAAI,YAAY,EAEzCC,EAAWC,GACf,KAAO,CACL,gBAAkBC,GAAsC,CACtDxB,EAAuB,QAAUwB,CACnC,EACA,mBAAqBA,GAAsC,CACzDtB,EAA0B,QAAUsB,CACtC,CACF,GACA,CAAC,CACH,EAEA,OACEC,GAAA,cAAC1C,GAAc,SAAd,CAAuB,MAAOuC,GAC7BG,GAAA,cAACC,GAAA,CACC,eAAgBnC,EAChB,UAAWI,EACX,cAAeY,EACf,YAAa,CAAC,CAACa,GACdlC,EAAM,QACT,CACF,CAEJ,CAhHSsB,EAAAvB,GAAA,QAkHF,SAAS0C,GAAczC,EAAqC,CACjE,GAAM,CAAE,OAAAO,EAAQ,GAAGmC,CAAW,EAAI1C,EAClC,OACEuC,GAAA,cAACI,GAAA,CAAiB,OAAQpC,GACxBgC,GAAA,cAACxC,GAAA,CAAM,GAAG2C,EAAY,OAAQnC,EAAQ,CACxC,CAEJ,CAPgBe,EAAAmB,GAAA,iBwB/IhB,OAAOG,OAAW,QCDlB,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,gBAAAC,GAAc,sBAAAC,OAA0B,eAE1C,SAASC,GAAU,CAAE,SAAAC,CAAS,EAAsB,CAEzD,IAAMC,EADoBC,GAAmB,EACVC,GAAWC,GAE9C,OAAOC,GAAA,cAACJ,EAAA,KAAQD,CAAS,CAC3B,CALgBM,EAAAP,GAAA,aCLhB,OAAS,eAAAQ,OAAmB,gBAC5B,OAAOC,OAAW,QCDlB,OAAOC,OAAW,QAClB,OAAS,aAAAC,OAAiB,mBCDnB,IAAMC,EAAmB,CAC9B,KAAM,IACN,SAAU,YACV,OAAQ,UACR,YAAa,cACb,SAAU,WACV,iBAAkB,oBAClB,QAAS,UACT,UAAW,YACX,UAAW,YACX,MAAO,QACP,QAAS,UACT,YAAa,eACb,YAAa,aACb,OAAQ,QACV,ECbA,OAAS,aAAAC,GAAW,UAAAC,OAAc,QCQlC,OAAOC,OAAe,eACtB,OAAS,UAAAC,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCOtC,OAAS,yBAAAC,OAA6B,wCACtC,OAAOC,OAAe,eClBtB,OAAS,QAAAC,OAAY,eASd,IAAMC,GAA2C,CACtD,cAAeD,GAAK,EAAE,aAAa,EACnC,cAAeA,GAAK,EAAE,cAAc,EACpC,gBAAiBA,GAAK,EAAE,eAAe,EACvC,uBAAwBA,GAAK,EAAE,cAAc,EAC7C,YAAaA,GAAK,EAAE,WAAW,CACjC,EAOaE,GAAiC,CAC5C,cACA,cACA,aACA,UACA,aACF,EAEaC,GAAc,GCepB,IAAKC,QACVA,IAAA,qCACAA,IAAA,iCACAA,IAAA,iDACAA,IAAA,iCAJUA,QAAA,ICvBZ,OAAS,QAAAC,OAAY,eACrB,OAAOC,OAAe,eACtB,OAAS,4BAAAC,OAAgC,cCxBlC,SAASC,GAAmBC,EAAsC,CACvE,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,QAASE,GAAS,CACvB,IAAMC,EAA4BD,EAAK,KAAK,WACtCE,EAA0BF,EAAK,GAAG,WACpCG,EAAkBJ,EAAQA,EAAQ,OAAS,CAAC,EAC5CE,GAA6BE,GAC/BJ,EAAQ,KAAKE,CAAyB,EAExCE,EAAkBJ,EAAQA,EAAQ,OAAS,CAAC,EACxCG,GAA2BC,GAC7BJ,EAAQ,KAAKG,CAAuB,CAExC,CAAC,EACMH,CACT,CAhBgBK,EAAAP,GAAA,sBAkBT,SAASQ,GACdC,EACAC,EACS,CAGT,OAFcD,EAAM,gBACA,OAAQ,GAAM,IAAI,OAAO,CAAC,EAAE,KAAKC,CAAO,CAAC,EAAE,OAAS,CAE1E,CAPgBH,EAAAC,GAAA,kBClBhB,OAAS,QAAAG,OAAY,eAId,IAAMC,GAAgBC,EAAA,KACpB,CACL,mBAAoBC,GAAK,EAAE,yCAAyC,EACpE,sBAAuB,CACrB,MAAOA,GAAK,EAAE,sCAAsC,EACpD,YAAaA,GAAK,EAChB,4IACF,CACF,EACA,cAAe,CACb,MAAOA,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,gKACF,CACF,EACA,kBAAmB,CACjB,eAAgBA,GAAK,EACnB,kDACF,EACA,eAAgBA,GAAK,EACnB,kDACF,CACF,EACA,mBAAoB,CAClB,YAAaA,GAAK,EAAE,mBAAmB,EACvC,MAAOA,GAAK,EAAE,2BAA2B,EACzC,YAAaA,GAAK,EAChB,mEACF,EACA,eAAgBA,GAAK,EAAE,2BAA2B,CACpD,EACA,8BAA+B,CAC7B,MAAOA,GAAK,EACV,8DACF,CACF,EACA,kBAAmB,CACjB,YAAaA,GAAK,EAAE,mBAAmB,EACvC,MAAOA,GAAK,EAAE,mDAAmD,EACjE,YAAaA,GAAK,EAChB,iIACF,EACA,eAAgBA,GAAK,EAAE,2BAA2B,CACpD,CACF,GA5C2B,iBA+CtB,SAASC,GAAqBC,EAAmB,CACtD,OAAQA,EAAM,KAAM,CAClB,OACE,OAAOA,EAAM,kBAAoBJ,GAAc,EAAE,cAAc,MACjE,OACE,OAAOA,GAAc,EAAE,mBACzB,QACE,MAAO,EACX,CACF,CATgBC,EAAAE,GAAA,wBCrDhB,OAAS,QAAAE,OAAY,eAEd,IAAMC,GAAmBC,EAAA,KACvB,CACL,cAAeC,GAAK,EAAE,gBAAgB,EACtC,KAAMA,GAAK,EAAE,MAAM,EACnB,WAAYA,GAAK,EAAE,aAAa,EAChC,WAAYA,GAAK,EAAE,4CAA4C,CACjE,GAN8B,oBH6DzB,SAASC,GACdC,EACAC,EACS,CACT,OACI,SAASA,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,KAC3CD,GAAe,IAAI,IAAIE,GAAU,GAAG,CAAC,GACpC,SAASD,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,IAC1CD,GAAe,IAAI,IAAIE,GAAU,GAAI,CAAC,IAC1C,EAEJ,CAXgBC,EAAAJ,GAAA,oBAaT,SAASK,GAAcC,EAA8B,CAC1D,OACGA,GAAS,CAAC,GAAG,OAAQC,GAAS,CAC7B,IAAMC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE/DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CACpE,CAAC,EAAE,OAAS,CAEhB,CAhBgBH,EAAAC,GAAA,iBAkBT,SAASK,GAAqBJ,EAInC,CACA,IAAMC,GAAQD,GAAS,CAAC,GAAG,OAAQC,GAAS,CAC1C,IAAMC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE/DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CACpE,CAAC,EAAE,CAAC,EAEEC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEI,EAAcJ,EAAK,4BAA8B,YAEnDK,EAAuB,GACvBC,EAAiB,GACrB,MAAI,CAACF,GAAiBH,GAAWA,EAAQ,GAAGD,EAAK,UAAU,GACzDK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,8BACJ,OAAQ,CACN,IAAKC,EACHP,EACA,EACA,CACF,EACA,OAAQD,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAC1CL,GAAiBH,GAAWA,EAAQ,IAAID,EAAK,UAAU,IAChEK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,6BACJ,OAAQ,CACN,IAAKC,EACHP,EACA,EACA,CACF,EACA,OAAQD,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAGjD,CAACL,GAAiBF,GAAWA,EAAQ,GAAGF,EAAK,UAAU,GACzDK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,8BACJ,OAAQ,CACN,IAAKC,EACHN,EACA,EACA,CACF,EACA,OAAQF,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAC1CL,GAAiBF,GAAWA,EAAQ,IAAIF,EAAK,UAAU,IAChEK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,6BACJ,OAAQ,CACN,IAAKC,EACHN,EACA,EACA,CACF,EACA,OAAQF,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAG9C,CAAE,KAAAT,EAAM,qBAAAK,EAAsB,eAAAC,CAAe,CACtD,CAtFgBT,EAAAM,GAAA,wBAwFT,SAASO,GAAmBC,EASf,CAClB,GAAM,CACJ,gBAAAC,EACA,mBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,MAAAC,EACA,QAAAC,EACA,MAAAC,EACA,qBAAAC,CACF,EAAIR,EACJ,OAAIC,IAAoB,UACf,CACL,MAAOQ,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,EAEGP,EAODC,GAAiB,CAACE,GAASE,GAAS,CAACH,GAAeA,IAAgB,IAC/D,CACL,MAAOK,GAAiB,EAAE,KAC1B,OAAQ,eACR,SAAU,EACZ,EACSH,EACF,CACL,MAAOG,GAAiB,EAAE,WAC1B,OAAQ,kBACR,SAAU,EACZ,EACSD,EACF,CACL,MAAOC,GAAiB,EAAE,WAC1B,OAAQ,kBACR,SAAU,EACZ,EAEK,CACL,MAAOA,GAAiB,EAAE,KAC1B,OAAQ,eACR,SAAU,EACZ,EA7BS,CACL,MAAOA,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,CA0BJ,CA1DgBvB,EAAAa,GAAA,sBA4DT,SAASW,GACdL,EACAD,EACAO,EACA,CACA,MAAO,GACJ,CAACA,GAAYA,EAAS,IAAIC,EAAI,IAC7BP,GACAD,GACFA,IAAgB,KAChB,WAAWA,GAAe,GAAG,IAAM,GACjCC,EAEN,CAbgBnB,EAAAwB,GAAA,yBAeT,SAASG,GAAgBR,EAA6B,CAC3D,IAAMS,EAAoB,CAAC,EAE3B,OAAAT,GAAO,MAAM,QAAShB,GAAS,CAC7B,IAAM0B,EAA4B1B,EAAK,KAAK,WACtC2B,EAA0B3B,EAAK,GAAG,WACpC4B,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EAC5CC,GAA6BE,GAC/BH,EAAQ,KAAKC,CAAyB,EAExCE,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EACxCE,GAA2BC,GAC7BH,EAAQ,KAAKE,CAAuB,CAExC,CAAC,EACMF,CACT,CAhBgB5B,EAAA2B,GAAA,mBAkBT,IAAMK,GAAchC,EAAA,CACzBiC,EACAC,EACAC,EACAC,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeJ,GACjBI,EAAE,QAAQ,YAAY,IAAMH,GAAQ,YAAY,GAChDG,EAAE,UAAYF,CAClB,GACc,UAAY,KAZD,eAepB,SAASG,GACdC,EACAH,EACW,CACX,IAAII,EAAgBd,GACpB,QAASe,EAAI,EAAGA,EAAIF,EAAK,IAAI,OAAQE,IAAK,CACxC,IAAMC,EAAMH,EAAK,IAAIE,CAAC,EACtB,GAAIC,EAAI,cAAgB,uBACtB,SAGF,IAAMC,EAAYX,GAChBU,EAAI,MAAM,WACVA,EAAI,MAAM,OACVA,EAAI,MAAM,QACVN,CACF,EACAI,EAAgBA,EAAc,KAC5B,IAAIzC,GAAU2C,EAAI,MAAM,EAAE,aAAaC,GAAa,CAAC,CACvD,CACF,CAEA,OAAOH,CACT,CAvBgBxC,EAAAsC,GAAA,mBAyBT,SAASM,GACd1C,EACAkC,EACW,CACX,OAAOlC,EAAM,OACX,CAAC2C,EAAqBN,IACpBM,EAAS,KAAKP,GAAgBC,EAAMH,CAAS,CAAC,EAChDV,EACF,CACF,CATgB1B,EAAA4C,GAAA,oBAWT,SAASE,GAAUJ,EAAyB,CACjD,IAAIF,EAAgBd,GACpB,OAAAc,EAAgBA,EAAc,KAC5B,IAAIzC,GAAU2C,EAAI,MAAM,EAAE,aAAaA,EAAI,OAAS,CAAC,CACvD,EAEOF,CACT,CAPgBxC,EAAA8C,GAAA,aAST,SAASC,GAAkBC,EAA4B,CAC5D,OAAOA,EAAK,OACV,CAACH,EAAqBH,IAAQG,EAAS,KAAKC,GAAUJ,CAAG,CAAC,EAC1DhB,EACF,CACF,CALgB1B,EAAA+C,GAAA,qBAMT,SAASE,GAAa/C,EAAgC,CAC3D,OAAOA,EAAM,OACX,CAACgD,EAAQ/C,IAAS,CAChB,QAAWuC,KAAOvC,EAAK,IAAK,CAC1B,IAAMgD,EAAOT,EAAI,KACXU,EACJV,EAAI,cAAgB,uBAChBQ,EAAO,QACPA,EAAO,YAEbE,EAASD,CAAI,EAAI,CAAC,GAAIC,EAASD,CAAI,GAAK,CAAC,EAAIT,CAAG,CAClD,CACA,OAAOQ,CACT,EACA,CAAE,QAAS,CAAC,EAAG,YAAa,CAAC,CAAE,CACjC,CACF,CAhBgBlD,EAAAiD,GAAA,gBA+BT,SAASI,GACdC,EAC6B,CAC7B,IAAMC,EAA6C,IAAI,IAMvD,OALAD,EAAM,QAAQ,CAACE,EAAMC,IAAU,CACzBD,EAAK,qBAAqB,OAC5BD,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAbgBG,EAAAL,GAAA,uBAeT,SAASM,GACdC,EACAC,EAC6B,CAC7B,IAAMN,EAA6C,IAAI,IASvD,OARAK,GAAO,MAAM,QAAQ,CAACJ,EAAMC,IAAU,CAElCD,EAAK,qBAAqB,UAC1B,WAAWA,EAAK,oBAAoB,QAAQ,EAAIK,GAEhDN,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAjBgBG,EAAAC,GAAA,yBAmBT,SAASG,GAAuBR,EAAoC,CAEzE,OADkBA,EAAM,IAAKS,GAAaA,EAAS,mBAAmB,GAGhE,IAAKC,GAAMA,GAAG,UAAY,GAAG,GAC7B,OAAQA,GAAM,WAAWA,CAAC,EAAI,CAAC,GAC/B,KAAK,CAACC,EAAGC,IAAM,WAAWA,CAAC,EAAI,WAAWD,CAAC,CAAC,GAC5C,KAAK,IAAM,EAAI,GAAK,IAE5B,CATgBP,EAAAI,GAAA,0BAWT,SAASK,GACdN,EACAO,EACA,CACA,OAAKA,EAGE,WAAWP,CAAY,GAAK,WAAWO,CAAmB,EAFxD,EAGX,CARgBV,EAAAS,GAAA,qBAiDT,SAASE,GAAuBC,EAelB,CACnB,GAAM,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,yBAAAC,EACA,iBAAAC,EACA,wBAAAC,EACA,SAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,0BAAAC,CACF,EAAId,EACEe,EAAqBV,GAAiB,OAC1C,CACEU,EACAC,KAECD,EAAmBC,EAAe,KAAK,EAAIA,EAAe,QAC3DD,GAEF,CAAC,CACH,EAEME,EAAyD,CAAC,EAEhE,OAAAb,GAAS,QAASc,GAAW,CAC3BD,EAAiB,KAAK,CACpB,WAAYC,EAAO,MACnB,UAAW,CAACA,EAAO,OAAO,CAC5B,CAAC,CACH,CAAC,EAGqC,CACpC,OAAQf,EAAY,SAAS,EAC7B,aAAcO,GAAgB,OAC9B,iBAAkBC,GAAoB,OACtC,iBAAkBC,GAAoB,OACtC,KAAM,CACJ,QAASX,EAAU,QACnB,WAAYA,EAAU,WACtB,OAAQA,EAAU,MACpB,EACA,GAAI,CACF,QAASC,EAAQ,QACjB,WAAYA,EAAQ,WACpB,OAAQA,EAAQ,MAClB,EACA,iBAAAe,EACA,gBAAiBF,GAAsB,CAAC,EACxC,SAAUN,EAAS,SAAS,EAC5B,GAAII,GAAe,CAAE,YAAaA,CAAY,EAC9C,GAAIL,GAA2B,CAC7B,cAAeF,EAAyB,OAAOC,GAAoB,CAAC,CAAC,EACrE,sBAAuB,EACzB,EACA,GAAI,CAACC,GAA2B,CAC9B,cAAeD,GAAkB,OAC9BY,GAAoB,CAACb,EAAyB,SAASa,CAAe,CACzE,EACA,sBAAuB,EACzB,EACA,0BAAAL,CACF,CAEF,CArFgBM,EAAArB,GAAA,0BAuFT,SAASsB,GAAqBhB,EAA2B,CAiB9D,OAhBgBA,EAAgB,OAC9B,CACEU,EAGAC,KAECD,EAAmBC,EAAe,KAAK,EAAI,CAC1C,QAASA,EAAe,QACxB,WAAYA,EAAe,UAC7B,EACAD,GAEF,CAAC,CACH,CAGF,CAlBgBK,EAAAC,GAAA,wBAoBT,SAASC,GAAqBC,EAAsB,CACzD,OAAOA,GAAO,cAAgB,IAChC,CAFgBH,EAAAE,GAAA,wBAIT,SAASE,GAAoBC,EAAeC,EAAgB,CACjE,OAAO,IAAIC,GAAUD,CAAM,EACxB,IAAI,IAAIC,GAAUF,CAAK,CAAC,EACxB,MAAM,CAAC,EACP,aAAa,GAAG,EAChB,SAAS,CACd,CANgBL,EAAAI,GAAA,uBAQT,SAASI,GACdC,EACAC,EACA,CACA,IAAMC,EAAkBT,GAAqBO,CAAQ,EAC/CG,EAAkBV,GAAqBQ,CAAQ,EACrD,GAAI,CAACC,GAAmB,CAACC,EACvB,MAAO,GAET,IAAMC,EAAmBC,GAAeH,EAAiBC,CAAe,EACxE,OAAKC,EAIEA,GAAoB,GAHlB,EAIX,CAfgBb,EAAAQ,GAAA,6BAiBT,SAASO,GACdZ,EACAlB,EACA+B,EACA,CACA,IAAMC,EAAMd,EAAM,iBACZe,EAAkBC,GAAkBhB,CAAK,EAO/C,OANuClB,EAAgB,KACrD,CAACmC,EAAiBC,IAChBH,EAAgB,QAAQE,EAAgB,KAAK,EAC7CF,EAAgB,QAAQG,EAAgB,KAAK,CACjD,EAGG,QAASvB,GAAWwB,GAA2BxB,EAAQmB,CAAG,GAAK,CAAC,CAAC,EACjE,OAAQM,GAAU,CAACA,EAAM,EAAE,EAC3B,IAAKA,GAAU,CACd,IAAMC,EAASD,EAAM,MAAM,OACrBE,EAAgBC,EACpB,IAAInB,GAAUgB,EAAM,cAAc,MAAM,EAAE,UACxC,CAACA,EAAM,cAAc,QACvB,EACA,EACA,CACF,EACMI,EAAiBD,EACrB,IAAInB,GAAUgB,EAAM,eAAe,MAAM,EAAE,UACzC,CAACA,EAAM,eAAe,QACxB,EACA,EACA,CACF,EACIK,EAAS,GACb,OAAIL,EAAM,SAAW,QACnBK,EAASC,GAAK,EAAE,kBAAkB,GAEhCN,EAAM,SAAW,gBACnBK,EAASC,GAAK,EAAE,WAAW,GAEzBN,EAAM,SAAW,wBACnBK,EAASC,GAAK,EAAE,4BAA4B,GAEvBA,GAAK,EAAE,CAC5B,GAAI,qHACJ,OAAQ,CACN,eAAAF,EACA,OAAAH,EACA,OAAAI,EACA,cAAAH,EACA,WAAYK,GACVP,EAAM,MAAM,WACZP,CACF,CACF,CACF,CAAC,CAEH,CAAC,CACL,CAzDgBhB,EAAAe,GAAA,2BA2DT,SAASgB,GACdC,EACAC,EACA,CAGA,OAFiBD,EAAe,IAAIzB,GAAUyB,CAAY,EAAIE,IAEhD,aAAaD,GAAc,CAAC,CAC5C,CAPgBjC,EAAA+B,GAAA,sBAST,SAASI,GACdC,EACS,CACT,MACE,CAAC,CAACA,GACFA,EAAgB,gBAAkB,MAClCA,EAAgB,gBAAkBC,GAAyB,cAE/D,CARgBrC,EAAAmC,GAAA,iCAUT,SAASG,GACdC,EACAC,EAIA,CACA,IAAMC,EAAgB,mBAClBC,EAAUH,EAAY,aACtBI,EAAkBJ,EAAY,mBASlC,GAPIA,EAAY,iCAAiC,SAASE,CAAa,IACrEF,EAAY,gCACVA,EAAY,gCAAgC,QAAQE,EAAe,EAAE,GAG7CN,GAA8BK,CAAW,EAMnE,OAHAE,EAAUH,EAAY,2BAA6B,GACnDI,EAAkBJ,EAAY,iCAAmC,GAEzDC,GAAa,cAAe,CAClC,KAAKH,GAAyB,2BAC5BK,EAAUA,GAAWb,GAAK,EAAE,+BAA+B,EAC3D,MACF,KAAKQ,GAAyB,gBAC5BK,EACEA,GAAWb,GAAK,EAAE,gDAAgD,EACpE,MACF,KAAKQ,GAAyB,wBAC5BK,EAAUA,GAAWb,GAAK,EAAE,qCAAqC,EACjE,MACF,QACEa,EAAUA,GAAW,GACrB,KACJ,CAEFC,EAAkBA,GAAmB,GACrCD,EAAUA,GAAW,GACrB,IAAME,EACJF,GAAS,QAAQ,MAAM,IAAM,IAAMA,GAAS,QAAQ,QAAQ,IAAM,GAEpE,MAAO,CACL,aAAcA,EACd,gBAAiB,CAAE,QAASC,EAAiB,KAAMC,CAAM,CAC3D,CACF,CA/CgB5C,EAAAsC,GAAA,mBAiDT,SAASO,GACdN,EACgB,CAChB,IAAIO,EAA8B,KAClC,GAAIP,EAAY,SAAW,SAAU,CACnC,IAAMQ,EAAkBR,EAAY,MACjC,MAAM,EACN,QAAQ,EACR,OAAQS,GAASA,EAAK,SAAW,SAAS,EAAE,CAAC,EAE5CD,IACFD,EAAc,CACZ,WAAYC,EAAgB,aAC5B,OAAQA,EAAgB,SACxB,aAAcA,EAAgB,aAC9B,QAASA,EAAgB,eAC3B,EAEJ,CACA,OAAOD,CACT,CApBgB9C,EAAA6C,GAAA,qCAsBT,SAASI,GAAgBV,EAA0B,CACxD,OAAOA,EAAY,SAAW,QAChC,CAFgBvC,EAAAiD,GAAA,mBAIT,SAASC,GACdC,EACAC,EACAC,EACAlD,EACAlB,EACAqE,EACA,CACA,OACEH,GACC,CAACC,GACA,CAAClC,GAAgBf,CAAK,EAAE,MAAOoD,GAC7BtE,EAAgB,IAAKa,GAAWA,EAAO,KAAK,EAAE,SAASyD,CAAK,CAC9D,GACD,CAAC,CAACH,GAAyB,CAACC,GAC5B,CAAC,CAACD,GACD,CAAC,CAACC,GACFC,GACA,CAACE,GAAeF,EAAsBD,CAAiB,CAE7D,CApBgBrD,EAAAkD,GAAA,uBAsBT,SAASO,GAAkBC,EAAeC,EAAe,CAC9D,OACED,EAAO,aAAeC,EAAO,YAC7BD,EAAO,SAAWC,EAAO,QACzBD,EAAO,UAAYC,EAAO,OAE9B,CANgB3D,EAAAyD,GAAA,qBHluBT,SAASG,GACdC,EAC2B,CAC3B,IAAMC,EAAQD,GAAO,OAAS,CAAC,EAC/B,OAAOC,EAAMA,EAAM,OAAS,CAAC,EAAE,GAAG,QACpC,CALgBC,EAAAH,GAAA,2BAOT,SAASI,GACdC,EACAC,EACA,CACA,IAAMC,EAAcF,GAAQ,OAAS,CAAC,EAChCG,EAAcF,GAAQ,OAAS,CAAC,EACtC,OAAOC,EAAY,SAAWC,EAAY,MAC5C,CAPgBL,EAAAC,GAAA,0BAST,SAASK,GACdJ,EACAC,EACA,CACA,IAAMI,EAAiBL,GAAQ,MAAM,IAAKM,GAASA,EAAK,SAAS,GAAK,CAAC,EACjEC,EAAiBN,GAAQ,MAAM,IAAKK,GAASA,EAAK,SAAS,GAAK,CAAC,EACvE,MAAO,CAACE,GAASH,EAAgBE,CAAc,CACjD,CAPgBT,EAAAM,GAAA,0BAST,SAASK,GACdT,EACAC,EACA,CACA,IAAMS,EAAsBV,GAAQ,MAAM,IAAKM,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACtEK,EAAsBV,GAAQ,MAAM,IAAKK,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EAC5E,MAAO,CAACE,GAASE,EAAqBC,CAAmB,CAC3D,CAPgBb,EAAAW,GAAA,+BAST,SAASG,GACdZ,EACAC,EACS,CACT,OACEF,GAAuBC,EAAQC,CAAM,GACrCG,GAAuBJ,EAAQC,CAAM,GACrCQ,GAA4BT,EAAQC,CAAM,CAE9C,CATgBH,EAAAc,GAAA,kBAuBT,SAASC,GACdC,EACAC,EACmC,CACnC,GAAIA,IAAQ,KACV,OAAO,KAET,IAAMC,EAAmBD,GACrB,KAAME,GAASA,EAAK,aAAeH,EAAe,KAAK,GACvD,QAAQ,KACPI,GACCA,EAAO,SAAS,YAAY,IAAMJ,EAAe,QAAQ,YAAY,CACzE,EACF,OAAKE,EAGEA,EAAiB,eAFf,IAGX,CAjBgBG,EAAAN,GAAA,8BAmBT,SAASO,GACdC,EACyB,CACzB,IAAIC,EACJ,OAAID,GAAe,IAAoBA,EAAc,IACnDC,EAAe,MACND,GAAe,MACxBC,EAAe,QAGVA,CACT,CAXgBH,EAAAC,GAAA,uBA2BT,SAASG,GACdC,EACAC,EACAC,EAOA,CACA,IAAMC,EAAYH,EAAY,MAAM,CAAC,EAC/BI,EAAWJ,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EACzDK,EAAqBC,GAAsBN,EAAY,KAAK,EAE5DO,EAAU,CACd,WAAYH,EAAS,aACrB,OAAQA,EAAS,SACjB,QAASA,EAAS,eACpB,EAEMI,EAAqBC,GACzBJ,EACIA,EAAmB,aACnBF,EAAU,eACdF,CACF,EACMS,EAAmBD,GAAeL,EAAS,aAAcH,CAAW,EACpEU,EAAgBC,GACpBP,EACI,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQH,EAAmB,SAC3B,QAASA,EAAmB,eAC9B,EACA,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQL,EAAU,WAClB,QAASA,EAAU,iBACrB,EACJD,CACF,EACMW,EAAcD,GAAUL,EAASL,CAAM,EACvCY,EAAcT,EAChBA,EAAmB,cAAgB,GACnCL,EAAY,YAEhB,MAAO,CACL,eAAgBQ,EAChB,UAAWG,EACX,aAAcD,EACd,QAASG,EACT,YAAAC,CACF,CACF,CAtDgBC,EAAAhB,GAAA,oBAwDT,SAASiB,GACdC,EACAC,EAMqB,CACrB,GAAM,CAAE,UAAAC,EAAW,QAAAZ,EAAS,OAAAL,EAAQ,aAAAkB,CAAa,EAAIF,EAC/CG,EAAgBC,GAAYH,EAAWF,EAAM,aAAa,EAC1DM,EAAiBD,GAAYf,EAASU,GAAO,cAAgB,EAAE,EAErE,GAAMA,GAASI,GAAiBE,EAAgB,CAC9C,IAAMC,EAAcC,GAClBJ,EAAc,SAAS,EACvBE,EAAe,SAAS,CAC1B,EAIA,GAFE,CAAC,CAACC,GAAeE,GAAiBL,EAAeG,CAAW,EAE3C,CACjB,IAAMG,EAAWC,GAAiBX,GAAO,MAAOf,CAAM,EAChD2B,EAAeC,GAAoBN,CAAW,EACpD,MAAO,CACL,OACA,cAAAH,EACA,eAAAE,EACA,YAAAC,EACA,SAAAG,EACA,aAAAE,CACF,CACF,CACF,SAAWZ,IAAU,CAACI,GAAiB,CAACE,GACtC,MAAO,CAAE,MAAqC,EAGhD,IAAMQ,EAAsBC,GAAuBf,EAAM,KAAK,EACxDgB,EAAeb,EAAec,GAEpC,GAAKC,GAAkBjB,EAAO,aAAa,SAAS,EAAGa,CAAmB,GAMnE,GACLE,GACA,WAAWF,GAAuB,GAAG,EAAIX,EAEzC,MAAO,CACL,OACA,SAAUA,EAAa,SAAS,CAClC,MAZA,OAAO,CACL,OACA,qBAAsBgB,GAAsBnB,EAAOG,CAAY,EAC/D,oBAAqBW,CACvB,EAWF,OAAO,IACT,CAzDgBhB,EAAAC,GAAA,yBA2DT,SAASS,GACdJ,EACAE,EACe,CACf,IAAMc,EACJ,OAAOd,GAAmB,SACtB,WAAWA,CAAc,GAAK,EAC9B,CAACA,GAAgB,GAAG,CAAC,EACrBe,EACJ,CAACjB,GAAiB,CAACE,GAAkBc,EACjC,KACAE,GACElB,EAAc,SAAS,EACvBE,EAAe,SAAS,CAC1B,EAEN,OAAOe,GAAoBA,EAAmB,EAAIA,EAAmB,IACvE,CAjBgBvB,EAAAU,GAAA,kBAmBT,IAAMe,GAAuBzB,EAAC0B,GAAkB,CACrD,IAAMC,EAAM,IAAI,IACVC,EAAmD,CAAC,EAC1D,OAAAF,EAAM,QAASG,GAAS,CACjBF,EAAI,IAAIE,EAAK,KAAK,MAAM,WAAW,IACtCF,EAAI,IAAIE,EAAK,KAAK,MAAM,WAAW,EACnCD,EAAO,KAAKC,EAAK,KAAK,KAAK,GAExBF,EAAI,IAAIE,EAAK,GAAG,MAAM,WAAW,IACpCF,EAAI,IAAIE,EAAK,GAAG,MAAM,WAAW,EACjCD,EAAO,KAAKC,EAAK,GAAG,KAAK,EAE7B,CAAC,EAEMD,CACT,EAfoC,wBAiBvBE,GAAe9B,EAAA,CAC1B+B,EACAC,IAEOA,EAAO,KAAK,CAACC,EAAQC,IAAW,CACrC,IAAMC,EAAWnC,EAACoC,GAChBA,EAAM,QAAQ,KAAMC,GAAUA,EAAM,iBAAmBN,CAAQ,GAAG,OAClE,EAFe,YAIXO,EAAcH,EAASF,CAAM,EAC7BM,EAAcJ,EAASD,CAAM,EAEnC,GAAII,IAAgBC,EAClB,OAAOA,EAAcD,EAGvB,IAAME,EAAgBP,EAAO,UAAU,YAAY,EAC7CQ,EAAgBP,EAAO,UAAU,YAAY,EAEnD,OAAOM,EAAc,cAAcC,CAAa,CAClD,CAAC,EApByB,gBAuBfC,GAAkB1C,EAAA,CAC7B2C,EACAX,EACAY,IACyB,CACzB,GAAI,CAACZ,EAAO,OACV,OAAO,KAET,GAAI,CAACW,EAEH,MAAO,CACL,cAAeC,EACf,GAAGZ,EAAO,CAAC,CACb,EAGF,IAAMa,EAAyB,IAAI,IACjCF,EAAa,MAAM,IAAKG,GAASA,EAAK,SAAS,CACjD,EAGMC,EAAef,EAAO,KAAM9B,GAAU,CAE1C,IAAM8C,EAAkB,IAAI,IAAI9C,EAAM,MAAM,IAAK4C,GAASA,EAAK,SAAS,CAAC,EAGzE,OAAO,MAAM,KAAKD,CAAsB,EAAE,MAAOI,GAC/CD,EAAgB,IAAIC,CAAS,CAC/B,CACF,CAAC,EAGD,MAAO,CACL,cAAeL,EACf,GAAIG,GAAgBf,EAAO,CAAC,CAC9B,CACF,EApC+B,mBAsClBkB,GAAWlD,EAACmD,GAAiC,CACxD,IAAMC,EAAapD,EAAA,CAACqD,EAAaC,IAAgB,CAC/C,IAAMC,EAASC,GAAmB,QAAQH,EAAE,KAAK,EAC3CI,EAASD,GAAmB,QAAQF,EAAE,KAAK,EAEjD,OAAIC,IAAW,IAAME,IAAW,GACvBF,EAASE,EAGdF,IAAW,GACN,GACEE,IAAW,GACb,EAGF,CACT,EAfmB,cAiBnB,OAAON,EAAK,KAAKC,CAAU,CAC7B,EAnBwB,YD7UjB,IAAMM,GAAcC,EAAA,CACzBC,EACAC,IAEAD,GAAO,SACH,IAAIE,GAAUD,GAAUE,EAAI,EAAE,aAAaH,GAAO,UAAY,CAAC,EAC/D,KANqB,eA+DdI,EAAgBC,GAC3BC,GAAmB,EACjBC,GAAuBC,IAAS,CAC9B,eAAgB,KAChB,UAAW,KACX,YAAa,GACb,aAAc,KACd,cAAe,IAAIN,GAAU,CAAC,EAC9B,eAAgB,IAAIA,GAAU,CAAC,EAC/B,aAAc,KACd,QAAS,KACT,aAAc,GACd,aAAc,QACd,cAAe,KACf,OAAQ,KACR,MAAO,KACP,QAAS,KACT,sBAAuB,GACvB,gBAAiB,CAAC,EAClB,kBAAmB,KACnB,uBAAwB,GACxB,wBAAyB,CAACO,EAAKC,IAC7BF,EAAKG,IAAW,CACd,GAAGA,EACH,CAACF,CAAG,EAAGC,CACT,EAAE,EACJ,iBAAmBE,GACjBJ,EAAKG,GAAU,CACb,IAAIE,EAAiC,KACjCC,EAA4BX,GAChC,OAAKY,GAAiBJ,EAAM,WAAW,GAGjCC,IACJC,EAAiBD,GAAO,aACpB,IAAIV,GAAUU,GAAO,YAAY,EACjC,KACJE,EAAiBE,GACfJ,GAAO,aACPK,GAAwBL,CAAK,GAAKD,EAAM,SAAS,QACnD,GAEK,CACL,cAAeC,EACf,GAAI,CAAC,CAACA,GAAS,CACb,aAAAC,EACA,eAAAC,CACF,CACF,GAjBS,CAAC,CAkBZ,CAAC,EACH,YAAa,IACXN,EAAI,KAAO,CACT,MAAO,KACP,QAAS,IACX,EAAE,EACJ,WAAY,IACVA,EAAI,KAAO,CACT,cAAe,KACf,aAAc,KACd,eAAgB,IAAIN,GAAU,CAAC,EAC/B,OAAQ,KACR,aAAc,GACd,MAAO,KACP,QAAS,IACX,EAAE,EACJ,kBAAoBgB,GAAU,CAC5BV,EAAKG,GACCA,EAAM,gBAAgB,OAASO,GAAO,KACjC,CAAC,EAGH,CACL,eAAgBA,EAChB,GAAIP,EAAM,WAAa,CACrB,cAAe,KACf,UAAW,KACX,aAAc,KACd,eAAgB,IAClB,CACF,CACD,CACH,EACA,aAAeQ,GACNX,EAAKG,IAAW,CACrB,UAAWQ,EAAO,MAClB,GAAIA,EAAO,OAAS,CAClB,eACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,EACA,GAAI,CAAC,CAACR,EAAM,aAAe,CACzB,cAAeb,GAAYqB,EAAO,MAAOR,EAAM,WAAW,CAC5D,CACF,EAAE,EAEJ,gBAAkBO,GAAU,CAC1BV,EAAKG,GACCA,EAAM,cAAc,OAASO,GAAO,KAC/B,CAAC,EAGH,CACL,aAAcA,EACd,GAAIP,EAAM,SAAW,CACnB,cAAe,KACf,QAAS,KACT,aAAc,KACd,eAAgB,IAClB,CACF,CACD,CACH,EACA,WAAaQ,GACJX,EAAI,KAAO,CAChB,QAASW,EAAO,MAChB,GAAIA,EAAO,OAAS,CAClB,aACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,CACF,EAAE,EAEJ,eAAiBlB,GAAW,CAC1BO,EAAKG,IAAW,CACd,YAAaV,EACb,GAAI,CAACA,GAAU,CACb,aAAc,IAAIC,GAAU,CAAC,EAC7B,eAAgB,IAAIA,GAAU,CAAC,EAC/B,cAAe,IACjB,EACA,GAAI,CAAC,CAACS,EAAM,WAAa,CACvB,cAAeb,GAAYa,EAAM,UAAWV,CAAM,CACpD,CACF,EAAE,CACJ,EACA,MAAO,CAACoB,EAAaC,IAAS,CAC5B,GAAM,CAAE,OAAAC,EAAQ,YAAAC,CAAY,EAAIF,EAC1B,CACJ,eAAAG,EACA,UAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAC,CACF,EAAIC,GAAiBT,EAAaG,EAAaD,CAAM,EACrDf,EAAI,CACF,eAAAiB,EACA,UAAAC,EACA,YAAAG,EACA,aAAc,KACd,cAAe/B,GAAY4B,GAAa,KAAMG,CAAW,EACzD,eAAgB,IAAI3B,GAAU,CAAC,EAC/B,aAAAyB,EACA,QAAAC,EACA,cAAe,IACjB,CAAC,CACH,EACA,gBAAiB,IACfpB,EAAKG,IAAW,CACd,eAAgBA,EAAM,aACtB,UAAWA,EAAM,QACjB,aAAcA,EAAM,eACpB,QAASA,EAAM,UACf,YAAaA,EAAM,cAAc,SAAS,GAAK,GAC/C,cAAeA,EAAM,QACjBb,GAAYa,EAAM,QAASA,EAAM,cAAc,SAAS,GAAK,EAAE,EAC/D,IAAIT,GAAU,CAAC,CACrB,EAAE,EACJ,oBAAqB,IACnBM,EAAI,KAAO,CACT,UAAW,KACX,eAAgB,KAChB,aAAc,KACd,eAAgB,KAChB,cAAe,IACjB,EAAE,EACJ,kBAAmB,IACjBA,EAAI,KAAO,CACT,QAAS,KACT,aAAc,KACd,aAAc,KACd,eAAgB,KAChB,cAAe,IACjB,EAAE,EACJ,wBAA0BuB,GACxBvB,EAAI,CACF,sBAAuBuB,CACzB,CAAC,EACH,mBAAqBC,GAAYxB,EAAI,CAAE,gBAAiBwB,CAAQ,CAAC,EACjE,qBAAuBC,GAAYzB,EAAI,CAAE,kBAAmByB,CAAQ,CAAC,EACrE,kBAAmB,IACjBzB,EAAI,CACF,sBAAuB,GACvB,gBAAiB,CAAC,EAClB,kBAAmB,IACrB,CAAC,EACH,0BAA4BuB,GAC1BvB,EAAI,CAAE,uBAAwBuB,CAAK,CAAC,CACxC,EAAE,CACJ,CACF,EDjRO,SAASG,IAA0B,CACxC,GAAM,CACJ,eAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,eAAAC,EACA,aAAAC,CACF,EAAIC,EAAc,EAEZC,EAASC,EAAY,EAAE,OACvBC,EAAkBD,EAAY,EAAE,YAChCE,EAAcF,EAAY,EAAE,YAAY,EACxCG,EAASH,EAAY,EAAE,OAAO,EAE9B,CAAE,gBAAAI,EAAiB,oBAAAC,EAAqB,oBAAAC,CAAoB,EAChEN,EAAY,EAERO,EAAmBR,GAAQ,MAAM,OACjCS,EAAwBT,GAAQ,MAAM,YACtCU,EAAiBV,GAAQ,IAAI,OAC7BW,EAAsBX,GAAQ,IAAI,YAClCY,EAAsBC,GAA0B,MAAS,EACzDC,EAAoBD,GAA0B,MAAS,EACvDE,EAA2BF,GAA2B,MAAS,EAC/DG,EAAyBH,GAA2B,MAAS,EAEnEI,GAAU,IAAM,CACd3B,EAAeU,GAAQ,QAAQ,SAAS,GAAK,EAAE,CACjD,EAAG,CAACA,GAAQ,MAAM,CAAC,EAEnBiB,GAAU,IAAM,CACd,GAAIf,IAAoB,UAAW,CACjC,IAAMgB,EAAQf,EAAY,KACvBe,GAAUA,EAAM,OAASlB,GAAQ,MAAM,UAC1C,EACMmB,EAAQf,EAAO,KAAMgB,GACzBC,GAAeD,EAAGpB,GAAQ,MAAM,OAAS,IAAI,CAC/C,GAEIkB,GAAU,CAACA,GAASH,EAAyB,UAC/CtB,EAAkByB,GAAS,IAAI,EAG7BC,EACFzB,EAAa,CAAE,MAAAyB,EAAO,KAAM,CAAE,YAAAhB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC5C,CAACe,GAASP,EAAoB,SACvClB,EAAa,CAAE,MAAO,IAAK,CAAC,EAG9BqB,EAAyB,QAAUf,GAAQ,MAAM,WACjDY,EAAoB,QAAUZ,GAAQ,MAAM,KAC9C,CACF,EAAG,CACDA,GAAQ,MAAM,OAAO,OACrBA,GAAQ,MAAM,OAAO,QACrBA,GAAQ,MAAM,OAAO,WACrBA,GAAQ,MAAM,WACdE,CACF,CAAC,EAEDe,GAAU,IAAM,CACVK,GAAwB3B,EAAWa,CAAgB,GACrDd,EAAa,CAAE,MAAO,IAAK,CAAC,EAG1B6B,GAA6B1B,EAAgBY,CAAqB,GACpEhB,EAAkB,IAAI,CAE1B,EAAG,CAACe,EAAkBC,CAAqB,CAAC,EAE5CQ,GAAU,IAAM,CACVK,GAAwB1B,EAASc,CAAc,GACjDhB,EAAa,CAAE,MAAO,IAAK,CAAC,EAE1B6B,GAA6BzB,EAAca,CAAmB,GAChEnB,EAAgB,IAAI,CAExB,EAAG,CAACkB,EAAgBC,CAAmB,CAAC,EAExCM,GAAU,IAAM,CACd,GAAIf,IAAoB,UAAW,CACjC,IAAMgB,EAAQf,EAAY,KACvBe,GAAUA,EAAM,OAASlB,GAAQ,IAAI,UACxC,EACMmB,EAAQf,EAAO,KAAMgB,GACzBC,GAAeD,EAAGpB,GAAQ,IAAI,OAAS,IAAI,CAC7C,GAEIkB,GAAU,CAACA,GAASF,EAAuB,UAC7CxB,EAAgB0B,GAAS,IAAI,EAG3BC,EACF5B,EAAW,CAAE,MAAA4B,EAAO,KAAM,CAAE,YAAAhB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC1C,CAACe,GAASL,EAAkB,SACrCvB,EAAW,CAAE,MAAO,IAAK,CAAC,EAG5ByB,EAAuB,QAAUhB,GAAQ,IAAI,WAC7Cc,EAAkB,QAAUd,GAAQ,IAAI,KAC1C,CACF,EAAG,CACDA,GAAQ,IAAI,OAAO,OACnBA,GAAQ,IAAI,OAAO,QACnBA,GAAQ,IAAI,OAAO,WACnBA,GAAQ,IAAI,WACZE,CACF,CAAC,EAEDe,GAAU,IAAM,CACdZ,EAAgBL,GAAQ,WAAW,KAAO,IAAI,EAC9CM,EAAoBN,GAAQ,WAAW,SAAW,IAAI,EACtDO,EAAoBP,GAAQ,WAAW,SAAW,IAAI,CACxD,EAAG,CACDA,GAAQ,WAAW,IACnBA,GAAQ,WAAW,QACnBA,GAAQ,WAAW,OACrB,CAAC,CACH,CA1HgBwB,EAAAnC,GAAA,2BSZhB,OAAS,aAAAoC,GAAW,UAAAC,OAAc,QAClC,OACE,sBAAAC,GACA,eAAAC,GACA,mBAAAC,OACK,mBCHA,SAASC,GACdC,EACAC,EACAC,EACc,CACd,OAAKA,GAIHF,EAAO,KAAMG,GAAU,CACrB,IAAMC,EAAmBH,GAAa,MAAM,IAAI,EAChD,OAAIG,GAAkB,SAAW,EAE7BD,EAAM,SAAWC,EAAiB,CAAC,GACnCD,EAAM,UAAY,MAClBA,EAAM,aAAeD,EAAM,KAI7BC,EAAM,SAAWC,IAAmB,CAAC,GACrCD,EAAM,UAAYC,IAAmB,CAAC,GACtCD,EAAM,aAAeD,EAAM,IAE/B,CAAC,GAAK,IAEV,CAzBgBG,EAAAN,GAAA,sBA2BT,SAASO,GAAmBH,EAAyC,CAC1E,GAAIA,EACF,MAAO,GAAGA,EAAM,MAAM,GAAGA,EAAM,QAAU,KAAKA,EAAM,OAAO,GAAK,EAAE,EAGtE,CALgBE,EAAAC,GAAA,sBDbT,SAASC,IAAqB,CACnC,IAAMC,EAAWC,GAAY,EACvB,CAACC,EAAcC,CAAe,EAAIC,GAAgB,EAClD,CACJ,eAAAC,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,eAAAC,CACF,EAAIC,EAAc,EACZC,EAAkBC,EAAY,EAAE,YAChCC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAAoBC,GAAmB,EACvC,CAAE,aAAAC,EAAc,mBAAAC,CAAmB,EAAIN,EAAY,EACnDO,EAAeP,EAAY,EAAE,iBAAiB,EAC9CQ,EAA4BC,GAAe,EAE3CC,EAAqBC,EAAA,IAAM,CAC/B,IAAMC,EAAa3B,EAAa,gBAA4B,EACtDG,EAAiBH,EAAa,oBAAgC,EAC9DK,EAAYL,EAAa,eAA2B,EACpDI,EAAeJ,EAAa,kBAA8B,EAC1DM,EAAUN,EAAa,aAAyB,EAChD4B,EAAc5B,EAAa,iBAA6B,EACxD6B,EAAY7B,EAAa,eAA2B,EACpD8B,EAAmB9B,EAAa,sBAAkC,EAExE,MAAO,CACL,WAAA2B,EACA,eAAAxB,EACA,UAAAE,EACA,aAAAD,EACA,QAAAE,EACA,YAAAsB,EACA,UAAAC,EACA,iBAAAC,CACF,CACF,EApB2B,sBAsBrBC,EAAwBL,EAC5B1B,GACG,CACH,QAAWgC,KAAYhC,EAChBA,EAAagC,CAAQ,GACxB,OAAOhC,EAAagC,CAAQ,EAGhC/B,EAAgBD,EAAwC,CAAE,QAAS,EAAK,CAAC,CAC3E,EAT8B,yBAW9BiC,GAAU,IAAM,CACd,GAAM,CAAE,YAAAL,EAAa,UAAAC,CAAU,EAAIJ,EAAmB,EAClDP,GAAqBJ,IAAoB,WAC3CiB,EAAsB,CACnB,eAA+B5B,GAAgB,KAC/C,UAA0B+B,GAAmB7B,CAAS,EACtD,aAA6BD,GAAc,KAC3C,QAAwB8B,GAAmB5B,CAAO,EAClD,WAA2BC,EAC3B,YAA4BqB,GAAe,OAC3C,UAA0BC,GAAa,OACvC,iBAAiCP,EAC9BC,EAA0B,QAC1B,MACN,CAAC,CAEL,EAAG,CACDzB,EAAS,SACTS,EACAJ,EACAE,EACAD,EACAE,EACAgB,CACF,CAAC,EAEDW,GAAU,IAAM,CACd,GAAI,CAACf,EACH,OAGF,IAAMlB,EAAeyB,EAAmB,EAUxC,GARI,CAACF,EAA0B,SAAWvB,EAAa,mBACrDuB,EAA0B,QAAUvB,EAAa,kBAG/CA,EAAa,YACfY,EAAeZ,EAAa,UAAU,EAGpCc,IAAoB,UAAW,CACjC,IAAMX,EAAiBa,EAAY,KAChCmB,GAAeA,EAAW,OAASnC,EAAa,cACnD,EACMK,EAAY+B,GAChBnB,EACAjB,EAAa,UACbG,GAAkB,IACpB,EACMC,EAAeY,EAAY,KAC9BmB,GAAeA,EAAW,OAASnC,EAAa,YACnD,EACMM,EAAU8B,GACdnB,EACAjB,EAAa,QACbI,GAAgB,IAClB,EAEMD,IACJK,EAAkBL,CAAc,EAC1BE,GACJK,EAAa,CACX,MAAOL,EACP,KAAM,CACJ,YAAaW,EACb,OAAQC,CACV,CACF,CAAC,GAICb,IACJK,EAAgBL,CAAY,EACtBE,GACJK,EAAW,CACT,MAAOL,EACP,KAAM,CAAE,YAAaU,EAAa,OAAQC,CAAO,CACnD,CAAC,EAGP,CACF,EAAG,CAACH,CAAe,CAAC,EAEpBmB,GAAU,IAAM,CACd,GAAM,CAAE,UAAAJ,EAAW,iBAAAC,CAAiB,EAAIL,EAAmB,EAE3DL,EAAa,YAAaS,GAAa,MAAS,EAEhDR,EACE,mBACAS,GAAkB,MAAM,GAAG,GAAK,MAClC,CACF,EAAG,CAAC,CAAC,CACP,CAtJgBJ,EAAA7B,GAAA,sBEVhB,OAAS,QAAAwC,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OACE,SAAAC,GACA,UAAAC,GACA,OAAAC,GACA,WAAAC,GACA,cAAAC,GACA,UAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QACpE,OAAS,aAAAC,OAAiB,YAC1B,OAAS,eAAAC,GAAa,eAAAC,OAAmB,mBChBzC,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,iBAAAC,GACA,UAAAC,GACA,mBAAAC,GACA,mBAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QAC3C,OAAS,eAAAC,OAAmB,mBCf5B,OAAS,QAAAC,OAAY,eAId,SAASC,GAA6BC,EAA6B,CACxE,OAAQA,EAAQ,KAAM,CACpB,OACE,OAAOC,GAAK,EAAE,yBAAyB,EACzC,OACE,OAAOA,GAAK,EACV,2EACA,CACE,gBAAiBD,EAAQ,gBACzB,iBAAkBA,EAAQ,gBAC5B,CACF,EACF,OACE,OAAOC,GAAK,EAAE,kCAAkC,EAClD,OACE,OAAOA,GAAK,EAAE,wCAAwC,EACxD,QACE,MAAO,EACX,CACF,CAnBgBC,EAAAH,GAAA,gCCHhB,OAAS,SAAAI,OAAa,gBACtB,OAAOC,OAAW,QAIX,SAASC,GAAiBC,EAA0C,CACzE,GAAM,CAAE,UAAAC,CAAU,EAAIC,GAAW,EAGjC,OACEC,GAAA,cAACC,GAAA,CAAM,aAFYH,IAAc,OAEG,GAAGD,GACpCA,EAAM,QACT,CAEJ,CATgBK,EAAAN,GAAA,oBCLhB,OAAOO,IAAS,UAAAC,OAAc,QCH9B,UAAYC,OAAiB,8BAC7B,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAiC,IAExCC,GAAYH,GAAU,CAC1B,KAAM,CACJ,OAAQ,CACV,EACA,GAAI,CACF,OAAQ,yCACV,CACF,CAAC,EAEKI,GAAUJ,GAAU,CACxB,KAAM,CACJ,OAAQ,yCACV,EACA,GAAI,CACF,OAAQ,CACV,CACF,CAAC,EAEYK,GAAkBJ,GAAmB,QAAM,CACtD,aAAc,MACd,SAAU,SACV,SAAU,CACR,SAAU,CACR,KAAM,CACJ,aAAc,EACd,aAAc,gBACd,aAAc,OAChB,CACF,CACF,CACF,CAAC,EAEYK,GAAUL,GAAmB,WAAS,CACjD,QAAS,KACT,OAAQ,OACR,QAAS,OACT,MAAO,OACP,gBAAiB,cACjB,WAAY,UACZ,OAAQ,SACV,CAAC,EAEYM,GAAqBN,GAAmB,WAAS,CAC5D,SAAU,SACV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,UAAW,GAAGE,EAAS,IAAID,EAA8B,aAC3D,EACA,MAAO,CACL,UAAW,GAAGE,EAAO,IAAIF,EAA8B,aACzD,CACF,CACF,CACF,CAAC,EAEYM,GAAeP,GAAO,MAAO,CACxC,WAAY,OAAOC,EAA8B,UACjD,QAAS,OACT,WAAY,SACZ,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EDhEM,SAASO,GAAkBC,EAAqC,CACrE,GAAM,CACJ,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,SAAAC,EACA,eAAAC,EACA,QAAAC,EACA,cAAAC,CACF,EAAIP,EACEQ,EAAMC,GAA8B,IAAI,EAE9C,OACEC,GAAA,cAACC,GAAA,CACC,IAAKH,EACL,UAAU,mBACV,SAAUN,GAAeD,EACzB,KAAMA,EACN,aAAcE,GACbI,IAAkB,OACjBG,GAAA,cAACE,GAAA,CAAQ,UAAU,sBAAsB,QAASP,GAC/CC,CACH,EAEFI,GAAA,cAACG,GAAA,CAAmB,UAAU,sBAAsB,KAAMZ,GACvDG,CACH,EACCG,IAAkB,UACjBG,GAAA,cAACE,GAAA,CAAQ,UAAU,sBAAsB,QAASP,GAC/CC,CACH,CAEJ,CAEJ,CAlCgBQ,EAAAf,GAAA,qBEXhB,OAAS,OAAAgB,GAAK,aAAAC,GAAW,cAAAC,GAAY,UAAAC,GAAQ,aAAAC,OAAiB,gBAEvD,IAAMC,GAAQF,GAAO,MAAO,CACjC,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,QAAS,OACT,eAAgB,eAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,KACZ,OAAQ,MACV,CAAC,EAEYI,GAAeJ,GAAO,SAAU,CAC3C,aAAc,MACd,QAAS,MACT,OAAQ,IACR,QAAS,OACT,eAAgB,SAChB,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,WAAY,SACZ,OAAQ,UACR,MAAO,IACP,SAAU,WAEV,UAAW,CACT,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EAEA,kBAAmB,CACjB,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,iBACX,EACA,gBAAiB,UACjB,QAAS,CACX,EACA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,aAAc,EACd,aAAc,aACd,aAAc,OAChB,CACF,CACF,CACF,CAAC,EAEYO,GAAkBL,GAAOI,GAAc,CAClD,UAAW,UACX,UAAW,MACb,CAAC,EACYE,GAAiBN,GAAO,MAAO,CAC1C,QAAS,kBACT,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,gBAAiB,cACjB,SAAU,WACV,MAAO,MACT,CAAC,EAEYO,GAAeP,GAAOD,GAAY,CAC7C,SAAU,WACV,KAAM,KACR,CAAC,EAEYS,GAAmBR,GAAO,MAAO,CAC5C,WAAY,KACd,CAAC,EAEYS,GAAoBZ,GAAI,CACnC,QAAS,OACT,eAAgB,eAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,KACZ,OAAQ,MACV,CAAC,EAEYa,GAAoBV,GAAO,MAAO,CAC7C,QAAS,SACT,qBAAsB,CACpB,QAAS,OACT,WAAY,QACd,EACA,YAAa,CAAE,WAAY,IAAK,EAChC,yBAA0B,CACxB,gBAAiB,aACnB,EACA,sBAAuB,CACrB,gBAAiB,aACnB,CACF,CAAC,EAEYW,GAAed,GAAI,CAC9B,WAAY,IACd,CAAC,EAEYe,GAAgBZ,GAAO,MAAO,CACzC,QAAS,MACX,CAAC,EAEYa,GAAkBb,GAAOC,GAAW,CAC/C,gBAAiB,cACjB,QAAS,gBACX,CAAC,EAEYa,GAAUd,GAAO,MAAO,CAAE,SAAU,UAAW,MAAO,MAAO,CAAC,EAE9De,GAA0Bf,GAAO,MAAO,CACnD,MAAO,OACP,aAAc,MACd,QAAS,OACT,QAAS,MACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,wBAAyB,IACzB,uBAAwB,IACxB,UAAW,CACT,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,kBAAmB,CACjB,aAAc,kBACd,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,aAAc,iBAChB,EACA,gBAAiB,eACjB,QAAS,CACX,CACF,CAAC,ECrJD,OAAS,QAAAkB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,SAAAC,GACA,cAAAC,GACA,oBAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCX3C,OAAS,eAAAC,OAAmB,gBAC5B,OAAS,cAAAC,OAAkB,2BAC3B,OACE,uBAAAC,GACA,4BAAAC,GAEA,eAAAC,OACK,4BACP,OAAS,eAAAC,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QAYjD,IAAMC,GAAwB,OAAO,OAAOC,EAAW,EAchD,SAASC,GAAcC,EAAgB,CAC5C,GAAM,CAAE,OAAAC,EAAQ,MAAAC,EAAO,gBAAAC,EAAiB,UAAAC,CAAU,EAAIJ,EAChD,CAAE,MAAAK,EAAO,WAAAC,EAAY,cAAAC,EAAe,QAAAC,CAAQ,EAAIC,GAAW,EAC3D,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAcC,EAAY,EAAE,YAAY,EAGxCC,EACJC,GAA0Bd,GAAQ,QAAS,CACzC,uBAAwBA,GAAQ,sBAClC,CAAC,GAAKJ,GAEJmB,EAAUC,GACZZ,EACAE,EACAO,EACAZ,CACF,EAEAc,EAAUE,GAAoB,EAC1BF,EAAQ,OACLG,GAAWA,EAAO,cAAgBd,EAAMc,EAAO,IAAI,EAAE,SACxD,EACAH,EAEJ,IAAMI,EAAgBC,GAAkCL,CAAO,EACzD,CAACM,EAAOC,CAAQ,EAAIC,GAAS,EAAE,EAE/BC,EAA8BC,EAACC,GACnC,CAACjB,EAAiB,KACfkB,GACCA,EAAgB,aAAeD,GAC/BC,EAAgB,QAAU1B,CAC9B,EALkC,+BAO9B2B,EAAcH,EAAA,MAAOI,GAAqB,CAC9C,IAAMX,EAASd,EAAMyB,CAAI,EACzB,GAAI,CAIF,GAHIR,GACFC,EAAS,EAAE,EAETJ,EAAO,UACT,MAAMb,EAAWwB,CAAI,MAChB,CACL,IAAMC,EAA8B,CAAC,CAACf,EAAQ,KAC3CgB,GAAMA,EAAE,QAAUC,GAAY,SACjC,EACA,GAAI,CAAChC,GAAQ,cAAgB8B,EAC3B,OAEF5B,IAAkB2B,CAAI,EACtB,MAAMtB,EAAQsB,CAAI,EAClB1B,IAAY0B,CAAI,CAClB,CACF,OAASI,EAAG,CACVX,EAAS,UAAaW,GAAW,OAAO,CAC1C,CACF,EAtBoB,eAwBdC,EAA8BC,GAAY,IAAM,CACpD,IAAMC,EACJrB,GAAS,OAAQG,GAAWA,EAAO,QAAUc,GAAY,UAAU,GACnE,CAAC,EACH,QAAWd,KAAUkB,EACd/B,EAAWa,EAAO,IAAI,CAE/B,EAAG,CAACmB,GAAiBtB,CAAO,CAAC,CAAC,EAE9BuB,GAAU,IACD,IAAM,CACXJ,EAA4B,CAC9B,EACC,CAAC,CAAC,EAOL,IAAMK,EAAkCd,EAACV,GAA0B,CAEjE,IAAMyB,EAAgBzB,EAAQ,KAC3BG,GAAWA,EAAO,OAASrB,GAAY,OAC1C,EACA,MAAI,CAAC2C,GAAiBA,EAAc,QAAUR,GAAY,cACjD,GAOiCjB,EAAQ,OAC/CG,GACCA,EAAO,OAASc,GAAY,eAC5B,CAAC,CAACnC,GAAY,QAASA,GAAY,gBAAgB,EAAE,SACnDqB,EAAO,IACT,GACAZ,EAAcY,EAAO,IAAI,EAAE,gBAAgB,OACxCuB,GAAeA,EAAW,MAAQ,KACrC,EAAE,OAAS,CACf,EACyC,QAAU,CACrD,EAxBwC,mCA0BlCC,EAAsBjB,EAAA,CAC1BC,EACAzB,EACAU,IAGGgC,GAAoBhC,EAAaV,CAAK,GACrCuB,EAA4BE,CAAU,GACtC,CAACkB,GAAyB,SAASlB,CAAU,GAC9CA,GAAc7B,GAAY,SACzB,CAAC0C,EAAgCxB,CAAO,EAVlB,uBAc5B,MAAO,CACL,KAAMI,EAAc,OACjBD,GAAW,CAACwB,EAAoBxB,EAAO,KAAMjB,GAAS,GAAIU,CAAW,CACxE,EACA,MAAAU,EACA,YAAAO,EACA,4BAAAM,CACF,CACF,CA/HgBT,EAAA3B,GAAA,iBCpChB,OAAS,QAAA+C,OAAY,eACrB,OAAS,UAAAC,GAAQ,cAAAC,GAAY,UAAAC,GAAQ,eAAAC,OAAmB,gBACxD,OAAOC,IAAS,YAAAC,OAAgB,QCAhC,OAAS,cAAAC,OAAkB,iCAC3B,OAAS,cAAAC,GAAY,WAAAC,GAAS,UAAAC,OAAc,gBAC5C,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCJnD,OAAS,UAAAC,OAAc,QCFhB,SAASC,IAAwB,CACtC,OAAO,OAAO,OAAS,OAAO,GAChC,CAFgBC,EAAAD,GAAA,yBDchB,SAASE,IAAuB,CAC9B,IAAMC,EAAiBC,GAA8B,IAAI,EACnD,CAAE,OAAAC,CAAO,EAAIC,EAAY,EACzBC,EAA4BC,GAAsB,GAAKH,EAAO,UAE9DI,EAAOC,EAACC,GAAsB,CAC9BJ,GACF,OAAO,KAAK,YAAYI,EAASN,EAAO,SAAU,CAEtD,EAJa,QA4Bb,MAAO,CACL,KAAAI,EACA,sBAxB4BC,EAACE,GAAyB,CACtDT,EAAe,QAAU,IAAI,eAAgBU,GAAY,CACvD,QAAWC,KAASD,EAClBJ,EAAK,CACH,KAAM,gBACN,KAAM,CACJ,OAAQK,EAAM,YAAY,MAC5B,CACF,CAAC,CAEL,CAAC,EAEDX,EAAe,QAAQ,QAAQS,CAAO,CACxC,EAb8B,yBAyB5B,yBAV+BF,EAAA,IAAM,CACjCP,EAAe,UACjBA,EAAe,QAAQ,WAAW,EAClCA,EAAe,QAAU,KAE7B,EALiC,2BAWjC,CACF,CAtCSO,EAAAR,GAAA,aEdT,OAAS,eAAAa,OAAmB,mBAErB,SAASC,IAA8B,CAC5C,IAAMC,EAAWC,GAAY,EAC7B,MAAO,IAAMD,EAAS,EAAE,CAC1B,CAHgBE,EAAAH,GAAA,mBCDhB,OACE,eAAAI,GACA,aAAaC,GACb,cAAcC,OACT,gBACP,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QCFpC,OACE,SAASC,GACT,cAAcC,OACT,gBACP,OAAOC,OAAW,QCNX,SAASC,GACdC,EACAC,EACAC,EAC2B,CAQ3B,IAAMC,EAA4B,CAAC,EAC/BC,EAAY,GAChB,QAASC,EAAI,EAAGA,EAAI,EAAkBA,IACpCF,EAAgB,KAAKC,CAAS,EAC1BC,EAAI,IAAM,EACZD,EAAY,EAEZA,GACEC,GAAK,EACD,EACA,GAKV,IAAMC,EAAmBJ,EACrBC,EAAgB,MAAM,EAAE,QAAQ,EAChCA,EAEEI,EAAoC,CAAC,EAG3C,QAASF,EAAI,EAAGA,EAAI,EAAkBA,IAAK,CACzC,IAAMG,EAAa,IAAmBH,EAAI,IACpCI,EAAkBH,EAAiBD,CAAC,EAEpCK,EAAmC,CACvC,CAAC,GAAGT,CAAM,GAAGO,CAAU,EAAE,EAAGG,GAAcX,EAAWS,CAAe,CACtE,EACA,OAAO,OAAOF,EAAQG,CAAK,CAC7B,CAEA,MAAO,CAAE,GAAGH,EAAQ,CAACN,CAAM,EAAGD,CAAU,CAC1C,CA7CgBY,EAAAb,GAAA,kBA+CT,SAASY,GACdX,EACAS,EACQ,CACR,GAAM,CAACI,EAAGC,EAAGC,CAAC,EAAIC,GAAahB,CAAS,EACxC,MAAO,IAAIiB,GAAMJ,EAAIJ,CAAe,CAAC,GAAGQ,GAAMH,EAAIL,CAAe,CAAC,GAAGQ,GACnEF,EAAIN,CACN,CAAC,EACH,CARgBG,EAAAD,GAAA,iBAUT,SAASK,GAAahB,EAA6B,CAMxD,IAAM,EAAY,SAChBA,EAAU,MAAM,EAAmB,CAAe,EAClD,EACF,EACMc,EAAY,SAChBd,EAAU,MAAM,EAAiB,CAAmB,EACpD,EACF,EACMe,EAAY,SAChBf,EAAU,MAAM,EAAqB,CAAiB,EACtD,EACF,EAEA,MAAO,CAAC,EAAGc,EAAGC,CAAC,CACjB,CApBgBH,EAAAI,GAAA,gBAuBhB,SAASC,GAAMC,EAAuB,CAIpC,OACE,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAiBA,CAAK,CAAC,EAAE,SAAS,EAAQ,GAEpE,MAAM,EAAU,EAChB,YAAY,CACjB,CATSN,EAAAK,GAAA,SAWF,SAASE,GAASnB,EAAmB,CAO1C,GAAM,CAACa,EAAGC,EAAGC,CAAC,EAAIC,GAAahB,CAAS,EAIxC,OAFGa,EAAI,IAAkBC,EAAI,IAAoBC,EAAI,KACnD,IACe,GAInB,CAfgBH,EAAAO,GAAA,YAiBT,IAAMC,GAAiBR,EAAA,CAC5BS,EACAC,EACAC,IACG,CACH,GAAI,CAACA,GAAU,CAAC,OAAO,QAAQA,CAAM,EAAE,OACrC,MAAO,CAAC,EAEV,IAAIC,EAAe,GACfC,EAAe,CAAE,GAAGJ,CAAW,EACnC,QAAWK,KAAYH,EAAQ,CAC7B,IAAML,EAAQK,EAAOG,CAA4B,EAE3CR,GAASA,IAAUG,EAAWK,CAAQ,IAC1CF,EAAe,GACXE,IAAa,cAAgBA,IAAa,aAC5CD,EAAe,CACb,GAAGA,EACH,CAACC,CAAQ,EAAGR,CACd,EAGAO,EAAe,CACb,GAAGA,EACH,GAAG1B,GAAemB,EAAOQ,EAHXA,IAAa,WAAaJ,CAGE,CAC5C,EAGN,CACA,OAAOE,EAAeC,EAAe,CAAC,CACxC,EA9B8B,kBC3G9B,IAAME,GAAmBC,EAACC,GACxB,OAAO,aAAaA,GAAQA,EAAO,GAAK,GAAK,GAAG,EADzB,oBAGnBC,GAAmBF,EAACC,GAAiB,CACzC,IAAIE,EAAO,GACPC,EAEJ,IAAKA,EAAI,KAAK,IAAIH,CAAI,EAAGG,EAAI,GAAIA,EAAKA,EAAI,GAAM,EAC9CD,EAAOJ,GAAiBK,EAAI,EAAE,EAAID,EAGpC,OAAOJ,GAAiBK,EAAI,EAAE,EAAID,CACpC,EATyB,oBAWnBE,GAAUL,EAAA,CAACM,EAAWF,IAAc,CACxC,IAAIG,EAAIH,EAAE,OACV,KAAOG,GACLD,EAAKA,EAAI,GAAMF,EAAE,WAAW,EAAEG,CAAC,EAEjC,OAAOD,CACT,EANgB,WAQHE,GAASR,EAACS,GACrBP,GAAiBG,GAAQ,KAAM,KAAK,UAAUI,CAAK,CAAC,IAAM,CAAC,EADvC,UFAf,SAASC,GACdC,EACiB,CACjB,IAAMC,EAAaC,GAAgB,OAE7BC,EAAyBC,GAC7B,CACE,GAAGH,EACH,GAAGI,EACL,EACA,GACAL,GAAQ,IACV,EACMM,EAA0BF,GAC9BH,EACA,GACAD,GAAQ,KACV,EACMO,EAAuB,OAAO,KAAKJ,CAAsB,EAAE,OAAS,EACpEK,EAAwB,OAAO,KAAKF,CAAuB,EAAE,OAAS,EAExEG,EACAC,EAEJ,GAAIF,EAAuB,CACzB,IAAMG,EAAS,CAAE,OAAQL,CAAwB,EAEjDG,EAAQ,CACN,GAFS,GAAGG,EAAuB,UAAUC,GAAOF,CAAM,CAAC,GAG3D,OAAAA,CACF,CACF,CACA,GAAIJ,EAAsB,CACxB,IAAMI,EAAS,CACb,OAAQR,CACV,EAEAO,EAAO,CACL,GAFS,GAAGE,EAAuB,SAASC,GAAOF,CAAM,CAAC,GAG1D,OAAAA,CACF,CACF,CAEA,MAAO,CACL,MAAAF,EACA,KAAAC,CACF,CACF,CA/CgBI,EAAAf,GAAA,yBAiDT,SAASgB,GACdC,EACAC,EACA,CACA,GAAID,EAAK,QAAU,EACjB,OAAOA,EAAK,IAAI,CAAC,CAAE,QAAAE,EAAS,IAAAC,CAAI,IAAMC,GAAM,aAAaF,EAAS,CAAE,IAAAC,CAAI,CAAC,CAAC,EAG5E,IAAME,EAA8B,CAAC,EACrC,OAAAL,EAAK,QAAQ,CAACM,EAAMC,IAAU,CAC5B,GAAM,CAAE,QAAAL,EAAS,IAAAC,CAAI,EAAIG,EAEzB,GADAD,EAAO,KAAKD,GAAM,aAAaF,EAAS,CAAE,IAAAC,CAAI,CAAC,CAAC,EAC5CI,EAAQP,EAAK,OAAS,EAAG,CAC3B,IAAMG,EAAM,WAAWI,CAAK,GAC5BF,EAAO,KAAKD,GAAM,aAAaH,EAAS,CAAE,IAAAE,CAAI,CAAC,CAAC,CAClD,CACF,CAAC,EAEME,CACT,CAnBgBP,EAAAC,GAAA,YDzDT,SAASS,GAASC,EAAoB,CAC3C,GAAM,CACJ,OAAAC,EACA,WAAAC,EAAaC,GACb,aAAAC,EAAeC,GACf,sBAAAC,EAAwBC,EAC1B,EAAIP,EAEE,CAACQ,EAASC,CAAU,EAAIC,GAAS,OAAO,EAExC,CAAE,MAAAC,CAAM,EAAIC,EAAY,EAExB,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAIC,GAAsBd,CAAM,EAE9Ce,EAAYC,GAAY,CAC5B,MAAO,CACL,QAAS,GAAGb,CAAY,KACxB,UAAW,GAAGE,CAAqB,IACrC,EACA,MAAO,CACL,OAAQJ,CACV,CACF,CAAC,EACKgB,EAAoB,CAACF,EAAU,UAAWG,GAAkB,SAAS,EACrEC,EAAmB,CAACJ,EAAU,UAAWK,GAAiB,SAAS,EAMzE,GAAIP,EAAO,CACT,IAAMQ,EAAuBL,GAAYH,EAAM,GAAIA,EAAM,MAAM,EAC/DI,EAAkB,KAAKI,EAAqB,SAAS,CACvD,CACA,GAAIT,EAAM,CACR,IAAMU,EAAsBN,GAAYJ,EAAK,GAAIA,EAAK,MAAM,EAC5DO,EAAiB,KAAKG,EAAoB,SAAS,CACrD,CAEA,OAAAC,GAAU,IAAM,CACd,IAAMC,EAAsBC,EAACC,GAA+B,CACtDA,EAAM,QACRlB,EAAW,MAAM,EAEjBA,EAAW,OAAO,CAEtB,EAN4B,uBAQ5B,OACE,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,SAElDA,EAAW,MAAM,EAGnB,OACG,WAAW,8BAA8B,EACzC,iBAAiB,SAAUgB,CAAmB,EAC1C,IAAM,CACX,OACG,WAAW,8BAA8B,EACzC,oBAAoB,SAAUA,CAAmB,CACtD,CACF,EAAG,CAAC,CAAC,EAWE,CAAE,YATcC,EAAA,IAAM,CAC3B,IAAME,EAAkBV,EAAkB,KAAK,GAAG,EAC5CW,EAAiBT,EAAiB,KAAK,GAAG,EAChD,OAAIT,IAAU,OACLH,IAAY,OAASqB,EAAiBD,EAExCjB,IAAU,OAASkB,EAAiBD,CAC7C,EAPuB,iBASc,CACvC,CA3EgBF,EAAA3B,GAAA,YIXT,IAAM+B,GAAkBC,EAACC,GAAiC,CAC/D,IAAMC,EAAmC,CAAC,EAE1C,OAAAD,GAAS,OAAO,EAAE,QAAQ,CAACE,EAAGC,IAAO,CACnC,IAAMC,EAAUF,EAAE,KAAK,WAAW,EAE9BE,GAAS,aACXH,EAAO,KAAK,CACV,GAAAE,EACA,KAAMC,GAAS,WACjB,CAAC,CAEL,CAAC,EAEMH,EAAO,KACZ,CAACI,EAAGC,IAAM,OAAOA,EAAE,KAAK,YAAY,EAAI,OAAOD,EAAE,KAAK,YAAY,CACpE,CACF,EAjB+B,mBCJ/B,OAAS,QAAAE,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,OAAc,gBAC9B,OAAOC,OAAW,QAEX,SAASC,GAAiBC,EAAkB,CACjD,OACEC,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,QAASH,EAAM,cACf,QAAQ,YACR,KAAK,UACL,KAAK,WACJI,GAAK,EAAE,mBAAmB,CAC7B,EAEF,KAAK,UACL,QAAQ,QACR,MAAOA,GAAK,EAAE,+CAA+C,EAC/D,CAEJ,CAjBgBC,EAAAN,GAAA,oBCJhB,OAAS,QAAAO,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,OAAkB,gBAC5C,OAAOC,OAAW,QAKX,SAASC,GAAiBC,EAAkB,CACjD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,CAAU,EAAIH,EAErC,OACEI,GAAA,cAACC,GAAA,CACC,KAAMJ,EACN,YAAW,GACX,QAASC,EACT,UAAWI,EAAa,GACxBF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,sBAAsB,EACpC,KAAK,UACL,YAAaA,GAAK,EAChB,wLACF,GACAJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,QAAQ,YACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASP,GACRK,GAAK,EAAE,SAAS,CACnB,CACF,CACF,CAEJ,CA3BgBG,EAAAZ,GAAA,oBCPhB,OAAS,mBAAAa,OAAuB,gBAChC,OAAOC,OAAW,QCHlB,OAAS,OAAAC,GAAK,aAAAC,GAAW,cAAAC,GAAY,UAAAC,OAAc,gBAE5C,IAAMC,GAAeD,GAAOD,GAAY,CAC7C,MAAO,MACP,SAAU,WACV,QAAS,IACT,SAAU,QACV,UAAW,CACT,gBAAiB,WACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,UACnB,CACF,CACF,CAAC,EAEYI,GAAgBF,GAAO,MAAO,CACzC,SAAU,WACV,WAAY,gBACZ,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,MAAO,KACP,OAAQ,KACR,aAAc,MACd,MAAO,KACP,OAAQ,uBACV,CAAC,EAEYK,GAAkBH,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,WAChB,SAAU,MACV,OAAQ,CACN,QAAS,CACX,CACF,CAAC,EAEYI,GAA8BJ,GAAO,MAAO,CACvD,SAAU,WACV,MAAO,OACP,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,aAAc,MACd,IAAK,KACL,MAAO,KACP,SAAU,CACR,QAAS,CACP,KAAM,CACJ,gBAAiB,WACnB,EACA,MAAO,CACL,gBAAiB,eACnB,CACF,CACF,CACF,CAAC,EAEYK,GAAeL,GAAO,MAAO,CACxC,QAAS,KACT,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,iBACX,WAAY,0BACd,CACF,CACF,CACF,CAAC,EAEYM,GAAsCN,GAAO,MAAO,CAC/D,SAAU,WACV,MAAO,KACP,IAAK,KACL,gBAAiB,cACjB,aAAc,MAChB,CAAC,EAEYO,GAAYV,GAAI,CAC3B,QAAS,OACT,cAAe,MACf,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYW,GAAuBR,GAAO,MAAO,CAChD,aAAc,OACd,OAAQ,0BACR,sBAAuB,CACrB,WAAY,KACd,EACA,IAAK,CACH,aAAc,MAChB,CACF,CAAC,EDxFD,SAASS,GAAWC,EAAkB,CACpC,OACEC,GAAA,cAACC,GAAA,CAAa,QAAQ,QAAQ,KAAK,QAAQ,QAASF,EAAM,SACxDC,GAAA,cAACE,GAAA,CAAgB,MAAM,QAAQ,KAAM,GAAI,CAC3C,CAEJ,CANSC,EAAAL,GAAA,cELT,OAAS,QAAAM,OAAY,eACrB,OAAS,UAAAC,GAAQ,cAAAC,OAAkB,gBACnC,OAAOC,OAAW,QAIlB,SAASC,GAAaC,EAAkB,CACtC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAO,QAAQ,QAAQ,QAASH,EAAM,QAAS,KAAK,UACnDC,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,YAC7CC,GAAK,EAAE,QAAQ,CAClB,CACF,CACF,CAEJ,CAVSC,EAAAP,GAAA,gBCNT,OAAS,QAAAQ,OAAY,eACrB,OAAS,SAAAC,GAAO,WAAAC,GAAS,cAAAC,OAAkB,gBAC3C,OAAOC,OAAW,QAYlB,SAASC,GAAaC,EAAkB,CACtC,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAY,EAEzB,CAAE,KAAAC,CAAK,EAAIC,GAAc,CAAE,OAAAH,CAAO,CAAC,EACnCI,EAAmBF,EAAK,OAC3BG,GAAWA,EAAO,QAAU,WAC/B,EACMC,EAAWF,EAAiB,OAGhCG,GAAA,cAAC,OAAI,UAAWC,GAAU,GACvBJ,EAAiB,IAAKC,GACrBE,GAAA,cAACE,GAAA,CAAqB,IAAKJ,EAAO,OAChCE,GAAA,cAACG,GAAA,CAAM,IAAKL,EAAO,MAAO,KAAM,GAAI,CACtC,CACD,CACH,EARAM,GAAK,EAAE,gBAAgB,EAWzB,OACEJ,GAAA,cAACK,GAAA,CAAQ,UAAWb,EAAM,UAAW,KAAK,SAAS,QAASO,GAC1DC,GAAA,cAACM,GAAA,CAAa,QAAQ,QAAQ,KAAK,QAAQ,QAASd,EAAM,SACvDA,EAAM,aAAeQ,GAAA,cAACO,GAAA,IAAc,EACrCP,GAAA,cAACQ,GAAA,CAAW,KAAM,GAAI,MAAM,QAAQ,CACtC,CACF,CAEJ,CA3BSC,EAAAlB,GAAA,gBCdT,OAAS,QAAAmB,OAAY,eACrB,OACE,qBAAAC,GACA,WAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,mBAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,QAAAC,OAAY,eACrB,OAAS,iBAAAC,OAAqB,wCAC9B,OACE,cAAAC,GACA,oBAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBCJ5B,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,GAAS,yBAAAC,OAA6B,qBAWxC,IAAMC,GAAuBC,GAClCC,GAA0B,EACxBC,GACEC,GAAsB,CAACC,EAAKC,KAAS,CACnC,cAAe,CAAC,EAChB,gBAAiB,CAACC,EAAOC,IAAU,CACjC,IAAMC,EAAWD,EAAM,MAAM,CAAC,EACxBE,EAASF,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EAE3CG,EAA6B,CACjC,MAAAJ,EACA,aAAc,KAAK,IAAI,EACvB,KAAM,GACN,UAAWC,EAAM,UACjB,MAAO,CACL,KAAM,CACJ,WAAYC,EAAS,eACrB,QAASA,EAAS,kBAClB,OAAQA,EAAS,UACnB,EACA,GAAI,CACF,WAAYC,EAAO,aACnB,QAASA,EAAO,gBAChB,OAAQA,EAAO,QACjB,CACF,CACF,EAEME,EAAeN,EAAI,EAAE,cAAc,OACtCO,GAAqBA,EAAiB,YAAcL,EAAM,SAC7D,EAEAH,EAAI,KAAO,CACT,cAAe,CAAC,GAAGO,EAAcD,CAAY,CAC/C,EAAE,CACJ,EACA,UAAYG,GAAc,CACxBT,EAAKU,IAAW,CACd,cAAeA,EAAM,cAAc,IAAKF,GACtCA,EAAiB,YAAcC,EAC3B,CAAE,GAAGD,EAAkB,KAAM,EAAK,EAClCA,CACN,CACF,EAAE,CACJ,EACA,uBAAwB,IACfP,EAAI,EAAE,cAAc,OACxBO,GAAqB,CAACA,EAAiB,IAC1C,CAEJ,EAAE,EACF,CACE,KAAM,eACN,cAAe,EACjB,CACF,CACF,CACF,EC5EA,OAAS,aAAAG,GAAW,kBAAAC,GAAgB,UAAAC,OAAc,gBAE3C,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,MACT,MAAO,QACP,SAAU,OACV,UAAW,OACb,CAAC,EAEYE,GAAOF,GAAO,KAAM,CAC/B,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,kBAAmB,CACjB,UAAW,kBACb,CACF,CAAC,EAEYG,GAAWH,GAAOD,GAAgB,CAC7C,SAAU,CACR,eAAgB,CACd,KAAM,CACJ,gBAAiB,YACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,WACnB,CACF,CACF,CACF,CACF,CAAC,EAEYM,GAASJ,GAAO,MAAO,CAClC,QAAS,OACT,QAAS,EACT,WAAY,SACZ,UAAW,SACb,CAAC,EAEYK,GAAoBL,GAAO,MAAO,CAC7C,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,cAAe,SACf,QAAS,MACT,MAAO,OACP,OAAQ,OACV,CAAC,EC/CD,OAAS,QAAAM,OAAY,eACrB,OAAS,WAAAC,GAAS,sBAAAC,GAAoB,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAIX,SAASC,IAAuB,CACrC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAmB,MAAM,YAAY,KAAM,GAAI,EAChDF,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,GAAA,cAACI,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,cAC5CC,GAAK,EAAE,6BAA6B,CACvC,CACF,CAEJ,CAVgBC,EAAAP,GAAA,wBHoBhB,IAAMQ,GAA8B,EAE7B,SAASC,IAAsB,CACpC,IAAMC,EAAWC,GAAY,EAEvB,CAAE,uBAAAC,CAAuB,EAAIC,GAAqB,EAElDC,EAAgCF,EAAuB,EACvDG,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAqBJ,EACxB,KAAK,CAACK,EAAGC,IAAMA,EAAE,aAAeD,EAAE,YAAY,EAC9C,MAAM,EAAGX,EAA2B,EAEjCa,EAAgBC,EAACC,GAAyC,CAC9Db,EAAS,GAAGc,EAAiB,KAAK,IAAID,CAAS,EAAE,CACnD,EAFsB,iBAItB,OACEE,GAAA,cAACC,GAAA,KACER,EAAmB,OAClBO,GAAA,cAACE,GAAA,KACET,EAAmB,IAAI,CAACU,EAAkBC,IAAU,CACnD,GAAM,CAAE,MAAAC,EAAO,UAAAP,EAAW,MAAAQ,CAAM,EAAIH,EAC9BI,EAAYf,EAAO,KAAMgB,GAC7BC,GAAeD,EAAWH,EAAM,IAAI,CACtC,EAEMK,EAAiBpB,EAAY,KAChCqB,GAAmBA,EAAe,OAASN,EAAM,KAAK,UACzD,EAEMO,EAAUpB,EAAO,KAAMgB,GAC3BC,GAAeD,EAAWH,EAAM,EAAE,CACpC,EAEMQ,EAAevB,EAAY,KAC9BqB,GAAmBA,EAAe,OAASN,EAAM,GAAG,UACvD,EAEA,OACEL,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKF,GAClBM,EAAQ,GAAKJ,GAAA,cAACc,GAAA,CAAQ,KAAM,EAAG,EAChCd,GAAA,cAACe,GAAA,CACC,QAAS,IAAMnB,EAAcE,CAAS,EACtC,eACEQ,EAAM,kBAAoBU,GAAc,QAE1C,MACEhB,GAAA,cAACiB,GAAA,CACC,QAAQ,OACR,KAAK,QACL,MACEX,EAAM,kBAAoBU,GAAc,QACpC,cACA,eAELE,GAAK,EAAEZ,EAAM,OAAO,CACvB,EAEF,GAAIR,EACJ,MACEE,GAAA,cAACmB,GAAA,KACCnB,GAAA,cAAC,OAAI,UAAU,oBACbA,GAAA,cAACoB,GAAA,CACC,WAAYb,EAAYA,EAAU,MAAQ,GAC1C,WAAYG,EAAiBA,EAAe,KAAO,GACnD,KAAK,QACP,CACF,EACAV,GAAA,cAAC,OAAI,UAAU,kBACbA,GAAA,cAACoB,GAAA,CACC,WAAYR,EAAUA,EAAQ,MAAQ,GACtC,WAAYC,EAAeA,EAAa,KAAO,GAC/C,KAAK,QACP,CACF,CACF,EAEF,IAAKb,GAAA,cAACqB,GAAA,CAAiB,KAAM,GAAI,MAAM,OAAO,EAChD,CACF,CAEJ,CAAC,CACH,EAEArB,GAAA,cAACsB,GAAA,IAAqB,CAE1B,CAEJ,CAxFgBzB,EAAAb,GAAA,uBI1BhB,OAAS,cAAAuC,OAAkB,iCAC3B,OAAS,kBAAAC,OAAsB,gBAC/B,OAAOC,OAAW,QAMlB,IAAMC,GAA6BC,EAAA,IAAM,CACvC,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EAG/B,OAF4BC,GAAgBF,CAAO,EAAE,IAAI,CAAC,CAAE,KAAAG,CAAK,IAAMA,CAAI,EAEjE,KAAMA,GAASA,EAAK,SAAW,SAAS,EAKhDC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAe,MAAM,OAAO,KAAM,EAAG,CACxC,EANO,IAQX,EAbmC,8BAe5BC,GAAQT,GCzBf,OAAS,yBAAAU,OAA6B,gBACtC,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAI3C,IAAMC,GAAmB,IACnBC,GAAmB,GACnBC,GAAiB,IAEvB,SAASC,GAAc,CAAE,QAAAC,CAAQ,EAA0C,CACzE,GAAM,CAACC,EAAaC,CAAc,EAAIC,GAAS,CAAC,EAC1C,CAACC,EAAaC,CAAc,EAAIF,GAAS,EAAK,EAE9CG,EAAyBC,EAACC,GAAsB,CAChD,SAAS,QAAUA,GAErBC,EAAaD,CAAQ,CAEzB,EAL+B,0BAO/BE,GAAU,IAAM,CACd,IAAIF,EACJ,OAAIR,EACFQ,EAAW,OAAO,YAAY,IAAM,CAClCN,EAAgBS,GAAaA,EAAW,CAAC,EAErCV,IAAgBJ,IAClBe,EAAmB,CAEvB,EAAGhB,EAAgB,EAEnBa,EAAaD,CAAQ,EAGvB,SAAS,iBAAiB,mBAAoB,IAC5CF,EAAuBE,CAAQ,CACjC,EAEO,IAAM,CACX,SAAS,oBAAoB,mBAAoB,IAC/CF,EAAuBE,CAAQ,CACjC,EACIA,GACF,cAAcA,CAAQ,CAE1B,CACF,EAAG,CAACP,EAAaD,CAAO,CAAC,EAEzB,IAAMS,EAAeF,EAACC,GAAsB,CACtCA,GACF,cAAcA,CAAQ,EAExBN,EAAe,CAAC,CAClB,EALqB,gBAOfU,EAAqBL,EAAA,IAAM,CAC/BP,IAAU,EACVE,EAAe,CAAC,EAChBG,EAAe,EAAI,CACrB,EAJ2B,sBAM3B,OACEQ,GAAA,cAACC,GAAA,CACC,QAAQ,QACR,KAAK,QACL,MAAO,CAAE,WAAY,EAAG,cAAe,CAAE,EACzC,QAASF,EACT,SAAU,CAACZ,GACXa,GAAA,cAACE,GAAA,CACC,gBAAiB,IAAMV,EAAe,EAAK,EAC3C,YAAaD,GACbS,GAAA,cAACG,GAAA,CACC,KAAM,GACN,MAAQhB,EAAmB,QAAT,OAClB,SAAWC,EAAcJ,GAAoBC,GAC/C,CACF,CACF,CAEJ,CAtESS,EAAAR,GAAA,iBCTT,OAAS,iBAAAkB,OAAqB,wCAC9B,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QAMX,SAASC,IAA2B,CACzC,GAAM,CAAE,uBAAAC,CAAuB,EAAIC,GAAqB,EAElDC,EAAoBF,EAAuB,EAE3CG,EAAqBD,EAAkB,OAEvCE,EAAuB,CAAC,CAACF,EAAkB,KAC9CG,GACCA,EAAiB,MAAM,kBAAoBC,GAAc,OAC7D,EAEA,OAAOH,EACLI,GAAA,cAACC,GAAA,CAA4B,QAASJ,GACpCG,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,eAC5CN,CACH,CACF,EACE,IACN,CAnBgBO,EAAAX,GAAA,4BPcT,SAASY,GAAcC,EAA+B,CAC3D,GAAM,CACJ,eAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,OAAAC,EAAS,CAAC,EACV,UAAAC,CACF,EAAIL,EAEE,CACJ,OAAQ,CAAE,SAAAM,CAAS,CACrB,EAAIC,EAAY,EAEVC,EACJC,GAAgB,eAAgBH,CAAQ,GACxCF,EAAO,SAAS,eAAe,EAEjC,OACEM,GAAA,cAAAA,GAAA,cACG,CAACN,EAAO,SAAS,SAAS,GACzBM,GAAA,cAACC,GAAA,CACC,UAAWN,GAAaO,EAAa,EACrC,KAAK,MACL,QAASC,GAAK,EAAE,SAAS,GACzBH,GAAA,cAACI,GAAA,CAAc,QAASb,EAAgB,CAC1C,EAGD,CAACO,GACAE,GAAA,cAACK,GAAA,CACC,MAAM,MACN,YAAa,IACb,iBAAkB,CAAE,MAAO,GAAI,KAAM,EAAG,EACxC,UAAWH,EAAa,EACxB,QAASF,GAAA,cAACM,GAAA,IAAoB,GAC9BN,GAAA,cAAC,WACCA,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,eAAe,GAC/BH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,SACjCP,GAAA,cAACQ,GAAA,CAAkB,KAAM,GAAI,MAAM,QAAQ,EAC3CR,GAAA,cAACS,GAAA,IAAyB,CAC5B,CACF,CACF,CACF,EAED,CAACf,EAAO,SAAS,UAAU,GAC1BM,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,UAAU,GAC1BH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASd,GAClDO,GAAA,cAACU,GAAA,CAAa,KAAM,GAAI,MAAM,QAAQ,CACxC,CACF,EAED,CAAChB,EAAO,SAAS,SAAS,GACzBM,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,sBAAsB,GACtCH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASf,GAClDQ,GAAA,cAACW,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,EACzCX,GAAA,cAACY,GAAA,IAA2B,CAC9B,CACF,CAEJ,CAEJ,CAvEgBC,EAAAxB,GAAA,iBQpBhB,OAAS,QAAAyB,OAAY,eACrB,OAAS,WAAAC,GAAS,cAAAC,GAAY,eAAAC,OAAmB,gBACjD,OAAOC,OAAW,QCJlB,OAAS,UAAAC,GAAQ,UAAAC,OAAc,gBAExB,IAAMC,GAAgBD,GAAOD,GAAQ,CAC1C,SAAU,CACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CACF,CAAC,EDGM,SAASG,GAAaC,EAAkB,CAC7C,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIF,EAE1B,OACEG,GAAA,cAACC,GAAA,CACC,KAAMH,EACN,YAAW,GACX,QAASC,EACT,UAAWG,EAAa,GACxBF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,sBAAsB,EACpC,KAAK,QACL,YAAaA,GAAK,EAAE,+CAA+C,GACnEJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,QAAQ,WACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAAS,IAAM,SAAS,OAAO,GAC/BN,GAAA,cAACO,GAAA,CAAY,KAAM,GAAI,MAAM,UAAU,EACvCP,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACxCD,GAAK,EAAE,SAAS,CACnB,CACF,CACF,CAEJ,CA3BgBI,EAAAZ,GAAA,gBETT,SAASa,GAAuCC,EAAU,CAC/D,IAAMC,EAAiBD,EAAE,OAEzB,GAAIC,EAAgB,CAClB,IAAMC,EAAUD,EAAe,UACzBE,EAAYC,EAAa,EAE3BF,EAAU,EACZC,EAAU,UAAU,IAAI,cAAc,EAEtCA,EAAU,UAAU,OAAO,cAAc,CAE7C,CACF,CAbgBE,EAAAN,GAAA,0CCFhB,OAAS,OAAAO,GAAK,UAAAC,OAAc,gBAE5B,IAAMC,GAAgB,QAETC,GAAkBH,GAAI,CACjC,aAAc,WACd,QAAS,OACT,cAAe,SACf,SAAU,SACV,UAAW,wCACb,CAAC,EAEYI,GAAYH,GAAO,MAAO,CACrC,SAAU,WACV,MAAO,QACP,SAAU,QACV,SAAU,QACV,gBAAiB,cACjB,SAAU,CACR,OAAQ,CACN,KAAM,CACJ,OAAQ,OACR,UAAWC,EACb,EACA,MAAO,CACL,OAAQA,EACV,CACF,CACF,CACF,CAAC,EAEYG,GAAUJ,GAAO,MAAO,CACnC,SAAU,WACV,SAAU,SACV,SAAU,EACV,QAAS,OACT,cAAe,SACf,QAAS,EACT,UAAW,MACb,CAAC,EAEYK,GAASL,GAAO,MAAO,CAClC,QAAS,YACT,mBAAoB,CAClB,WAAY,KACd,EACA,kBAAmB,CACjB,QAAS,EACT,WAAY,yBACZ,eAAgB,CACd,QAAS,CACX,EACA,iBAAkB,CAChB,WAAY,QACd,CACF,CACF,CAAC,E1B7BD,SAASM,GAAOC,EAAqC,CACnD,GAAM,CAAE,sBAAAC,EAAuB,yBAAAC,CAAyB,EAAIC,GAAU,EAChE,CAAE,SAAAC,EAAU,OAAAC,EAAQ,OAAAC,EAAQ,OAAAC,EAAS,OAAQ,EAAIP,EACjD,CAAE,YAAAQ,CAAY,EAAIC,EAAY,EAC9B,CAACC,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EACxDC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxD,CACJ,OAAQ,CAAE,SAAAC,EAAU,MAAAC,CAAM,CAC5B,EAAIP,EAAY,EACV,CAAE,UAAAQ,CAAU,EAAIC,GAAW,EAE3BC,EAAeF,IAAc,OAC7B,CAAE,YAAAG,CAAY,EAAIC,GAASL,GAAS,CAAC,CAAC,EAEtCM,EAAwBC,GAC5B,sBACAR,CACF,EAEM,CACJ,YAAAS,EACA,oBAAAC,EACA,qBAAAC,EACA,wBAAAC,EACA,mBAAAC,CACF,EAAIV,GAAW,EACTW,EAAeC,GAAgB,EAC/B,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EAIzBC,EAH8BC,GAAgBH,CAAO,EAAE,IAC3D,CAAC,CAAE,KAAAI,CAAK,IAAMA,CAChB,EACoC,KAAMA,GAASA,EAAK,SAAW,SAAS,EAEtEC,EAAgBC,EAAA,IACpBT,EAAmBU,GAAW,WAAYL,CAAc,EADpC,iBAGhBM,EAAkBF,EAAA,IAAM,CAC5BhC,EAAO,WAAW,CACpB,EAFwB,mBAIlBmC,EACJ,OAAOnC,EAAO,cAAkB,KAAeA,EAAO,cAElDoC,EAAgBC,GAAuB,IAAI,EAC3CC,EAAeD,GAAuB,IAAI,EAEhD,OAAAE,GAAU,KACSC,GAAsB,GAGvBF,EAAa,SAC3B1C,EAAsB0C,EAAa,OAAO,EAGrC,IAAM,CACXzC,EAAyB,CAC3B,GACC,CAAC,CAAC,EAEL0C,GAAU,KACRH,EAAc,SAAS,iBACrB,SACAK,EACF,EACO,IAAM,CACXL,EAAc,SAAS,oBACrB,SACAK,EACF,CACF,GACC,CAAC,CAAC,EAELF,GAAU,IAAM,CACdjC,EAAoBH,IAAgB,QAAQ,CAC9C,EAAG,CAACA,CAAW,CAAC,EAGduC,GAAA,cAACC,GAAA,CACC,OAAQzC,EACR,GAAI0C,GAAa,YACjB,UAAW,GAAG7B,EAAY,CAAC,IAAI8B,GAAgB,CAAC,GAChD,IAAKP,GACLI,GAAA,cAACI,GAAA,CACC,OACEJ,GAAA,cAAAA,GAAA,cACGP,GACCO,GAAA,cAACK,GAAA,CACC,QAAS,IAAM,CACbvB,EAAa,EAEbxB,EAAO,QAAUA,EAAO,OAAO,CACjC,EACF,CAEJ,EAEF,MAAOA,EAAO,MACd,OACE0C,GAAA,cAAAA,GAAA,cACG1C,EAAO,OACPA,EAAO,UAAY,CAACiB,GACnByB,GAAA,cAACM,GAAA,CACC,UAAWC,EAAa,EACxB,QAASf,EACT,YAAa,CAAC,CAAC1B,GAAkB,OACnC,EAEDR,EAAO,UAAY0C,GAAA,cAACQ,GAAA,CAAa,QAASlD,EAAO,SAAU,CAC9D,EAEJ,EACA0C,GAAA,cAACS,GAAA,CAAQ,IAAKf,GAAgBrC,CAAS,EACvC2C,GAAA,cAACU,GAAA,CACC,KAAM/B,EACN,QAAS,IAAMC,EAAwB,EAAK,EAC5C,UAAWS,EACb,EAEAW,GAAA,cAACW,GAAA,KACCX,GAAA,cAAC,OAAI,UAAU,mBACZtB,GAAuB,CAACD,GACvBuB,GAAA,cAAC,OAAI,UAAU,iBACbA,GAAA,cAACY,GAAA,CAAiB,cAAevB,EAAe,EAChDW,GAAA,cAACa,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEDtD,CACH,EAEAyC,GAAA,cAACa,GAAA,CAAQ,KAAM,GAAI,EAEnBb,GAAA,cAAC,OACC,UAAW,gBACT5B,EAAe,aAAe,cAChC,IACA4B,GAAA,cAACc,GAAA,IAAW,CACd,CACF,EACAd,GAAA,cAACe,GAAA,CACC,KAAMpD,EACN,QAAS,IAAMC,EAAoB,EAAK,EAC1C,CACF,CAEJ,CAhJS0B,EAAAtC,GAAA,U2B3BT,OAAS,UAAAgE,OAAc,gBAEvB,IAAMC,GAAkB,kBAElBC,GAAiBF,GAAO,MAAO,CACnC,QAASC,GACT,UAAW,OACX,SAAU,CACZ,CAAC,ECRD,OAAS,UAAAE,OAAc,gBAEvB,IAAMC,GAAgBD,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,QAAS,iBACT,SAAU,EAEV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,SAAU,EACV,SAAU,QACZ,CACF,EACA,QAAS,CACP,KAAM,CACJ,QAAS,CACX,CACF,CACF,CACF,CAAC,ECnBD,OAAS,WAAAE,OAAe,gBACxB,OAAOC,OAAW,QCDlB,OAAS,QAAAC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,eAAAC,OAAmB,gBAC/C,OAAOC,OAAW,QCJlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAgBD,GAAO,MAAO,CACzC,aAAc,MACd,MAAO,MACP,OAAQ,MACR,gBAAiB,cACjB,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EAEKG,GAAOJ,GAAU,CACrB,KAAM,CACJ,UAAW,cACb,EACA,OAAQ,CACN,UAAW,gBACb,CACF,CAAC,EAEYK,GAAUJ,GAAO,MAAO,CACnC,SAAU,WACV,OAAQ,+BACR,UAAW,qBACX,aAAc,MACd,MAAO,MACP,OAAQ,MACR,UAAW,GAAGG,EAAI,sBAClB,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBL,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,ED/BM,SAASM,GAAaC,EAA0B,CACrD,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,MAAAC,CAAM,EAAIH,EAChC,OAAIC,IAAUG,GAAY,UAEtBC,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,mDACF,EACF,EAIAJ,EAEAE,GAAA,cAACC,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,mBAAmB,EACjC,YACEJ,GAASI,GAAK,EAAE,iDAAiD,EAErE,EAKFF,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOC,GAAK,EAAE,2BAA2B,EACzC,YAAaA,GAAK,EAAE,qCAAqC,EACzD,KACEF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAM,IAAKR,EAAO,KAAM,GAAI,CAC/B,EACAG,GAAA,cAACM,GAAA,IAAQ,CACX,EAEJ,CAEJ,CAzCgBC,EAAAb,GAAA,gBDFT,SAASc,GAAYC,EAAkB,CAC5C,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,GAAGC,CAAW,EAAIH,EAEzC,OACEI,GAAA,cAACC,GAAA,CACC,KAAMJ,EACN,QAASC,EACT,UACE,SAAS,eAAeI,GAAa,WAAW,GAAK,SAAS,MAEhEF,GAAA,cAACG,GAAA,CAAc,GAAGJ,EAAY,EAC9BC,GAAA,cAACI,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,CAEJ,CAdgBC,EAAAV,GAAA,e9BGhB,IAAMW,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,IACd,CAAC,EAEKC,GAAYD,GAAOE,GAAe,CACtC,UAAW,QACb,CAAC,EAEYC,GAAsB,IACtBC,GAAuB,IAE7B,SAASC,IAAc,CAC5B,GAAM,CAAE,OAAAC,EAAQ,YAAaC,CAAgB,EAAIC,EAAY,EACvD,CAACC,EAAWC,CAAY,EAAIC,GAAS,EAAK,EAC1C,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EAAE,EACvEG,EAAqD,KACnDC,EAAcC,GAAW,IAAI,YAAY,EAEzC,CAAE,KAAAC,EAAM,YAAAC,EAAa,MAAAC,EAAO,4BAAAC,CAA4B,EAC5DC,GAAc,CACZ,OAAAf,EACA,gBAAkBgB,GAAS,CACzBR,EAAe,WAAW,IAAM,CAC9BJ,EAAa,EAAI,EACjBG,EAAsBS,CAAI,CAC5B,EAAGlB,EAAoB,CACzB,EACA,UAAW,IAAM,CACXU,GACF,aAAaA,CAAY,EAE3B,WAAW,IAAM,CACfJ,EAAa,EAAK,CACpB,EAAGP,EAAmB,CACxB,CACF,CAAC,EAEGoB,EAAyBC,EAAA,IAAM,CACnCJ,EAA4B,EAC5BV,EAAa,EAAK,CACpB,EAH+B,0BAKzBe,EAAiBR,EAAK,KACzBS,GAAWA,EAAO,OAASd,CAC9B,EACMe,EAAsBF,GAAgB,OAAS,GAC/CG,EACJH,GAAgB,OAASI,GAAY,cAEvC,OACEC,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,iBAAiB,CACjC,GACAF,GAAA,cAAC7B,GAAA,KACC6B,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAU,MAAM,UAC9CD,GAAK,EAAE,6BAA6B,CACvC,EACAF,GAAA,cAAC/B,GAAA,KACEkB,EAAK,IAAI,CAACS,EAAQQ,IAAU,CAC3B,IAAMC,EAAM,UAAUD,CAAK,IAAIR,EAAO,IAAI,GAC1C,OACEI,GAAA,cAACM,GAAA,CACC,IAAKD,EACJ,GAAGT,EACJ,UAAWW,EAAa,EACxB,QAAUf,GAAS,CACZJ,EAAYI,CAAI,CACvB,EACA,UAAWf,IAAoB,UAC/B,SAAU,CAACQ,EACb,CAEJ,CAAC,EACDe,GAAA,cAACQ,GAAA,CACC,KAAM,CAAC,CAAC7B,EACR,QAASc,EACT,MAAOI,EACP,MAAOC,EACP,MAAOT,EACT,CACF,CACF,CACF,CAEJ,CA1EgBK,EAAAnB,GAAA,eiC7BhB,OAAS,aAAAkC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAgBD,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EAEKE,GAAgBH,GAAU,CAC9B,KAAM,CACJ,UAAW,cACb,EACA,OAAQ,CACN,UAAW,gBACb,CACF,CAAC,EAEYI,GAAUH,GAAO,MAAO,CACnC,SAAU,WACV,OAAQ,+BACR,UAAW,qBACX,aAAc,MACd,MAAO,MACP,OAAQ,MACR,UAAW,GAAGE,EAAa,sBAC3B,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBJ,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,EnCUD,IAAMK,GAAiC,EAChC,SAASC,GAAWC,EAAkB,CAC3C,GAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,aAAAC,EAAc,MAAAC,EAAO,WAAAC,CAAW,EAAIL,EACzD,CAAE,OAAAM,CAAO,EAAIC,EAAY,EACzBC,EAAcC,GAAW,IAAI,YAAY,EAEzCC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxD,CAAE,YAAAC,CAAY,EAAIL,EAAY,EAC9B,CAACM,EAAsBC,CAAuB,EAClDC,GAAqB,EAAE,EACnB,CAACC,EAAyBC,CAA0B,EACxDF,GAAwB,IAAI,EACxB,CAACG,EAA4BC,CAA6B,EAC9DJ,GAAS,EAAK,EACV,CAACK,EAA+BC,CAAgC,EACpEN,GAA0D,IAAI,EAC1D,CAAE,kBAAAO,CAAkB,EAAIC,GAAW,EACrCC,EAAqD,KACnD,CAAE,KAAAC,EAAM,MAAAC,EAAO,YAAAC,EAAa,4BAAAC,CAA4B,EAC5DC,GAAc,CACZ,OAAAvB,EACA,MAAAL,EACA,gBAAkB6B,GAAS,CACzBN,EAAe,WAAW,IAAM,CAC9BV,EAAwBgB,CAAI,CAC9B,EAAGC,EAAoB,CACzB,EACA,UAAW,IAAM,CACXP,GACF,aAAaA,CAAY,EAE3B,WAAW,IAAM,CACfV,EAAwB,EAAE,CAC5B,EAAGkB,EAAmB,CACxB,CACF,CAAC,EACG,CAACC,EAAYC,CAAa,EAAInB,GAAuBU,CAAI,EACzDU,EAA2BV,EAAK,OAChCW,EAAwBhC,GAAS+B,EAA2B/B,EAAQ,EAEpEiC,EAAuBC,EAAA,MAAOC,GAAmB,CACrDpB,EAA8B,EAAK,EACnCE,EAAiC,aAAa,EAC9C,GAAI,CACF,MAAMC,EAAkBiB,EAAO,WAAYA,EAAO,KAAK,EACvDlB,EAAiC,WAAW,CAC9C,MAAY,CACVA,EAAiC,UAAU,CAC7C,CACF,EAT6B,wBAW7BmB,GAAU,IAAM,CACdN,EAAeD,GAAe,CAC5B,IAAMQ,GAAsBhB,EAAK,UAAWc,IAC1CrC,EAAWqC,GAAO,KAAMtC,CAAK,CAC/B,EAEA,OAAImC,GAAyBK,GAAsB,EAC1C,CAAChB,EAAKgB,EAAmB,CAAC,EAAE,OACjChB,EAAK,OAAO,CAACiB,GAAGC,IAAUA,IAAUF,EAAmB,CACzD,EAEKR,EAAW,IACfW,IACCnB,EAAK,KAAMoB,GAAaA,EAAS,OAASD,GAAW,IAAI,GACzDA,EACJ,CACF,CAAC,CACH,EAAG,CAAC,KAAK,UAAUnB,CAAI,CAAC,CAAC,EAEzB,IAAMqB,EAAiB,SAAS,eAC9BC,GAAa,WACf,EAEAP,GAAU,IAAM,CACd,IAAIQ,EAAgD,KACpD,OACE5B,IAAkC,aAClCA,IAAkC,cAElC4B,EAAU,WACR,IAAM3B,EAAiC,IAAI,EAC3CW,EACF,GAGK,IAAM,CACPgB,GACF,aAAaA,CAAO,CAExB,CACF,EAAG,CAAC5B,CAA6B,CAAC,EAElC,IAAM6B,EAAyBX,EAAA,IAAM,CACnCV,EAA4B,EAC5Bd,EAAwB,EAAE,CAC5B,EAH+B,0BAK/B,OACEoC,GAAA,cAAAA,GAAA,cACGjB,EAAW,MAAM,EAAG7B,CAAK,EAAE,IAAKmC,GAAW,CAC1C,IAAMY,GAAUC,GAAW,CACzB,iBAAA1C,EACA,WAAY6B,EAAO,KACnB,MAAAtC,CACF,CAAC,EACKoD,GAAiBF,GACnBG,GAAkBH,GAASrD,EAA8B,EACzD,GAEEyD,EAAoBC,GAAoB5C,EAAY,EAAGX,CAAK,EAE5DwD,GAA4B,CAAC/C,EAAiB,KACjDgD,IACCA,GAAgB,aAAenB,EAAO,MACtCmB,GAAgB,QAAUzD,CAC9B,EAEM0D,EACJJ,GACAE,IACAlB,EAAO,QAAUqB,GAAY,UAEzBC,EAA6BF,EAC/BG,GAAK,EAAE,CACL,GAAI,oBACJ,OAAQ,CAAE,MAAA7D,CAAM,CAClB,CAAC,EACDoD,GAEEU,GAAUzB,EAAA,IAAM,CAChBC,EAAO,QAAUqB,GAAY,aAC1BjC,EAAYY,EAAO,IAAI,EACnBoB,GACT1C,EAA2B,CACzB,WAAYsB,EAAO,KACnB,MAAAtC,EACA,QAASkD,IAAW,EACtB,CAAC,EACDhC,EAA8B,EAAI,GAElChB,EAAa,CACX,WAAYoC,EAAO,KACnB,MAAAtC,EACA,QAASkD,IAAW,EACtB,CAAC,CAEL,EAjBgB,WAmBVa,EACJhD,GAAyB,MACrBiD,GACEjD,EAAwB,MACxBJ,EAAY,CACd,EACA,OACN,OACEsC,GAAA,cAACA,GAAM,SAAN,CAAe,IAAK,GAAGX,EAAO,KAAK,IAAIyB,CAAqB,IAC3Dd,GAAA,cAACgB,GAAA,CACC,KAAMrD,IAAyB0B,EAAO,KACtC,QAASU,EACT,MAAOV,EAAO,MACd,MAAOA,EAAO,MACd,MAAOb,EACT,EACC,CAAC,CAACV,GACDkC,GAAA,cAACiB,GAAA,CACC,KAAM,CAAC,CAACnD,GAA2BE,EACnC,UAAW4B,EACX,QAAS,IAAM,CACb7B,EAA2B,IAAI,CACjC,GACAiC,GAAA,cAACkB,GAAA,CACC,MAAON,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACD,KAAK,UACL,YAAaF,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,GACDd,GAAA,cAACmB,GAAA,CAAQ,KAAM,GAAI,EACnBnB,GAAA,cAACmB,GAAA,CAAQ,KAAM,GAAI,EACnBnB,GAAA,cAACoB,GAAA,CACC,QAASjC,EAAqB,KAC5B,KACArB,CACF,EACA,QAAQ,WACR,KAAK,UACL,UAAS,GACT,KAAK,SACJ8C,GAAK,EAAE,SAAS,CACnB,CACF,CACF,EAED1C,GACC8B,GAAA,cAACiB,GAAA,CACC,KAAM,CAAC,CAAC/C,EACR,QAASC,EAAiC,KAAK,KAAM,IAAI,EACzD,UAAWyB,GACV1B,IAAkC,eACjC8B,GAAA,cAACkB,GAAA,CACC,KAAK,UACL,MAAON,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACD,YAAaF,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACD,KACEd,GAAA,cAACqB,GAAA,KACCrB,GAAA,cAACsB,GAAA,KACCtB,GAAA,cAACuB,GAAA,CAAM,IAAKlC,EAAO,MAAO,KAAM,GAAI,CACtC,EACAW,GAAA,cAACwB,GAAA,IAAQ,CACX,EAEJ,EAGDtD,IAAkC,aACjC8B,GAAA,cAACkB,GAAA,CACC,KAAK,UACL,MAAON,GAAK,EAAE,CACZ,GAAI,sCACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACD,YAAaF,GAAK,EAAE,CAClB,GAAI,2EACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACH,EAGD5C,IAAkC,YACjC8B,GAAA,cAACkB,GAAA,CACC,KAAK,QACL,MAAON,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,CAClB,GAAI,uEACJ,OAAQ,CAAE,sBAAAE,CAAsB,CAClC,CAAC,EACH,EAGFd,GAAA,cAACmB,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,EAEFnB,GAAA,cAACyB,GAAA,CACC,IAAKpC,EAAO,KACZ,YAAasB,EACb,QAASE,GACT,SAAU7D,EAAWqC,EAAO,KAAMtC,CAAK,EACvC,SAAU,CAACO,EACV,GAAG+B,EACN,CACF,CAEJ,CAAC,EACAH,GACCc,GAAA,cAAC0B,GAAA,CAAgB,SAAU,GAAO,QAASvE,GACzC6C,GAAA,cAAC2B,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9Bf,GAAK,EAAE,mBAAmB,EAC3BZ,GAAA,cAAC2B,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,YAAW,QACjD1C,GAA4B/B,GAAS,EAC/C,CACF,CACF,CAEJ,CAEJ,CAnRgBkC,EAAAvC,GAAA,cNIhB,IAAM+E,GAA+B,EAE9B,SAASC,GAAoBC,EAAkB,CAEpD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,SAAAC,EAAU,eAAAC,EAAgB,QAAAC,CAAQ,EAAIL,EACvDM,EAASC,EAAY,EAAE,OAEvBC,EAAcD,EAAY,EAAE,YAAY,EACxC,CACJ,cAAAE,EACA,mBAAoBC,EACpB,sBAAuBC,EACvB,wBAAyBC,EACzB,kBAAAC,EACA,qBAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,EAAgB,EAEtD,CAACC,EAAmBC,CAAoB,EAAIC,GAAS,EAAE,EACvD,CAACC,EAAiBC,CAAkB,EAAIF,GAAmB,CAAC,CAAC,EAC7D,CAACG,EAAOC,CAAQ,EAAIJ,GAAS,EAAE,EAC/B,CAACK,EAAcC,CAAe,EAAIN,GAEtC,IAAI,EACA,CAACO,EAAuBC,CAAwB,EAAIR,GACxD,CAAC,CAACR,CACJ,EAEMiB,EAAkBC,GAAmBtB,GAAe,OAAS,IAAI,EAEjEuB,EAAuBxB,EAAY,KACtCyB,GACCA,EAAW,OACXxB,GAAe,MAAMA,GAAe,MAAM,OAAS,CAAC,EAAE,GAAG,UAC7D,EACMyB,EAAsBC,EAACF,GAC3B,CAAC,CAACxB,GAAe,MAAM,KAAM2B,GAASA,EAAK,KAAK,aAAeH,CAAU,EAD/C,uBAGtBI,EAA8BF,EAAA,IAClCnB,EAAiB,OAAQsB,GAErBA,EAAgB,UAChBR,EAAgB,SAASQ,EAAgB,KAAK,CAEjD,EANiC,+BAQ9B,CAACC,EAAmBC,CAAoB,EAAInB,GAChDgB,EAA4B,CAC9B,EACMI,GAA2BjC,EAAY,KAC1CkC,GAAUA,EAAM,OAASV,GAAsB,IAClD,EAEMW,GAAiCrB,EAAgB,OAAS,EAE1DsB,EAAaT,EAAA,CAACU,EAAoBH,IACtC,CAAC,CAACH,EAAkB,KACjBO,GACCA,EAAiB,aAAeD,GAChCC,EAAiB,QAAUJ,GAC3BI,EAAiB,WAChBZ,EAAoBQ,CAAK,GACvB,CAACR,EAAoBQ,CAAK,GAAK,CAAC7B,EACvC,EARiB,cAUbkC,GACJ,CAAC,CAAClC,GACFe,GACAa,IACA,CAACO,GAAeP,GAA0B5B,CAAiB,EAEvDoC,EAAyBd,EAAA,IAAM,CACnCN,EAAyB,EAAK,EAC9Bf,EAAqB,IAAI,EACzB0B,EAAsBD,GAAsB,CAC1C,IAAIW,EAAoB,GACxB,OAAOX,EAAkB,IAAKO,GAE1B,CAACI,GACDJ,EAAiB,QAAUd,GAAsB,MAEjDkB,EAAoB,GACb,CACL,GAAGJ,EACH,SAAU,EACZ,GAEKA,CACR,CACH,CAAC,CACH,EAnB+B,0BAqBzBK,EAAWhB,EAACiB,GAAmB,CAKnC,GAJIjC,GACFC,EAAqB,EAAE,EAERwB,EAAWQ,EAAO,WAAYA,EAAO,KAAK,EAEzD,OAEF,IAAMd,EAAkBtB,EAAiB,KACtCsB,IACCA,GAAgB,aAAec,EAAO,YACtCd,GAAgB,QAAUc,EAAO,KACrC,EAEKd,IAILnC,EAAS,EACLiD,EAAO,QAAUpB,GAAsB,MAAQJ,IACjDC,EAAyB,EAAK,EAC9Bf,EAAqB,IAAI,GAE3B0B,EAAsBD,IACpBA,GACG,OAAQO,IAAqBA,GAAiB,QAAUM,EAAO,KAAK,EACpE,OAAO,CAAE,GAAGd,EAAiB,SAAU,EAAK,CAAC,CAClD,EACF,EA5BiB,YA8BXe,GAAmBlB,EAAA,IAAM,CAC7B,IAAMmB,EAAsBf,EAAkB,OAC3Ca,GAAWA,EAAO,QACrB,EACAnC,EAAcqC,CAAmB,EACjC5C,EAAmB4C,CAAmB,EACtC1C,EAAwB,EAAI,EAC5BV,EAAQ,CACV,EARyB,oBAUnBqD,EAAmBpB,EAAA,SAAY,CACnCZ,EAAmB,CAAC,CAAC,EACrBE,EAAS,EAAE,EACXE,EAAgB,IAAI,EACpB,IAAM6B,EAAkBxC,EAAiB,OAAQsB,IAC/CC,EAAkB,KACfO,IACCA,GAAiB,QAAUR,GAAgB,OAC3CQ,GAAiB,aAAeR,GAAgB,UACpD,CACF,EACMmB,EAAS,MAAMrD,IAAiB,CACpC,gBAAAoD,EACA,kBAAA3C,CACF,CAAC,EACK6C,EAAWD,EAAO,SACpBC,GAAU,SAAS,UACrBnC,EAAmBmC,EAAS,QAAQ,QAAQ,EAE1CA,GAAU,aACZ/B,EAAgB+B,EAAS,WAAW,EAElCD,EAAO,OACThC,EAASkC,GAAqBF,EAAO,KAAK,CAAC,EAGzC,CAACA,EAAO,OAAU,CAACC,GAAU,SAAS,SAAS,OACjDL,GAAiB,EAEjB9B,EAAmBmC,GAAU,SAAS,UAAY,CAAC,CAAC,CAExD,EA/ByB,oBAiCzBE,GAAU,IAAM,CACdpB,EAAsBD,GACpBA,EAAkB,OAChBvB,EAAiB,OAAQsB,GAOrB,CANwB,CAAC,CAACC,EAAkB,KAC3CO,IACCA,GAAiB,QAAUR,EAAgB,KAC/C,GAIEA,EAAgB,UAChBR,EAAgB,SAASQ,EAAgB,KAAK,CAEjD,CACH,CACF,CACF,EAAG,CAACtB,EAAiB,MAAM,CAAC,EAE5B,IAAM6C,GAAiB,SAAS,eAC9BC,GAAa,WACf,EAEMC,GAAWC,GAAY,EAE7B,OACEC,EAAA,cAACC,GAAA,CACC,KAAMjE,EACN,QAAS,IAAM,CACRU,GAEHoD,GADa,MACE,CAAE,QAAS,EAAK,CAAC,EAElC7D,EAAQ,CACV,EACA,YAAa,CAACiB,EACd,UAAW0C,GACV,GAAI,CAAC1C,GAAqB,CACzB,OACE8C,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CACC,QAAS/D,EACT,SAAUgE,GACRhE,EACAuB,EACAf,EACAJ,EACA8B,EACAP,CACF,EACA,QAASuB,EACT,QAAQ,YACR,KAAK,UACL,UAAS,GACT,KAAK,SACJe,GAAK,EAAE,SAAS,CACnB,CACF,CAEJ,EACC,GAAInD,GAAqB,CACxB,OAAQ,CAAE,UAAW,CAAE,QAAS,IAAK,CAAE,EACvC,OACE8C,EAAA,cAACM,GAAA,KACCN,EAAA,cAACO,GAAA,CACC,QAAQ,QACR,QAASpD,EAAqB,KAAK,KAAM,EAAE,GAC3C6C,EAAA,cAACQ,GAAA,CAAgB,KAAM,GAAI,CAC7B,EACAR,EAAA,cAACS,GAAA,CAAW,QAAQ,WAAW,KAAK,SACjCJ,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CACN,eAAgBK,GACdxD,EACAX,CACF,CACF,CACF,CAAC,CACH,CACF,CAEJ,EACA,OAAO,UACPyD,EAAA,cAACC,GAAA,CACC,KAAMvB,GACN,QAASpB,EAAmB,KAAK,KAAM,CAAC,CAAC,EACzC,UAAWsC,IACXI,EAAA,cAACW,GAAA,CACC,MAAON,GAAK,EAAE,8BAA8B,EAC5C,KAAK,QACL,YAAaL,EAAA,cAACY,GAAA,CAAc,SAAUvD,GAAmB,CAAC,EAAG,GAC7D2C,EAAA,cAACG,GAAA,CACC,QAAQ,WACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASf,IACRiB,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,EACCnD,GACC8C,EAAA,cAACa,GAAA,KACCb,EAAA,cAAC,OAAI,UAAWc,GAAkB,GAChCd,EAAA,cAACe,GAAA,CACC,MAAO7D,EACP,WAAYyB,EACZ,aAAcO,EACd,WAAY/B,EAAqB,KAAK,KAAMD,CAAiB,EAC/D,CACF,CACF,EAED,CAACA,GACA8C,EAAA,cAAAA,EAAA,cACGzC,GACCyC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgB,GAAA,CAAM,QAAQ,QAAQ,KAAK,QAAQ,MAAOX,GAAK,EAAE9C,CAAK,EAAG,EAC1DyC,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEDxD,GACCuC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgB,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MAAOE,GAA6BzD,CAAY,EAClD,EACAuC,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFjB,EAAA,cAACmB,GAAA,KACEtD,EAAgB,IAAI,CAACuD,EAAgBC,IAAU,CAC9C,IAAMrD,EAAazB,EAAY,KAC5ByB,IAAeA,GAAW,OAASoD,CACtC,EAEME,GAAM,UAAUD,CAAK,GACrBE,GAAeF,IAAUxD,EAAgB,OAAS,EAExD,OACEmC,EAAA,cAAC,OAAI,IAAKsB,IACRtB,EAAA,cAACwB,GAAA,KACCxB,EAAA,cAACS,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BJ,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CAAE,eAAgBrC,GAAY,SAAU,CAClD,CAAC,CACH,EACAgC,EAAA,cAACS,GAAA,CACC,QAAQ,QACR,MAAM,cACN,KAAK,UACJJ,GAAK,EAAE,CACN,GAAI,iDACJ,OAAQ,CAAE,eAAgBrC,GAAY,SAAU,CAClD,CAAC,CACH,CACF,EACAgC,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,EACnBjB,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAACe,GAAA,CACC,MAAOK,EACP,WAAYzC,EACZ,aAAcO,EACd,MAAOrD,GACP,WAAY,IACVsB,EAAqBa,GAAY,MAAQ,EAAE,EAE/C,CACF,EACC,CAACuD,IAAgBvB,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,EACpCM,IAAgBlF,GAAQ,mBACvB2D,EAAA,cAAC0B,GAAA,KACC1B,EAAA,cAAC2B,GAAA,CACC,aAAeC,IAAY,CACpBA,GAIA3D,EACCF,GAAsB,MAAQ,EAChC,GAEAQ,EAAsBD,IACpBA,GAAkB,IAAKO,IAEnBA,GAAiB,QACjBd,GAAsB,KAEf,CACL,GAAGc,GACH,SAAU,EACZ,EAEKA,EACR,CACH,EApBFG,EAAuB,CAuB3B,EACA,YAAW,GACX,KAAMrB,EACN,cAAc,MACd,QACEqC,EAAA,cAAC6B,GAAA,KACC7B,EAAA,cAAC,OAAI,UAAU,mBACbA,EAAA,cAAC8B,GAAA,CAAW,KAAM,GAAI,MAAM,OAAO,EACnC9B,EAAA,cAACiB,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCjB,EAAA,cAACS,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BJ,GAAK,EAAE,6BAA6B,CACvC,CACF,EACAL,EAAA,cAAC+B,GAAA,CACC,YACEpE,EAAwB,KAAO,QAEjCqC,EAAA,cAACgC,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,CACF,EAEF,eAAgB,IACdpE,EAA0BqE,IAAS,CAACA,EAAI,GAE1CjC,EAAA,cAACiB,GAAA,CAAQ,KAAM,EAAG,EAClBjB,EAAA,cAACkC,GAAA,CACC,UAAS,GACT,YAAa7B,GAAK,EAAE,0BAA0B,EAC9C,MAAOzD,GAAqB,GAC5B,SAAWuF,IAAM,CACf,IAAMC,GAAQD,GAAE,OAAO,MAClBC,GAAM,OAITvF,EAAqBuF,GAAM,OAASA,GAAQ,IAAI,GAHhDxE,EAAyB,EAAK,EAC9Bf,EAAqB,IAAI,EAI7B,EACF,CACF,EAECiC,IACCkB,EAAA,cAAC,OAAI,UAAWqC,GAAa,GAC3BrC,EAAA,cAACgB,GAAA,CACC,QAAQ,QACR,KAAK,QACL,MAAOX,GAAK,EAAE,CACZ,OAAQ,CAAE,YAAazD,CAAkB,EACzC,GAAI,qEACN,CAAC,EACH,CACF,CAEJ,CAEJ,CAEJ,CAAC,CACH,CACF,CAEJ,CAEJ,CA3agBsB,EAAApC,GAAA,uB0ChDhB,OAAS,QAAAwG,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,GAAQ,YAAAC,OAAgB,gBACxC,OAAOC,OAAW,QCFlB,OACE,SAAAC,GACA,UAAAC,GACA,WAAAC,GACA,eAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,QAAAC,OAAY,eASrB,IAAMC,GAA4B,GAC5BC,GAA2B,GAE1B,SAASC,GACdC,EACAC,EACAC,EACAC,EACM,CACN,OAAIH,GAAO,OAAS,EACX,CACL,MAAO,CACL,KAAM,UACN,KAAMI,GAAc,EAAE,mBACtB,OAAQ,CACN,QAASD,EACT,MAAOE,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAa,EACf,EACSJ,EAAyB,OAC3B,CACL,MAAO,CACL,KAAM,UACN,KAAMG,GAAc,EAAE,sBAAsB,MAC5C,OAAQ,CACN,QAAS,IAAMF,EAA0B,EAAI,EAC7C,MAAOG,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAaD,GAAc,EAAE,sBAAsB,WACrD,EAEAJ,GAAO,OAAS,GAChBA,EAAM,iBAEC,CACL,MAAO,CACL,KAAM,QACN,KAAMA,EAAM,iBACZ,OAAQ,IACV,EACA,YAAa,EACf,EAEK,CACL,MAAO,KACP,YAAaI,GAAc,EAAE,cAAc,WAC7C,CACF,CA/CgBE,EAAAP,GAAA,YAiDT,IAAKQ,QACVA,IAAA,MAAQV,IAAR,QACAU,IAAA,MAAQT,IAAR,QAFUS,QAAA,IAKAC,QACVA,EAAA,MAAQ,QACRA,EAAA,MAAQ,SAFEA,QAAA,ICpEZ,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,WAAY,QACd,CAAC,EAEYE,GAAmBF,GAAO,MAAO,CAC5C,SAAU,CACR,KAAM,CACJ,MAAO,CAAC,EACR,MAAO,CACL,SAAU,OACZ,CACF,CACF,CACF,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,SAAU,CACR,KAAM,CACJ,MAAO,CACL,MAAO,MACT,EACA,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAEYI,GAAaJ,GAAO,MAAO,CACtC,QAAS,OACX,CAAC,EFLM,SAASK,GAASC,EAAkB,CACzC,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAO,OAAQ,EAAIH,EACnCI,EAA2BC,EAAY,EAAE,4BAA4B,EACrEC,EAA4BD,EAAY,EAAE,0BAE1CE,EAAWF,EAAY,EAAE,SAAS,EAClCG,EAAOC,GACXP,EACAE,EACA,IAAME,EAA0BC,EAAU,EAAI,EAC9CN,CACF,EAEA,OACES,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAY,KAAMC,GAAgBV,CAAI,EAAG,MAAM,OAAO,EACvDO,GAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAMC,GAAiBb,CAAI,GACpDc,GAAc,EAAE,cAAc,KACjC,EACCd,IAAS,SAAWO,GAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EACtC,CAAC,CAACN,EAAK,aACNE,GAAA,cAACQ,GAAA,CAAiB,KAAMf,GACtBO,GAAA,cAACK,GAAA,CACC,QAAQ,OACR,KAAK,QACL,MAAM,SACN,MAAM,cACLP,EAAK,WACR,CACF,EAEFE,GAAA,cAACI,GAAA,CAAQ,KAAMX,IAAS,QAAU,KAAO,IAAK,EAC7C,CAAC,CAACK,EAAK,OACNE,GAAA,cAACS,GAAA,CAAO,KAAMhB,GACZO,GAAA,cAACU,GAAA,CACC,KAAMZ,EAAK,MAAM,KACjB,MAAOA,EAAK,MAAM,KAClB,WAAY,OACZ,OACEA,EAAK,MAAM,QACTE,GAAA,cAACW,GAAA,CACC,KAAK,SACL,KAAMb,EAAK,MAAM,KACjB,OACEE,GAAA,cAACY,GAAA,KACCZ,GAAA,cAACa,GAAA,CAAY,KAAM,EAAG,CACxB,EAEF,QAASf,EAAK,MAAM,OAAO,SAC1BA,EAAK,MAAM,OAAO,KACrB,EAGJ,QAAQ,QACV,CACF,CAEJ,CAEJ,CA5DgBgB,EAAAzB,GAAA,YGzBhB,OAAS,QAAA0B,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAASD,GAAO,MAAO,CAClC,MAAO,MACT,CAAC,EAEYE,GAAOF,GAAO,MAAO,CAChC,QAAS,OACT,cAAe,SACf,WAAY,aACZ,IAAK,KACL,MAAO,MACT,CAAC,EAEYG,GAAOH,GAAO,MAAO,CAChC,QAAS,OACT,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,MAAO,OACP,UAAW,CACT,QAAS,qBACT,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYK,GAASJ,GAAO,MAAO,CAClC,QAAS,KACT,UAAW,aACX,OAAQ,SACV,CAAC,ED1BM,SAASK,GAAqBC,EAAyB,CAC5D,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,WAAAC,CAAW,EAAIH,EAErC,OACEI,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,UAAU,UACjDL,CACH,EACAG,GAAA,cAACE,GAAA,CACC,KAAK,QACL,QAAQ,QACR,MAAOH,GAAc,cACpB,GAAGA,EAAa,IAAM,GAAG,GAAGD,CAAK,EACpC,CACF,CAEJ,CAhBgBK,EAAAR,GAAA,wBD6BT,SAASS,GAA0BC,EAAc,CACtD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,EAAS,qBAAAC,CAAqB,EAAIL,EAC9DM,EAAOF,EAAQ,eAAiB,OAAS,QAAU,UAEnDG,EAAoB,CACxB,CACE,MAAOC,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLL,EAAQ,cACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLL,EAAQ,SACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,WAAW,EACzB,MAAOC,EACLL,EAAQ,eACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,cAAc,EAC5B,MAAOC,EACLL,EAAQ,YACR,EACA,CACF,EACA,WAAY,GAAGE,CAAI,KACrB,CACF,EAEA,OACEI,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQF,GAAA,cAACG,GAAA,IAAY,EACrB,UAAS,GACT,SAAUR,EACV,QAASF,GACRW,GAAc,EAAE,mBAAmB,cACtC,EAEF,KAAMb,EACN,QAASC,EACT,UAAWa,EAAa,GACxBL,GAAA,cAACM,GAAA,CACC,KAAMV,EACN,MAAOQ,GAAc,EAAE,mBAAmB,YAC1C,YAAaA,GAAc,EAAE,mBAAmB,YAClD,EAEAJ,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAQ,KAAK,IAAI,EAClBR,GAAA,cAACS,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BX,GAAK,EAAE,SAAS,CACnB,EACAE,GAAA,cAACO,GAAA,KACEV,EAAkB,IAAI,CAACa,EAAMC,IAErBX,GAAA,cAACY,GAAA,CAAqB,IADjBD,EAC4B,GAAGD,EAAM,CAClD,CACH,CACF,CACF,CAEJ,CA5EgBG,EAAAxB,GAAA,6BG9BhB,OAAS,QAAAyB,OAAY,eAYd,SAASC,GACdC,EACAC,EACkB,CAClB,IAAMC,EAAuB,CAC3B,UAAW,UACX,MAAO,GACP,OAAQ,IACV,EACA,OAAID,GACFC,EAAU,UAAY,QAClBD,EAAM,OAAS,IACjBC,EAAU,MAAQD,EAAM,gBAGtBA,EAAM,OAAS,IACjBC,EAAU,MAAQC,GAAK,EAAE,CACvB,GAAI,kFACJ,OAAQ,CACN,oBAAqBF,EAAM,mBAC7B,CACF,CAAC,EACDC,EAAU,OAAS,mBAGdA,GAELF,GACEA,EAAQ,OAAS,IACEI,GAAoBJ,EAAQ,WAAW,IACvC,SACnBE,EAAU,UAAY,SAExBA,EAAU,OAAS,YACnBA,EAAU,MAAQG,GAAc,EAAE,mBAAmB,OAEnDL,EAAQ,OAAS,IACnBE,EAAU,MAAQG,GAAc,EAAE,kBAAkB,OAElDL,EAAQ,OAAS,IACnBE,EAAU,MAAQC,GAAK,EAAE,CACvB,GAAI,0FACJ,OAAQ,CACN,oBAAqBH,EAAQ,mBAC/B,CACF,CAAC,EACDE,EAAU,OAAS,mBAEjBF,EAAQ,OAAS,IACnBE,EAAU,MAAQC,GAAK,EAAE,iCAAiC,EAC1DD,EAAU,OAAS,mBAEdA,GAEF,IACT,CAvDgBI,EAAAP,GAAA,cCbhB,OAAS,QAAAQ,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,GAAY,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAgBrB,SAASC,GAAqBC,EAAmB,CACtD,GAAM,CAAE,eAAAC,EAAgB,SAAAC,CAAS,EAAIC,EAAY,EAC3C,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,EAAS,qBAAAC,CAAqB,EAAIR,EAC9DS,EAAWC,GAAY,EACvBC,EAAeV,GAAkBC,EAEvC,OACEU,GAAA,cAACC,GAAA,CACC,OAAO,SACP,KAAMT,EACN,OACEQ,GAAA,cAACE,GAAA,CACC,KAAK,QACL,QAAQ,QACR,QAAS,IAAML,EAAS,MAAQM,EAAiB,QAAQ,GACzDH,GAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,eAC7CC,GAAK,EAAE,iBAAiB,CAC3B,CACF,EAEF,UAAWC,EAAa,EACxB,QAASb,GACTO,GAAA,cAACO,GAAA,CACC,KAAK,UACL,MACEZ,EAAQ,OAAS,EACbU,GAAK,EAAE,eAAe,EACtBA,GAAK,EAAE,cAAc,EAE3B,YACEV,EAAQ,OAAS,EACbU,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CAAE,aAAAN,CAAa,CACzB,CAAC,EACDM,GAAK,EAAE,CACL,GAAI,0FACJ,OAAQ,CACN,oBAAqBV,EAAQ,mBAC/B,CACF,CAAC,GAEPK,GAAA,cAACQ,GAAA,CAAQ,KAAM,GAAI,EACnBR,GAAA,cAACQ,GAAA,CAAQ,KAAM,GAAI,EACnBR,GAAA,cAACE,GAAA,CACC,KAAK,QACL,KAAK,UACL,QAAQ,YACR,UAAS,GACT,SAAUN,EACV,QAASF,GACRW,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,CAEJ,CAxDgBI,EAAAtB,GAAA,wBCtBhB,OAAS,UAAAuB,GAAQ,cAAAC,GAAY,eAAAC,OAAmB,gBAChD,OAAOC,OAAW,QAcX,SAASC,GAAyBC,EAAc,CACrD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,qBAAAC,CAAqB,EAAIJ,EAC3D,OACEK,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQF,GAAA,cAACG,GAAA,IAAY,EACrB,UAAS,GACT,SAAUJ,EACV,QAASD,GACRM,GAAc,EAAE,kBAAkB,cACrC,EAEF,KAAMR,EACN,QAASC,EACT,UAAWQ,EAAa,GACxBL,GAAA,cAACM,GAAA,CACC,KAAK,UACL,MAAOF,GAAc,EAAE,kBAAkB,YACzC,YAAaA,GAAc,EAAE,kBAAkB,YACjD,CACF,CAEJ,CAzBgBG,EAAAb,GAAA,4BTFT,SAASc,GAAuBC,EAAkB,CACvD,GAAM,CACJ,QAAAC,EACA,MAAAC,EACA,oBAAAC,EACA,iBAAAC,EACA,qBAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,iBAAAC,CACF,EAAIV,EAEEW,EAAuB,CAC3B,qBAAAN,EACA,KAAMD,EACN,QAASI,EACT,UAAWC,CACb,EAEMG,EACJV,GAAO,OAAS,GAChBA,GAAO,OAAS,EAEZW,EAAYC,GAChBb,EACAC,GAAO,OAAS,GACdA,GAAO,OAAS,EACdA,EACA,IACN,EACA,OAAIW,GAAa,CAACV,IAChBU,EAAU,OAAS,MAMnBE,GAAA,cAAAA,GAAA,cACGH,GAAuBG,GAAA,cAACC,GAAA,CAAS,MAAOd,EAAO,MAAOI,EAAc,EAJtD,CAAC,CAACO,GAOfE,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,MAAOL,EAAU,MACjB,KAAMA,EAAU,UAChB,QAAQ,QACP,GAAIA,EAAU,SAAW,aAAe,CACvC,OACEE,GAAA,cAACI,GAAA,CAAO,QAASZ,GACfQ,GAAA,cAACK,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,CAEJ,EACC,GAAIP,EAAU,SAAW,mBAAqB,CAC7C,OACEE,GAAA,cAACM,GAAA,CACC,KAAK,UACL,KAAMR,EAAU,UAChB,QAASH,GACRY,GAAK,EAAE,QAAQ,CAClB,CAEJ,EACF,CACF,EAGDrB,GACCc,GAAA,cAAAA,GAAA,cACGd,EAAQ,OAAS,GAChBc,GAAA,cAACQ,GAAA,CACE,GAAGZ,EACJ,QAASV,EACX,GAGAA,EAAQ,OAAS,GACjBA,EAAQ,OAAS,IACjBc,GAAA,cAACS,GAAA,CAAsB,GAAGb,EAAsB,QAASV,EAAS,EAGnEA,EAAQ,OAAS,GAChBc,GAAA,cAACU,GAAA,CACE,GAAGd,EACJ,QAASV,EACX,CAEJ,CAEJ,CAEJ,CA7FgByB,EAAA3B,GAAA,0BUbhB,OAAO4B,OAAe,eACtB,OAAOC,OAAW,QCClB,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,WAAAC,GACA,qBAAAC,GACA,YAAAC,GACA,YAAAC,GACA,eAAAC,GACA,eAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAe,eACtB,OAAOC,GAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCjBxC,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAiBD,GAAO,MAAO,CAC1C,MAAO,OACP,4BAA6B,CAC3B,WAAY,KACd,CACF,CAAC,EACYE,GAAkBF,GAAO,MAAO,CAC3C,cAAe,MACf,SAAU,CACR,MAAO,CACL,KAAM,CACJ,cAAe,CACjB,CACF,CACF,CACF,CAAC,EAEYG,GAAcH,GAAO,MAAO,CACvC,MAAO,OACP,QAAS,MACX,CAAC,ECtBD,UAAYI,OAAiB,8BAC7B,OACE,UAAAC,GACA,OAAAC,GACA,aAAAC,GACA,SAAAC,GACA,UAAAC,GACA,cAAAC,OACK,gBAIA,IAAMC,GAAuC,IAEvCC,GAAiBC,GAAmB,QAAM,CACrD,QAAS,OACT,cAAe,SACf,WAAY,QACZ,UAAW,OACX,UAAW,SACX,MAAO,OACP,aAAc,MACd,SAAU,CACR,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,CACF,CACF,CACF,CAAC,EAEYC,GAAqBC,GAAI,CACpC,QAAS,SACX,CAAC,EACYC,GAAkBJ,GAAOK,GAAQ,CAC5C,gBAAiB,cACjB,OAAQ,sBACV,CAAC,EACYC,GAAmBN,GAAO,MAAO,CAC5C,aAAc,MACd,QAAS,OACT,cAAe,SACf,WAAY,QACZ,eAAgB,gBAChB,MAAO,cACP,UAAW,aACX,SAAU,WACV,SAAU,CACR,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,MAAO,CAAE,KAAM,CAAE,qBAAsB,IAAK,oBAAqB,GAAI,CAAE,EACvE,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,UAAW,CACT,qBAAsB,CACpB,WAAY,CACV,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,OAAQ,SACV,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,sBACX,CACF,EACA,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,UACjB,UAAW,CACT,gBAAiB,SACnB,CACF,CACF,EACA,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,OAAQ,UACR,UAAW,CACT,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,CACF,CACF,CACF,CACF,CAAC,EAEYM,GAAgBJ,GAAI,CAC/B,MAAO,OACP,QAAS,iBACX,CAAC,EAEYK,GAAsBL,GAAI,CACrC,QAAS,OACT,cAAe,MACf,eAAgB,gBAChB,WAAY,SACZ,cAAe,MACf,SAAU,UACZ,CAAC,EAEYM,GAAYN,GAAI,CAC3B,QAAS,OACT,cAAe,MACf,eAAgB,SAChB,WAAY,SACZ,mBAAoB,CAClB,WAAY,KACd,CACF,CAAC,EACYO,GAAkBP,GAAI,CACjC,QAAS,OACT,WAAY,SACZ,aAAc,CACZ,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYU,GAAUX,GAAmB,WAAS,CACjD,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,OAAQ,MACR,QAAS,UACT,UAAW,aACX,OAAQ,UACR,OAAQ,OACR,QAAS,OACT,gBAAiB,cACjB,SAAU,CACR,MAAO,CACL,KAAM,CACJ,CAAC,KAAKY,EAAK,EAAE,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,EACA,MAAO,CACL,CAAC,KAAKA,EAAK,EAAE,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,CACF,EACA,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIX,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,kBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,CACF,CACF,EACA,uBAAwB,CACtB,QAAS,MACX,EACA,MAAO,CACL,uBAAwB,CACtB,QAAS,OACX,CACF,CACF,CAAC,EAEYY,GAAiBb,GAAO,MAAO,CAC1C,MAAO,OACP,OAAQ,OACR,aAAc,OACd,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,0BACR,IAAK,CACH,aAAc,MAChB,EACA,SAAU,CACR,MAAO,CACL,MAAO,CACL,YAAa,WACf,EACA,QAAS,CAAE,YAAa,aAAc,CACxC,CACF,CACF,CAAC,EAEYc,GAAUd,GAAOe,GAAoB,CAChD,MAAO,OACP,WAAY,SACd,CAAC,EAEYC,GAAgBhB,GAAO,MAAO,CACzC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,KACT,WAAY,OAAOF,EAAoC,UACvD,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYmB,GAAYjB,GAAO,MAAO,CACrC,OAAQ,MACR,WAAY,MACZ,YAAa,MACb,WAAY,uBACd,CAAC,EAEYkB,GAAsBlB,GAAO,MAAO,CAC/C,QAAS,OACT,eAAgB,SAChB,OAAQ,QACR,UAAW,YACX,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,SACf,CAAC,EAEYkB,GAAYnB,GAAO,MAAO,CACrC,MAAO,MACP,OAAQ,MACR,eAAgB,SAChB,WAAY,SACZ,QAAS,MACX,CAAC,EAEYoB,GAAkBpB,GAAOqB,GAAY,CAChD,SAAU,SACV,aAAc,WACd,cAAe,EACjB,CAAC,EAEYC,GAAsBtB,GAAO,MAAO,CAC/C,QAAS,OACT,SAAU,MACZ,CAAC,EAEYuB,GAAWvB,GAAO,MAAO,CACpC,MAAO,OACP,OAAQ,OACR,aAAc,OACd,gBAAiB,cACjB,OAAQ,UACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,0BACR,SAAU,CACR,MAAO,CACL,MAAO,CACL,YAAa,WACf,EACA,QAAS,CAAE,YAAa,aAAc,CACxC,CACF,CACF,CAAC,EAEYwB,GAAexB,GAAO,MAAO,CACxC,QAAS,MACX,CAAC,EAEYyB,GAAOzB,GAAO,MAAO,CAChC,MAAO,OACP,eAAgB,MAChB,eAAgB,QAChB,eAAgB,WAChB,OAAQ,OACR,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,eAAgB,aAClB,CACF,CAAC,ECvXD,OAAS,QAAAyB,OAAY,eACrB,OACE,mBAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,YAAAC,OAAgB,QCdhC,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAaD,GAAO,MAAO,CACtC,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,OACT,sBAAuB,CACrB,QAAS,OACX,CACF,CAAC,EAEYE,GAAOF,GAAO,MAAO,CAChC,MAAO,OACP,UAAW,wBACX,OAAQ,OACV,CAAC,EAEYG,GAAiBH,GAAO,MAAO,CAC1C,QAAS,QACT,QAAS,OACT,cAAe,SACf,yBAA0B,CACxB,QAAS,OACT,WAAY,QACd,CACF,CAAC,EAEYI,GAAcJ,GAAO,MAAO,CACvC,QAAS,cACT,UAAW,SACX,SAAU,WACV,gBAAiB,CACf,SAAU,WACV,OAAQ,GACR,IAAK,MACL,MAAO,KACT,CACF,CAAC,EACYK,GAAUN,GAAI,CACzB,QAAS,OACT,cAAe,MACf,WAAY,SACZ,QAAS,KACT,UAAW,CACT,wBAAyB,CACvB,MAAO,YACT,CACF,CACF,CAAC,EDXD,IAAMO,GAAgBC,EAACC,GACbA,EAAM,IAAI,OAAO,EAcrB,KAbFC,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CH,EAAM,KACT,EACAC,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAS,IAEvCC,EACCJ,EAAM,IACN,EACA,CACF,CACF,CACF,EAdkB,iBAkBf,SAASK,GAAiBL,EAA8B,CAC7D,GAAM,CAACM,EAAMC,CAAO,EAAIC,GAAkB,EAAK,EACzC,CAACC,EAAcC,CAAe,EAAIF,GAAkB,EAAK,EACzD,CAAE,MAAAG,EAAO,MAAAC,EAAO,IAAAC,EAAK,KAAAC,EAAM,WAAAC,EAAY,aAAAC,CAAa,EAAIhB,EACxDiB,EAAQL,GAAO,OAAS,CAAC,EACzBM,EAAYC,EAAa,EAEzBC,EAAYC,GAAaJ,CAAK,EAEpC,OACEhB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACqB,GAAA,CACC,WACEN,EACKO,GAAM,CACLA,EAAE,gBAAgB,EAClBhB,EAAQ,CAACD,CAAI,CACf,EACA,OAEN,IAAKO,EACL,WAAYE,EACZ,KAAMD,EACN,MAAOH,EACP,WAAYK,EAAeQ,GAAK,EAAE,gBAAgB,EAAI,OACtD,iBAAkBN,EACpB,EAEAjB,EAAA,cAACwB,GAAA,CACC,UAAWP,EACX,KAAMZ,EACN,OACEL,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BqB,GAAK,EAAE,uBAAuB,CACjC,EAEAvB,EAAA,cAAC0B,GAAA,CAAW,QAAS,IAAMpB,EAAQ,EAAK,EAAG,QAAQ,SACjDN,EAAA,cAAC2B,GAAA,CAAU,MAAM,OAAO,KAAM,GAAI,CACpC,CACF,EAEF,QAAS,IAAM,CACbrB,EAAQ,EAAK,CACf,GACAN,EAAA,cAAC4B,GAAA,KACC5B,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BqB,GAAK,EAAE,SAAS,CACnB,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,GAAI,EAClB,OAAO,QAAQV,EAAU,OAAO,EAAE,QACjC,CAAC,CAACW,EAAgBC,CAAQ,IACxBA,EAAS,IAAI,CAACnB,EAAKoB,IAAU,CAC3B,IAAMC,EAAM,eAAeD,CAAK,GAC1BE,EAAWC,GAAUvB,CAAG,EAC9B,OACEZ,EAAA,cAACC,GAAA,CAAW,IAAKgC,GACfjC,EAAA,cAACE,GAAA,CACC,QAAQ,QACR,KAAK,SACL,MAAM,cACLkC,GAAaN,CAA4B,CAC5C,EACA9B,EAAA,cAACqC,GAAA,CACC,QAASC,GAAqB1B,EAAI,MAAM,EACxC,UAAWK,GACXjB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BC,EACCS,EAAI,OACJ,EACA,CACF,EAAG,IACFA,EAAI,MAAM,OAAO,MACjBT,EACC+B,EACA,EACA,CACF,EAAE,GAEJ,CACF,CACF,CAEJ,CAAC,CACL,EAEAlC,EAAA,cAACC,GAAA,CAAW,UAAU,qBACpBD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BqB,GAAK,EAAE,mBAAmB,CAC7B,EACAvB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAS,IAEvCC,EACCS,EACA,EACA,CACF,CACF,CACF,EACAZ,EAAA,cAACuC,GAAA,IAAK,EACL,OAAO,KAAKpB,EAAU,WAAW,EAAE,QAClCnB,EAAA,cAACwC,GAAA,CACC,cAAc,SACd,eAAgB,IAAM/B,EAAiBgC,GAAS,CAACA,CAAI,EACrD,QACEzC,EAAA,cAAC,OAAI,UAAW0C,GAAQ,GACtB1C,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,OAAO,MAAM,cAC3CM,EACGe,GAAK,EAAE,uBAAuB,EAC9BA,GAAK,EAAE,uBAAuB,CACpC,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzC7B,EAAA,cAAC2C,GAAA,CAAa,YAAanC,EAAe,KAAO,QAC/CR,EAAA,cAAC4C,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,CACF,EAEF,KAAMpC,GACNR,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BqB,GAAK,EAAE,aAAa,CACvB,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,EAAG,EAClB7B,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,OAAO,MAAM,cAC3CqB,GAAK,EAAE;AAAA,+DACkC,CAC5C,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,GAAI,EAClB,OAAO,QAAQV,EAAU,WAAW,EAAE,IACrC,CAAC,CAAC0B,EAAmBC,CAAI,EAAGd,IAAU,CACpC,IAAMe,EAAgBC,GAAkBF,CAAI,EACtCG,EAAQb,GAAaS,CAA+B,EACpDZ,EAAM,mBAAmBD,CAAK,GACpC,OACEhC,EAAA,cAACH,GAAA,CACC,IAAKoC,EACL,IAAKc,EACL,MAAOE,EACT,CAEJ,CACF,EAEAjD,EAAA,cAACuC,GAAA,IAAK,CACR,CAEJ,CACF,CACF,CAEJ,CArJgBzC,EAAAM,GAAA,oBEtDhB,OAAS,QAAA8C,OAAY,eACrB,OAAS,eAAAC,OAAmB,gBAC5B,OAAOC,OAAW,QCJlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAYD,GAAO,MAAO,CACrC,SAAU,WACV,QAAS,OACT,cAAe,SACf,MAAO,MACT,CAAC,EAEYE,GAAkBH,GAAI,CACjC,OAAQ,OACR,WAAY,OACZ,SAAU,WACV,WAAY,wBACZ,IAAK,KACP,CAAC,EDEM,SAASI,GAAaC,EAAkB,CAC7C,GAAM,CAAE,KAAAC,EAAM,GAAAC,EAAI,iBAAAC,EAAkB,aAAAC,CAAa,EAAIJ,EAErD,OACEK,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,UAAU,aACV,MAAOC,GAAK,EAAE,YAAY,EAC1B,KAAK,QACL,iBAAkBC,EAAa,EAC/B,MAAO,CACL,MAAOR,EAAK,MAAM,MAClB,SAAUA,EAAK,MAAM,SACrB,UAAWA,EAAK,MAAM,UACtB,aAAcA,EAAK,MAAM,YAC3B,EACA,MAAO,CACL,YAAaA,EAAK,MAAM,YACxB,MAAOA,EAAK,MAAM,KACpB,EACA,MAAO,CAAE,MAAOA,EAAK,MAAM,KAAM,EACnC,EACAI,GAAA,cAAC,OAAI,UAAWK,GAAgB,EAAG,EACnCL,GAAA,cAACE,GAAA,CACC,UAAU,aACV,iBAAkBE,EAAa,EAC/B,MAAOD,GAAK,EAAE,kBAAkB,EAChC,KAAK,SACL,MAAO,CACL,MAAON,EAAG,MAAM,MAChB,SAAUA,EAAG,MAAM,SACnB,UAAWA,EAAG,MAAM,UACpB,aAAcA,EAAG,MAAM,YACzB,EACA,MAAO,CACL,YAAaA,EAAG,MAAM,YACtB,MAAOA,EAAG,MAAM,KAClB,EACA,MAAO,CAAE,MAAOA,EAAG,MAAM,KAAM,EAC/B,iBAAkBC,EAClB,aAAcC,EAChB,CACF,CAEJ,CA5CgBO,EAAAZ,GAAA,gBEfhB,OAAS,QAAAa,OAAY,eACrB,OACE,mBAAAC,GACA,oBAAAC,GACA,WAAAC,GACA,SAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,MAAW,QCXlB,OAAS,mBAAAC,GAAiB,YAAAC,OAAgB,QAU1C,IAAMC,GAAmB,IACnBC,GAAqB,IACrBC,GAAyB,KACzBC,GAA+B,KAE/BC,GAAkBC,EAAA,IAAM,CAC5B,GAAM,CAACC,EAAUC,CAAW,EAAIC,GAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,EAAIF,GAAS,EAAK,EACxC,CAACG,EAAYC,CAAa,EAAIJ,GAAS,EAAK,EAC5C,CAACK,EAAeC,CAAgB,EAAIN,GAAS,EAAK,EAClD,CAACO,EAAoBC,CAAqB,EAAIR,GAAS,EAAK,EAE5DS,EAAeZ,EAAA,IAAM,CACzBE,EAAY,OAAO,YAAcP,EAAgB,EACjDU,EACE,OAAO,WAAaV,IAClB,OAAO,YAAcC,EACzB,EACAW,EACE,OAAO,WAAaX,IAClB,OAAO,YAAcC,EACzB,EACAY,EACE,OAAO,WAAaZ,IAClB,OAAO,YAAcC,EACzB,EACAa,EAAsB,OAAO,WAAab,EAA4B,CACxE,EAfqB,gBAiBrB,OAAAe,GAAgB,KACdD,EAAa,EACb,OAAO,iBAAiB,SAAUA,CAAY,EACvC,IAAM,OAAO,oBAAoB,SAAUA,CAAY,GAC7D,CAAC,CAAC,EAEE,CAAE,SAAAX,EAAU,SAAAG,EAAU,WAAAE,EAAY,cAAAE,EAAe,mBAAAE,CAAmB,CAC7E,EA/BwB,mBAiCjBI,GAAQf,GDvBf,IAAMgB,GAAY,EACZC,GAAkB,EAElBC,GAAiBC,EAACC,GAAmC,CACzD,GAAM,CAAE,QAAAC,EAAS,IAAAC,EAAK,UAAAC,EAAW,KAAAC,EAAM,MAAAC,EAAO,UAAAC,CAAU,EAAIN,EACtDO,EAAmBD,GAAaE,EAAa,EACnD,OACEC,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,WAAY,EACZ,KAAMH,EACN,QAASH,GACTQ,EAAA,cAACE,GAAA,CAAe,UAAWR,EAAW,MAAOE,GAC3CI,EAAA,cAACG,GAAA,CAAM,IAAKV,EAAK,KAAM,GAAI,CAC7B,CACF,CAEJ,EAfuB,kBAiBhB,SAASW,GAAab,EAA0B,CACrD,GAAM,CAAE,SAAAc,EAAU,SAAAC,EAAU,YAAAC,EAAa,MAAAC,EAAO,SAAAC,EAAU,KAAAC,EAAM,UAAAb,CAAU,EACxEN,EACIO,EAAmBD,GAAaE,EAAa,EAC7CY,EAAgBH,EAAM,OACtBI,EAAcC,GAAqBL,CAAK,EACxC,CAAE,SAAAM,EAAU,SAAAC,CAAS,EAAIC,GAAgB,EAE/C,OACEhB,EAAA,cAACiB,GAAA,CACC,SAAUP,IAAS,YACnB,IAAMQ,GAASb,EAAS,QAAUa,EAClC,SAAUZ,EACV,QAAUa,GAAM,CACdA,EAAE,gBAAgB,EAClBZ,EAAaa,GAAc,CAACA,CAAS,CACvC,GACApB,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAACsB,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BC,GAAK,EAAE,MAAM,CAChB,EACAvB,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACxChB,EAAM,IAAI,CAACiB,EAAMC,IAAU,CAC1B,IAAMC,EAAM,QAAQD,CAAK,GACnBE,EACJ5B,EAAA,cAAC6B,GAAA,KACC7B,EAAA,cAAC8B,GAAA,CAAiB,KAAM,GAAI,MAAM,QAAQ,CAC5C,EAGF,OAAOf,GAAYD,EACjBd,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GACnB3B,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,UAAW5B,EACb,EACC6B,IAAUf,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CAC3C,EAEA5B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GAClBhB,GAAiBxB,IACjBwB,EAAgBxB,IAAauC,EAAQvC,GAAY,EAChDa,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,UAAW5B,EACb,EACC6B,IAAUf,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CAC3C,EAEAF,IAAUvC,GAAY,GACpBa,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,MAAM,MACN,WAAY,EACZ,QACEE,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACvBO,EACApB,EAAM,IAAI,CAACiB,EAAMM,IAAM,CACtB,IAAMJ,EAAM,SAASI,CAAC,GACtB,OACEA,GAAKL,GACH1B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GACnB3B,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,KAAM,GACR,EACCM,IAAMpB,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CACvC,CAGN,CAAC,CACH,GAEF5B,EAAA,cAACgC,GAAA,CACC,MACExB,EAAM,KACJ,CAACiB,EAAMM,IACLA,GAAKL,IACJD,EAAK,QAAU,SAAWA,EAAK,QAAU,UAC9C,GAAG,OAELzB,EAAA,cAACsB,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAO,IACrCX,EAAgBe,CACpB,CACF,CACF,CAGN,CAEJ,CAAC,CACH,EACA1B,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAAC,OAAI,UAAU,uBACbA,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAACsB,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BC,GAAK,EAAE,SAAS,CACnB,EACAvB,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACxCZ,EAAY,IAAI,CAACqB,EAAYP,IAC5B1B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKiC,EAAW,aAC7BrB,EAAY,QAAUxB,IACtBwB,EAAY,OAASxB,IACpBsC,EAAQtC,GAAkB,EAC1BY,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,QAASmC,EAAW,YACpB,WAAY,GACZjC,EAAA,cAACX,GAAA,CACC,QAAS,GACT,IAAK4C,EAAW,MAChB,KAAM,GACN,UAAWP,IAAU,EAAI,kBAAoB,GAC/C,CACF,EAEAA,IAAUtC,GAAkB,GAC1BY,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,MAAM,MACN,WAAY,EACZ,QACEE,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACvBT,EAAY,IACX,CAACsB,EAAOH,IACNA,GAAKL,GACH1B,EAAA,cAACX,GAAA,CACC,IAAK6C,EAAM,YACX,QAAS,GACT,IAAKA,EAAM,MACX,KAAM,GACN,UAAWH,EAAIL,EAAQ,kBAAoB,GAC3C,UAAW7B,EACb,CAEN,CACF,GAEFG,EAAA,cAACgC,GAAA,CAAS,UAAW,mBACnBhC,EAAA,cAACsB,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAO,IACrCV,EAAY,OAASc,CACzB,CACF,CACF,CAGN,CACD,EAED1B,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,CAC5C,CACF,EAEAxB,EAAA,cAAC6B,GAAA,CAAc,YAAapB,EAAW,KAAO,QAC5CT,EAAA,cAACmC,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,CAC3C,CACF,CACF,CAEJ,CAzKgB7C,EAAAc,GAAA,gBP6BT,SAASgC,GAAMC,EAAmB,CACvC,GAAM,CACJ,MAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,aAAAC,EAAe,GACf,iBAAAC,EACA,iBAAAC,EAAmB,GACnB,UAAWC,CACb,EAAIZ,EACEa,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAWF,EAAY,EAAE,SAAS,EAClC,CAACG,EAAUC,CAAW,EAAIC,GAASnB,EAAM,QAAQ,EACjDoB,EAAWC,GAAiC,IAAI,EAChDC,EAAeC,EACnBrB,EAAM,MACN,EACA,CACF,EACMsB,EAAgBD,EACpBpB,EAAO,MACP,EACA,CACF,EACMsB,EAAwBtB,EAAO,SACjCoB,EACEpB,EAAO,SACP,EACA,CACF,EACA,GACEuB,EAAcC,GAAezB,EAAM,SAAUC,EAAO,UAAY,IAAI,EACpEyB,EAAmBL,EACvBG,EACA,EACA,CACF,EACMG,EAA0BC,GAAoBJ,GAAe,CAAC,EAE9DK,EAAgBC,EAAA,CACpBC,GACAC,IAEOD,GAAM,IAAI,CAACE,EAAMC,KAAU,CAChC,IAAIC,EACEC,GACJlC,GAAO,OAAS,GAChBA,EAAM,KAAK,YAAc+B,EAAK,UAE1BI,GACJnC,GAAO,OAAS,GAChBA,EAAM,sBAAsB,IAAIgC,EAAK,EAEjCI,EACJnC,GAAS,OAAS,GAClBA,EAAQ,sBAAsB,IAAI+B,EAAK,EAEnCK,EAAeH,IAAuBC,GACtCG,EAAiBF,EAEnBC,EACFJ,EAAY,QACHK,IACTL,EAAY,WAGd,IAAIM,GAAaF,EACbG,GAAK,EAAE,gBAAgB,EACvBA,GAAK,EAAE,kBAAkB,EAE7B,OAAIN,KACFK,GAAavC,GAAO,gBAGf,CACL,QAAS,CACP,YAAayC,GAAsBV,EAAK,UAAWnB,CAAQ,EAC3D,MAAOmB,EAAK,WACd,EACA,KAAM,CACJ,MAAO,CAAE,YAAaA,EAAK,KAAK,OAAQ,MAAOA,EAAK,KAAK,IAAK,EAC9D,MAAO,CACL,YAAaW,GACXX,EAAK,KAAK,WACVtB,CACF,EACA,MAAOsB,EAAK,KAAK,cACnB,EACA,MAAO,CACL,MACEC,KAAU,GAAK,CAACF,EACZX,EACErB,EAAM,MACN,EACA,CACF,EACAqB,EACEY,EAAK,WACL,EACA,CACF,EACN,SAAUZ,GACPY,EAAK,KAAK,UAAY,GAAK,WAAWA,EAAK,UAAU,EACtD,EACA,CACF,EACA,UAAWY,GACTX,KAAU,EAAIlC,EAAM,MAAQiC,EAAK,UACnC,EACA,aAAcY,GACZ,IAAIC,GAAUb,EAAK,KAAK,UAAY,CAAC,EAAE,aACrCA,EAAK,UACP,CACF,CACF,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaA,EAAK,GAAG,OAAQ,MAAOA,EAAK,GAAG,IAAK,EAC1D,MAAO,CACL,YAAaW,GACXX,EAAK,GAAG,WACRtB,CACF,EACA,MAAOsB,EAAK,GAAG,cACjB,EACA,MAAO,CACL,MAAOZ,EACLY,EAAK,SACL,EACA,CACF,EACA,SAAUZ,GACPY,EAAK,GAAG,UAAY,GAAK,WAAWA,EAAK,QAAQ,EAClD,EACA,CACF,EACA,UAAWY,GAAqBZ,EAAK,QAAQ,EAC7C,aAAcY,GACZ,IAAIC,GAAUb,EAAK,GAAG,UAAY,CAAC,EAAE,aAAaA,EAAK,QAAQ,CACjE,CACF,CACF,EACA,MAAOE,EACP,OACEI,GAAgBC,EACdO,EAAA,cAACC,GAAA,CAAgB,MAAOvC,GACtBsC,EAAA,cAACE,GAAA,CACC,QAAQ,QACR,KAAMV,EAAe,QAAU,UAC/B,MAAOE,GACP,OACGhC,EA4DG,KA3DFsC,EAAA,cAACG,GAAA,KACEd,IACCW,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLjD,EAAM,oBACT,EACA6C,EAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cAAa,GAErB,EACAJ,EAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLT,GAAK,EAAE,CACN,GAAI,2BACJ,OAAQ,CACN,OAAQrB,EACNY,EAAK,WACL,EACA,CACF,EACA,OAAQA,GAAM,KAAK,MACrB,CACF,CAAC,CACH,CACF,GAEAI,IAAoBC,IACpB,CAACF,IACCW,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLT,GAAK,EAAE,CACN,GAAI,qDACJ,OAAQ,CACN,GAAIxC,GAAO,OACT,GAAwC,CACxC,oBACEA,EAAM,sBAAsB,IAAIgC,EAAK,CACzC,EACA,GAAI/B,GAAS,OACX,GAA0C,CAC1C,oBACEA,EAAQ,sBAAsB,IAAI+B,EAAK,CAC3C,CACF,CACF,CAAC,CACH,CAEN,EAGN,CACF,EACE,OACN,KAAMmB,GAAuBpB,EAAK,sBAAsB,EACxD,IAAKZ,EACHiC,GAAgBrB,EAAMpB,CAAM,EAC5B,EACA,CACF,EACA,cAAeoB,EAAK,cAChBJ,EAAcI,EAAK,aAAa,EAChC,MACN,CACF,CAAC,EA3LmB,iBA6LhBsB,EAAQ1B,EAAc9B,GAAO,OAAS,CAAC,CAAC,EAExCyD,EAAgBD,EAAM,OACtBE,EAAY/C,GAAiBgD,EAAa,EAC1CC,EAAkBC,GAAS9D,EAAM,MAAM,MAAQ,CAAC,CAAC,EACjD+D,EAAsB,CAAC,CAACrD,EACxBsD,EAAYT,GAAuBU,GAAiBhE,GAAO,KAAK,CAAC,EACjEiE,GAAWC,GAAiBlE,GAAO,OAAS,CAAC,EAAGc,CAAM,EACtDqD,GAAM7C,EACV2C,GACA,EACA,CACF,EAEMG,EAAaH,GAAS,IAAI,IAAIlB,GAAUsB,EAAW,CAAC,EAE1D,OAAO3D,EACLsC,EAAA,cAACsB,GAAA,CACC,SAAUhE,EACV,IAAK6D,GACL,KAAMJ,EACN,iBAAkBQ,GAAY,EAC9B,MAAOf,EACP,KAAMI,EACN,WAAYQ,EACZ,iBAAkBzC,EAClB,aAAcC,EACd,YAAa,CACX,MAAOL,EACP,SAAUC,EACV,UAAWsB,GAAqB5C,EAAO,KAAK,EAC5C,aAAc4C,GAAqB5C,EAAO,QAAQ,CACpD,EACF,EAEA8C,EAAA,cAACwB,GAAA,CACC,SAAUlE,EACV,SAAUD,IAAS,YACnB,MAAOA,IAAS,SAChB2C,EAAA,cAAC,OAAI,UAAWyB,GAAc,GAC3B,CAAClE,GAAaqD,EAAgB,OAC7BZ,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC0B,GAAA,KACEd,EAAgB,IAAI,CAACe,GAAKxC,IAAU,CACnC,IAAMyC,EAAM,GAAGD,GAAI,KAAK,IAAIxC,CAAK,GACjC,OACEa,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK4B,GACnB5B,EAAA,cAAC6B,GAAA,CAAS,MAAOF,GAAI,MAAO,MAAOA,GAAI,MAAO,EAC9C3B,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,CAC3C,CAEJ,CAAC,CACH,EACAL,EAAA,cAAC8B,GAAA,IAAK,EACL,CAAChB,GAAuBd,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,CAC7C,EACE,KACJL,EAAA,cAAC,OAAI,GAAG,cAAc,UAAW+B,GAAoB,GACnD/B,EAAA,cAACgC,GAAA,CACC,MAAOhF,EACP,KAAM+D,EACN,IAAKI,GACL,WAAYC,EACZ,aAAc5D,EACd,MAAOiD,EACT,EAECK,GACCd,EAAA,cAACiC,GAAA,CACC,QAAUC,IAAM,CACdA,GAAE,gBAAgB,EAClBzE,EAAiB,CACnB,EACA,KAAK,UACL,KAAK,YACL,QAAQ,WACRuC,EAAA,cAACI,GAAA,CAAW,MAAM,YAAY,QAAQ,QAAQ,KAAK,UAChDT,GAAK,EAAE,gBAAgB,CAC1B,CACF,CAEJ,EACCtC,IAAS,SACR2C,EAAA,cAAC,OAAI,UAAWmC,GAAgB,GAC9BnC,EAAA,cAACoC,GAAA,KACCpC,EAAA,cAACqC,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,EACArC,EAAA,cAACsC,GAAA,KACCtC,EAAA,cAACuC,GAAA,CAAgB,KAAK,QAAQ,QAAQ,QACnC,GAAGlE,CAAY,IAAImC,EAAM,CAAC,EAAE,KAAK,MAAM,WAAW,KACrD,EACAR,EAAA,cAACwC,GAAA,CACC,QAAS1C,GAAqB5C,EAAO,KAAK,EAC1C,UAAWwD,EACX,KAAOxD,EAAO,MAAgB,OAAR,IACtB8C,EAAA,cAACuC,GAAA,CAAgB,KAAK,QAAQ,QAAQ,QAAO,OAE1C,GAAGhE,CAAa,IACfiC,EAAMA,EAAM,OAAS,CAAC,EAAE,GAAG,MAAM,WACnC,EACF,CACF,CACF,EACAR,EAAA,cAACwC,GAAA,CACC,QAAS1C,GAAqB5C,EAAO,QAAQ,EAC7C,UAAWwD,GACXV,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCL,EAAA,cAACI,GAAA,CAAW,MAAM,cAAc,KAAK,SAAS,QAAQ,QACnD,KAAK5B,CAAqB,GAC7B,CACF,CACF,EAEDnB,IAAS,aACR2C,EAAA,cAACyC,GAAA,CACC,iBAAkB/B,EAClB,KAAK,SACL,UAAU,WACV,MAAO,CACL,MAAOnC,EACP,SAAUC,EACV,UAAWsB,GAAqB5C,EAAO,KAAK,EAC5C,aAAc4C,GAAqB5C,EAAO,QAAQ,CACpD,EACA,MAAO,CACL,YAAasD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CAAE,MAAOD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,KAAM,EACxD,iBAAkB9B,EAClB,aAAcC,EAChB,EAEDvB,IAAS,gBACR2C,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC0C,GAAA,CACC,KAAMlC,EAAM,CAAC,EAAE,KACf,GAAIA,EAAMC,EAAgB,CAAC,EAAE,GAC7B,iBAAkB9B,EAClB,aAAcC,EAChB,EACAoB,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,CACpB,CAEJ,EACAL,EAAA,cAAC2C,GAAA,CACC,SAAUrF,EACV,SAAUD,IAAS,YACnB,KAAMW,EACN,UAAU,kBACV,aAAcC,GACd+B,EAAA,cAAC4C,GAAA,CACC,KAAMvF,EACN,SAAUc,EACV,SAAUb,EACV,YAAaW,EACb,UAAWyC,EACX,SAAU1C,EACV,MAAOwC,EACT,EACAR,EAAA,cAAC6C,GAAA,CAAQ,KAAM7E,GACbgC,EAAA,cAAC8C,GAAA,IAAoB,EACrB9C,EAAA,cAAC,OAAI,UAAW+C,GAAmB,GAChCvC,EAAM,IAAI,CAACwC,GAAM7D,IAAU,CAC1B,IAAMyC,EAAM,QAAQzC,CAAK,GACzB,OACEa,EAAA,cAACiD,GAAA,CACC,KAAK,gBACL,IAAKrB,EACL,iBAAkBlB,EAClB,KAAMsC,GACN,aAAc7D,IAAUqB,EAAM,OAAS,EACvC,MAAOwC,GAAK,MACd,CAEJ,CAAC,CACH,CACF,CACF,CACF,CAEJ,CA/ZgBjE,EAAAjC,GAAA,SSxEhB,OAAS,WAAAoG,GAAS,YAAAC,OAAgB,gBAClC,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,qBACT,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,uBAAwB,MACxB,wBAAyB,MACzB,QAAS,MACT,SAAU,CACR,QAAS,CACP,KAAM,CACJ,aAAc,KAChB,CACF,EACA,SAAU,CACR,KAAM,CACJ,cAAe,KACjB,EACA,MAAO,CACL,cAAe,KACjB,CACF,CACF,CACF,CAAC,EAEYG,GAASF,GAAO,MAAO,CAClC,WAAY,IACd,CAAC,EAEYG,GAAQH,GAAO,MAAO,CACjC,YAAa,IACf,CAAC,EAEYI,GAAgBJ,GAAO,MAAO,CACzC,WAAY,yBACZ,UAAW,KACX,OAAQ,aACR,UAAW,UACX,SAAU,CACR,cAAe,CACb,KAAM,CACJ,UAAW,QACX,OAAQ,GACV,CACF,CACF,CACF,CAAC,EC/CD,OAAS,cAAAK,GAAY,WAAAC,GAAS,YAAAC,OAAgB,gBAC9C,OAAOC,MAAW,QCHlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,MACX,CAAC,EAEYE,GAAeF,GAAO,MAAO,CACxC,QAAS,YACX,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,QAAS,iBACT,QAAS,OACT,cAAe,QACjB,CAAC,EAEYI,GAAkBJ,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,QAChB,WAAY,QACd,CAAC,EAEYK,GAAeL,GAAO,MAAO,CACxC,QAAS,OACT,eAAgB,gBAChB,WAAY,KACd,CAAC,EAEYM,GAAwBN,GAAO,MAAO,CACjD,OAAQ,MACR,WAAY,OACZ,WAAY,uBACd,CAAC,EAEYO,GAAcP,GAAO,MAAO,CACvC,MAAO,MACP,QAAS,OACT,eAAgB,OAClB,CAAC,EAEYQ,GAAmBR,GAAO,MAAO,CAC5C,QAAS,OACT,cAAe,SACf,WAAY,QACZ,SAAU,EACV,SAAU,OACZ,CAAC,EAEYS,GAAcT,GAAO,MAAO,CAAE,QAAS,eAAgB,CAAC,EAExDU,GAAWX,GAAI,CAC1B,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EDlCM,SAASY,GAAqBC,EAAkB,CACrD,GAAM,CAAE,KAAAC,EAAM,UAAAC,EAAY,EAAK,EAAIF,EAC7BG,EACJC,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DH,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,CACF,EACAN,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EAEIC,EAAwBV,IAAS,SAAW,CAACC,EAEnD,OACEE,EAAA,cAAC,WACE,CAACF,GACAE,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACQ,GAAA,KACCR,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAN,EAAA,cAACS,GAAA,IAAK,EACL,CAACF,GAAyBP,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,CAC/C,EAEFJ,EAAA,cAAC,OAAI,UAAWU,GAAS,GACvBV,EAAA,cAACQ,GAAA,KACCR,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACCC,GACCP,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CAEvD,EAECT,IAAS,SACRG,EAAA,cAACW,GAAA,KACCX,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDT,IAAS,aACRG,EAAA,cAACY,GAAA,KACCZ,EAAA,cAACa,GAAA,KACCb,EAAA,cAACG,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DH,EAAA,cAACI,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAN,EAAA,cAACI,GAAA,CAAQ,KAAM,GAAI,EACnBJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDT,IAAS,gBACRG,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,EAAA,cAACc,GAAA,KACEf,EACDC,EAAA,cAACe,GAAA,IAAsB,EACtBhB,CACH,EACAC,EAAA,cAACI,GAAA,CAAQ,KAAM,GAAI,CACrB,CAEJ,CAEJ,CA3EgBY,EAAArB,GAAA,wBElBhB,OAAS,cAAAsB,GAAY,WAAAC,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACxD,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,OACT,WAAY,OACd,CAAC,EAEYE,GAAaF,GAAO,MAAO,CACtC,SAAU,EACV,WAAY,KACZ,cAAe,MACf,QAAS,OACT,WAAY,SACZ,SAAU,CACR,WAAY,CACV,KAAM,CACJ,cAAe,KACjB,CACF,CACF,CACF,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,QAAS,OACT,WAAY,SACZ,SAAU,CACZ,CAAC,EAEYI,GAAoBJ,GAAO,MAAO,CAC7C,OAAQ,QACR,QAAS,KACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYK,GAAYL,GAAO,MAAO,CACrC,QAAS,OACT,WAAY,QACd,CAAC,EDzBM,SAASM,GAAaC,EAAkB,CAC7C,GAAM,CAAE,UAAAC,EAAY,EAAK,EAAID,EAC7B,OACEE,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,WAAW,EACpDF,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAF,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAc,cAAe,CAACN,EAAW,EAC1CC,GAAA,cAACM,GAAA,CAAW,WAAYP,GACtBC,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DR,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,EACAF,GAAA,cAACS,GAAA,KACCT,GAAA,cAACU,GAAA,CAAS,MAAM,OAAO,KAAM,GAAI,CACnC,EACAV,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DR,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,CACF,CACF,CACF,CAEJ,CA7BgBS,EAAAd,GAAA,gBJLT,SAASe,GAAcC,EAAkB,CAC9C,GAAM,CAAE,KAAAC,EAAM,SAAAC,EAAU,UAAAC,EAAY,EAAM,EAAIH,EAE9C,OACEI,GAAA,cAACC,GAAA,CAAU,SAAUH,EAAU,QAASD,IAAS,SAC/CG,GAAA,cAACE,GAAA,CAAqB,KAAML,EAAM,UAAWE,EAAW,EACxDC,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,EAECN,GACCE,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACO,GAAA,IAAa,EACdP,GAAA,cAACO,GAAA,IAAa,EACdP,GAAA,cAACO,GAAA,CAAa,UAAW,GAAO,CAClC,CAEJ,CAEJ,CApBgBC,EAAAb,GAAA,iBVKT,SAASc,GAAUC,EAAkB,CAC1C,GAAM,CACJ,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,iBAAAC,EAAmB,GACnB,UAAAC,CACF,EAAIb,EACE,CAAE,YAAAc,EAAa,cAAAC,EAAe,QAAAC,CAAQ,EAAIC,EAAc,EAExDC,EAAiBjB,GAAO,aAC1B,IAAIkB,GAAUlB,GAAO,YAAY,EACjC,KACEmB,EAAmBnB,GAAO,aAC5BoB,GACEpB,GAAO,aACPqB,GAAwBrB,CAAK,GAAKe,GAAS,QAC7C,EACA,KAOEO,EAAY,EAJhBnB,IACCA,EAAM,OAAS,GACdA,EAAM,OAAS,KAEYH,GAAS,CAACE,EAEzC,OAAIA,EAEAqB,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAc,UAAWnB,EAAW,KAAML,EAAM,SAAUI,EAAU,CACvE,EAIGiB,EACLC,GAAA,cAACC,GAAA,CAAe,QAAS,IAAMjB,IAAUP,CAAK,GAC5CuB,GAAA,cAACG,GAAA,CACC,MAAO1B,EACP,MAAOG,EACP,UAAWS,EACX,aAAcJ,EACd,QAASJ,EACT,UAAWE,EACX,SAAUG,EACV,KAAMR,EACN,SAAUI,EACV,iBAAkBK,EAClB,iBAAkBC,EAClB,MAAO,CACL,MAAOE,EACP,SAAUC,GAAe,SAAS,GAAK,EACzC,EACA,OAAQ,CACN,MAAOG,GAAc,SAAS,GAAK,GACnC,SAAUE,GAAgB,SAAS,GAAK,EAC1C,EACF,CACF,EACE,IACN,CApEgBQ,EAAA7B,GAAA,agBVhB,OAAS,wBAAA8B,OAA4B,wCACrC,OAAS,aAAAC,OAAiB,QCH1B,OAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAc1B,SAASC,GAA8B,CAC5C,QAAAC,CACF,EAA8E,CAC5E,GAAM,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtCC,EAAkBC,GAA+B,IAAI,EAErDC,EAAcC,EAAA,IAAMH,EAAgB,SAAS,MAAM,EAArC,eAwBpB,MAAO,CAAE,MAtBmDG,EAAA,MAC1DC,GACG,CACHF,EAAY,EACZF,EAAgB,QAAU,IAAI,gBAE9BF,EAAW,EAAI,EACf,GAAI,CACF,IAAMO,EAAM,MAAMT,EAAQQ,EAAa,CACrC,OAAQJ,EAAgB,QAAQ,MAClC,CAAC,EAED,OAAAA,EAAgB,QAAU,KACnBK,CAET,OAASC,EAAO,CACd,MAAMA,CACR,QAAE,CACAR,EAAW,EAAK,CAClB,CACF,EApB4D,SAsB5C,QAAAD,EAAS,YAAAK,CAAY,CACvC,CA/BgBC,EAAAR,GAAA,YCTT,SAASY,IAGd,CACA,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,YAAAC,CAAY,EAAIC,GAGtC,CACA,QAAS,MAAOC,EAAaC,IAC3B,MAAMC,GAAY,EAAE,oBAAoBF,EAAaC,CAAO,CAChE,CAAC,EAED,MAAO,CAAE,MAAAL,EAAO,QAAAC,EAAS,YAAAC,CAAY,CACvC,CAbgBK,EAAAR,GAAA,wBC2BT,SAASS,GAA+BC,EAAyB,CACtE,GAAI,CAACA,EAAS,MACZ,MAAM,IAAI,MAAMC,GAAc,EAAE,cAAc,MAAO,CACnD,MAAO,CACL,OACA,iBAAkBD,EAAS,oBAAoB,CAAC,CAClD,CACF,CAAC,EAEH,IAAME,EAAaC,GAAcH,EAAS,KAAK,EAC/C,GAAIE,EACF,MAAM,IAAI,MAAMA,EAAW,QAAS,CAClC,MAAOA,EAAW,OACpB,CAAC,CAEL,CAfgBE,EAAAL,GAAA,kCAiBT,SAASI,GAAcE,EAAgD,CAE5E,GADmBC,GAAcD,CAAK,EACtB,CACd,GAAM,CAAE,KAAAE,EAAM,eAAAC,EAAgB,qBAAAC,CAAqB,EACjDC,GAAqBL,CAAK,EAC5B,MAAO,CACL,QAAS,qBACT,QAAS,CACP,OACA,KAAAE,EACA,eAAAC,EACA,qBAAAC,CACF,CACF,CACF,CAEA,IAAME,EAAuBC,GAAoBP,CAAK,EAEtD,GAAIM,EAAsB,CACxB,IAAME,EAAsBC,GAAuBT,CAAK,EACxD,MAAO,CACL,QAAS,GACT,QAAS,CACP,OACA,qBAAAM,EACA,oBAAAE,CACF,CACF,CACF,CACA,OAAO,IACT,CA9BgBT,EAAAD,GAAA,iBAgCT,SAASY,GACdC,EACAC,EACAC,EAOqB,CACrB,IAAIC,EAAe,GACfH,IACFG,EAAeC,GAAeJ,EAAeC,CAAY,GAE3D,IAAMI,EAA8B,CAClC,MAAO,KACP,YAAa,KACb,QAAS,IACX,EAEMC,EAAeC,GAAsBN,EAAc,CACvD,UAAWC,EAAO,UAClB,QAASA,EAAO,QAChB,OAAQA,EAAO,KAAK,OACpB,aAAcA,EAAO,YACvB,CAAC,EAEGI,IACFD,EAAO,MAAQC,GAGbN,GAAiBG,IACfK,GAA0BR,EAAeC,CAAY,EACvDI,EAAO,YAAc,CACnB,OACA,gBAAiBI,EAAeC,GAAqBT,CAAY,CAAC,EAClE,iBAAkBQ,EAChBE,GACED,GAAqBV,CAAa,GAAK,GACvCU,GAAqBT,CAAY,GAAK,EACxC,EACA,KACA,CACF,CACF,EACSW,GAAuBZ,EAAeC,CAAY,EAC3DI,EAAO,YAAc,CACnB,MACF,EACSQ,GAAuBb,EAAeC,CAAY,EAC3DI,EAAO,YAAc,CACnB,MACF,EACSS,GAA4Bd,EAAeC,CAAY,IAChEI,EAAO,YAAc,CACnB,MACF,IAIJ,IAAMU,EAAkBC,GACtBf,EACAC,EAAO,gBACPA,EAAO,KAAK,WACd,EAIA,OAFsBa,EAAgB,SAAW,IAG/CV,EAAO,QAAU,CACf,SAAUU,CACZ,GAGKV,CACT,CA5EgBjB,EAAAW,GAAA,oBA8ET,SAASkB,GAAkBC,EAAoC,CACpE,OAAIA,GAAO,OAAS,eACX,CACL,KAAM,KACN,MAAO,CACL,MACF,EACA,SAAU,IACZ,EAGEA,EAAM,MACD,CACL,KAAM,KACN,MAAOA,EAAM,MACb,SAAU,IACZ,EAGK,CACL,KAAM,KACN,MAAO,CACL,MACF,EACA,SAAU,IACZ,CACF,CA1BgB9B,EAAA6B,GAAA,qBH/IT,SAASE,IAA8B,CAC5C,GAAM,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,cAAeC,EACf,kBAAmBC,EACnB,0BAAAC,EACA,YAAAC,CACF,EAAIC,EAAc,EAEZ,CAAE,SAAAC,EAAU,eAAAC,CAAe,EAAIC,EAAY,EAC3CC,EAA2BD,EAAY,EAAE,4BAA4B,EACrEE,EAAcF,EAAY,EAAE,YAAY,EACxCG,EAASH,EAAY,EAAE,OAAO,EAE9BI,EAAeL,GAAkBD,EAEjC,CAAE,MAAOO,EAAY,YAAAC,EAAa,QAAAC,CAAQ,EAAIC,GAAqB,EAEzE,OAAAC,GAAU,IAAMH,EAAa,CAAC,CAAC,EA6FxB,CACL,QAAAC,EACA,MA7FkCG,EAAA,MAAOC,GAAmB,CAC5D,IAAMC,EAAkBD,EAAO,gBACzBE,EACJF,GAAQ,mBAAqBjB,EAE/B,GAAI,CAACL,GAAa,CAACC,GAAW,CAACC,EAC7B,MAAO,CACL,MAAO,KACP,KAAM,KACN,MAAO,KACP,SAAU,IACZ,EAGF,IAAMuB,EAAUF,EAAgB,OAC9B,CAACG,EAA6BC,KAC5BD,EAAIC,EAAK,KAAK,EAAIA,EAAK,QAChBD,GAET,CAAC,CACH,EACME,EAAmC,CACvC,UAAWxB,GAAc,WAAa,GACtC,gBAAiBqB,EACjB,YAAaD,GAAqB,MACpC,EAEA,GAAI,CACF,OAAO,MAAMR,EAAWY,CAAW,EAAE,KAAMC,GAAa,CACtD,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnBE,GAA+B,CAC7B,kBAAmBD,EAAO,kBAC1B,UAAWA,EAAO,UAClB,MAAOA,EAAO,QAAQ,KACxB,CAAC,EAED,IAAME,EAA8B,CAClC,aAAcF,EAAO,QAAQ,aAC7B,UAAWA,EAAO,UAClB,WAAYA,EAAO,QAAQ,WAC3B,MAAOA,EAAO,QAAQ,OAAS,CAAC,EAChC,iBAAkBA,EAAO,iBACzB,cAAeA,EAAO,aACxB,EACA3B,EAAiB6B,CAAY,EAC7B,IAAMC,EAAoC,CACxC,SAAUlB,EAAa,SAAS,EAChC,uBAAwBH,CAC1B,EAEMsB,EAAsBC,GAC1B/B,GAAgB,OAChB4B,EACA,CACE,UAAAhC,EACA,QAAAC,EACA,KAAM,CAAE,YAAAY,EAAa,OAAAC,CAAO,EAC5B,gBAAAS,EACA,aAAAR,CACF,CACF,EACImB,EAAoB,aACtB5B,EAA0B,EAAK,EAEjCC,EAAY,EAEZ,IAAM6B,EAAgB,CAAC,CAACF,EAAoB,QAEtCG,EAAOC,GACXpC,EAAY,SAAS,EACrB4B,EACAS,GAAqBhB,CAAe,EACpCU,EACA,CAAAG,EACA,CAAE,YAAAvB,EAAa,OAAAC,CAAO,CACxB,EAEA,MAAO,CACL,MAAOkB,EACP,KAAAK,EACA,MAAO,KACP,SAAUH,CACZ,CACF,CAAC,CACH,OAASM,EAAY,CAEnB,OAD0BC,GAAkBD,CAAK,CAEnD,CACF,EAzFoC,SA8FlC,YAAAvB,CACF,CACF,CAvHgBI,EAAAtB,GAAA,kBrEoBhB,IAAM2C,GAAUC,GAAO,MAAO,CAC5B,MAAO,OACP,QAAS,OACT,eAAgB,gBAChB,CAAC,KAAKC,EAAU,EAAE,EAAG,CACnB,MAAO,MACP,OAAQ,KACV,CACF,CAAC,EAEKC,GAAmBC,GAAI,CAC3B,SAAU,EACV,aAAc,KAChB,CAAC,EAEKC,GAAaD,GAAI,CACrB,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEKE,GAAoBF,GAAI,CAC5B,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEM,SAASG,IAAkB,CAEhC,GAAM,CACJ,cAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,wBAAAC,EACA,kBAAAC,EACA,uBAAAC,CACF,EAAIC,EAAc,EACZC,EAAWC,GAAY,EACvBC,EAAWC,GAAY,EACvB,CAACC,EAAgBC,CAAiB,EAAIC,GAAiB,EAAE,EAEzD,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAoB,CAACd,EACrB,CAACe,EAAaC,CAAc,EAAIL,GAAS,EAAK,EAC9C,CAACM,EAAcC,CAAe,EAAIP,GAAS,EAAK,EAChD,CAAE,YAAAQ,CAAY,EAAIC,GAAW,EAC7BC,EAA2BC,EAAY,EAAE,4BAA4B,EACrEC,EAA+BC,GAAOH,CAAwB,EAC9D,CAAE,QAAAI,CAAQ,EAAIC,GAAW,EACzB,CACJ,MAAOC,EACP,QAASC,EACT,YAAAC,CACF,EAAIC,GAAe,EACb,CAACC,EAAmBC,CAAoB,EAC5CrB,GAAiC,CAC/B,KAAM,KACN,MAAO,KACP,SAAU,IACZ,CAAC,EACG,CAACsB,EAAuBC,CAAwB,EAAIvB,GAAS,EAAK,EAElEwB,EAAsCC,EAAA,MAAO,CACjD,gBAAArC,EACA,kBAAAG,CACF,IAAM,CACJ,IAAMmC,GAAS,MAAMV,IAAc,CAAE,gBAAA5B,EAAiB,kBAAAG,CAAkB,CAAC,EAEzE,OAAA8B,EAAqBK,EAAM,EACpBA,EACT,EAR4C,iBAUtCC,EAAaF,EAAA,SAAY,CAC7B,GAAIL,EAAkB,MAAQ/B,EAC5B,GAAI,CACF,MAAMyB,GAAS,OACb,OACA,CAAE,YAAaM,EAAkB,IAAK,EACtC,CAAE,GAAIA,EAAkB,KAAK,SAAU,CACzC,EAEA,IAAMQ,EAAW,MAAMC,EAAiB,KAAK,IAAIT,EAAkB,KAAK,SAAS,GACjF1B,EAASkC,EAAU,CACjB,QAAS,EACX,CAAC,EACD,WAAW,IAAM,CACfzC,EAAe,EAAE,CACnB,EAAG,CAAC,CACN,OAAS2C,EAAG,CACV/B,EAAkB,UAAa+B,GAAW,OAAO,CACnD,CAEJ,EApBmB,cAsBbC,EAAYN,EAAA,SAAY,CAC5BlB,EAAgB,EAAI,EACpB,MAAMoB,EAAW,EACjBpB,EAAgB,EAAK,CACvB,EAJkB,aAMZyB,EAAqBP,EAAA,SAAY,CACjCL,GAAmB,UAAU,OAAS,CAAC5B,EACzC+B,EAAyB,EAAI,EAE7B,MAAMQ,EAAU,CAEpB,EAN2B,sBAQrBE,GAAYR,EAAA,SAAY,CAC5BJ,EAAqB,CACnB,MAAO,KACP,KAAM,KACN,SAAU,IACZ,CAAC,EACDL,EAAY,CAAE,gBAAA5B,EAAiB,kBAAAG,CAAkB,CAAC,EAC/C,KAAM2C,GAAQ,CACbb,EAAqBa,CAAG,CAC1B,CAAC,EACA,MAAOC,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAC1C,EAXkB,aAalBC,GAAU,IAAM,CAEZ,CAAC,CAACxB,EAA6B,QAAQ,QACvC,CAACF,EAAyB,QAErBuB,GAAU,EAEjBrB,EAA6B,QAAUF,CACzC,EAAG,CAACA,EAAyB,MAAM,CAAC,EAEpC0B,GAAU,IAAM,CACVjC,GACFe,EAAY,CAEhB,EAAG,CAACf,CAAiB,CAAC,EAEtBiC,GAAU,IAAM,CACVjC,GACFE,EAAeF,CAAiB,CAEpC,EAAG,CAACA,CAAiB,CAAC,EAEtBiC,GAAU,IAAM,CACTjC,GACHa,EAAY,CAAE,gBAAA5B,EAAiB,kBAAAG,CAAkB,CAAC,EAC/C,KAAMmC,GAAWL,EAAqBK,CAAM,CAAC,EAC7C,MAAOS,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAE5C,EAAG,CAAC,CAAC,EAELC,GAAU,IAAM,CACd,IAAMC,EACJjB,EAAkB,UAAU,OAAO,MACnC,OAAO,OAAOkB,EAAgB,EAAE,SAC9BlB,EAAkB,UAAU,OAAO,IACrC,EAEImB,EACJnD,EAAgB,OAAS,GACzB,CAACA,EAAgB,MAAOoD,GACtBvC,EAAiB,KACdwC,IACCD,EAAe,UAAYC,GAAgB,SAC3CD,EAAe,aAAeC,GAAgB,YAC9CD,EAAe,QAAUC,GAAgB,KAC7C,CACF,EAEEC,GAAsB,GAE1B,GAAIL,EAAc,CAChB,IAAIM,EAAkBC,GAAmB1D,GAAe,OAAS,IAAI,EAE/D2D,GACJ3D,GAAe,MAAMA,EAAc,MAAM,OAAS,CAAC,EAAE,GAAG,WAE7B,CAAC,CAACA,GAAe,MAAM,KACjD4D,GAASA,EAAK,KAAK,aAAeD,EACrC,IAGEF,EAAkBA,EAAgB,MAChC,CAACA,EAAgB,OACjBA,EAAgB,OAAS,CAC3B,GAGiCA,EAAgB,MAChDI,GACC3D,EAAgB,KACboD,GAAmBA,EAAe,QAAUO,CAC/C,CACJ,IAGEL,GAAsB,GAE1B,CAEIxD,IAAkBqD,GAA8BG,MAClD,eAAe,IAAMM,GAAU3C,EAAe,KAAK,KAAM,EAAI,CAAC,CAAC,EAC/Df,EAAwB,EAAK,EAEjC,EAAG,CACD8B,EAAkB,UAAU,MAC5BhC,EAAgB,OAChBa,EAAiB,MACnB,CAAC,EAEDgD,GAAgB,IAAM,CACf/D,GACHQ,EAAS,MAAME,EAAS,MAAM,EAAE,CAEpC,EAAG,CAAC,CAAC,EAEL,IAAMsD,GAAe9B,EAAkB,UAAU,OAAS,KACpD+B,EAAa/B,EAAkB,MAC/BgC,GAAS,CAAC,EAkBhB,GAjBItD,GACFsD,GAAO,KAAKC,GAAA,cAACC,GAAA,CAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAOxD,EAAgB,CAAE,EAGvEsB,EAAkB,UAAU,aAC9BgC,GAAO,KACLC,GAAA,cAACC,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MACElC,EAAkB,SAAS,aAC3BmC,GAA6BnC,EAAkB,SAAS,WAAW,EAEvE,CACF,EAGE8B,IAAgBC,EAAY,CAC9B,IAAMK,EAAe,MAAM3B,EAAiB,QAAQ,GACpDuB,GAAO,KACLC,GAAA,cAACI,GAAA,CACC,QAASP,GACT,MAAOC,EACP,oBAAqB,GACrB,aAAclB,GACd,iBAAkBX,EAClB,qBAAsB,CAACd,EACvB,mBAAoB,IAAMe,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,SAAY,CACjCA,EAAyB,EAAK,EAC9B,MAAMI,EAAW,CACnB,EACA,iBAAkB,IAAMjC,EAAS8D,CAAY,EAC/C,CACF,CACF,CAEA,OACEH,GAAA,cAACK,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,cAAc,EAC5B,SAAU,IAAM,CACd,IAAMC,EAAc,MAAM/B,EAAiB,OAAO,GAClDnC,EAASkE,CAAW,CACtB,CACF,EACA,OACEP,GAAA,cAAC3E,GAAA,KACC2E,GAAA,cAAC,OAAI,UAAWxE,GAAiB,GAC/BwE,GAAA,cAACQ,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,UAAS,GACT,QAAS5C,GAA6BX,EACtC,SAAU,CAAC,CAACc,EAAkB,OAAS,CAACZ,EACxC,QAASwB,GACR2B,GAAK,EAAE,YAAY,CACtB,CACF,EACAN,GAAA,cAACzE,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASqC,GAA6BX,EACtC,SAAU,CAACE,EACX,QAASH,EAAe,KAAK,KAAM,EAAI,GACvCgD,GAAA,cAACS,GAAA,CAAW,KAAM,GAAI,CACxB,CACF,GAED1D,GACCiD,GAAA,cAACU,GAAA,CACC,KAAM3D,EACN,QAAS,IAAMC,EAAe,EAAK,EACnC,SAAUa,EACV,QAASD,EACT,eAAgBO,EAClB,EAGF6B,GAAA,cAACW,GAAA,KACCX,GAAA,cAAC,OAAI,UAAWrE,GAAkB,GAChCqE,GAAA,cAACY,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BN,GAAK,EAAE,SAAS,CACnB,EACAN,GAAA,cAAC,OAAI,UAAWtE,GAAW,GACzBsE,GAAA,cAACa,GAAA,CACC,QACE,CAACjD,GACD,CAACb,GACD,CAACkB,EACGW,GACA,OAER,CACF,CACF,EACAoB,GAAA,cAACc,GAAA,CAAQ,KAAK,KAAK,EAElBC,GACChB,GAAO,IAAI,CAACiB,EAAOC,KAAW,CAC5B,QAASD,EACT,IAAK,SAASC,CAAK,EACrB,EAAE,EACFjB,GAAA,cAACc,GAAA,CAAQ,KAAM,GAAI,CACrB,EACCf,GAAO,OAAS,EAAIC,GAAA,cAACc,GAAA,CAAQ,KAAM,GAAI,EAAK,KAE7Cd,GAAA,cAACkB,GAAA,CACC,MAAOrF,EACP,KAAK,eACL,SAAQ,GACR,UAAS,GACT,MAAOkC,EAAkB,MACzB,QAASH,EACT,QAASG,EAAkB,UAAU,OAAS,KAChD,CACF,CACF,CAEJ,CA3TgBK,EAAAxC,GAAA,mByEjEhB,OAAS,QAAAuF,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OAAS,WAAAC,GAAS,YAAAC,GAAU,UAAAC,OAAc,gBAC1C,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCJ5B,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,0BAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,eAAAC,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCJzD,SAASC,GAAqBC,EAAuBC,EAAe,CACzE,IAAMC,EAAmB,CAAC,EACtBC,EAAQ,EACZ,EAAG,CACD,IAAMC,EAAQJ,EAAYG,CAAK,EAC/BD,EAAO,KAAK,KAAK,IAAIE,EAAOH,CAAK,CAAC,EAClCA,GAASG,EACTD,GACF,OAASF,EAAQ,GAAKE,GAASH,EAAY,QAC3C,OAAOE,CACT,CAVgBG,EAAAN,GAAA,wBCNhB,OAAS,OAAAO,GAAK,aAAAC,GAAW,UAAAC,OAAc,gBAEhC,IAAMC,GAAcH,GAAI,EAElBI,GAAoBF,GAAO,MAAO,CAC7C,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,IACX,CAAC,EAEYG,GAAQH,GAAO,MAAO,CACjC,MAAO,OACP,QAAS,OACT,cAAe,SACf,gBAAiB,cACjB,QAAS,cACT,CAAC,MAAMC,EAAW,EAAE,EAAG,CACrB,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYK,GAAOJ,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,aAChB,QAAS,IACX,CAAC,EAEYK,GAAWL,GAAO,MAAO,CACpC,IAAK,MACL,QAAS,OACT,cAAe,QACjB,CAAC,EAEYM,GAAoBN,GAAO,MAAO,CAC7C,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EFfD,IAAMO,GAAiB,GAEhB,SAASC,GAAmBC,EAAkB,CACnD,GAAM,CAAE,KAAAC,EAAM,YAAAC,EAAa,QAAAC,EAAS,UAAAC,CAAU,EAAIJ,EAC5C,CAACK,EAAoBC,CAAqB,EAAIC,GAAmB,CAAC,CAAC,EACnEC,EAAcC,GAAO,CAAC,EACtB,CAAE,MAAAC,EAAO,YAAAC,EAAa,OAAAC,CAAO,EAAIT,EAAQF,CAAI,EAE7CY,EAAkBC,GAAYC,GAAsB,CAAC,CAAC,EAEtDC,EAAWF,GAAY,IAAM,CACjC,IAAMG,EAAgBhB,EAAK,OAASO,EAAY,QAC5CS,IACFT,EAAY,SAAW,KAAK,IAAIS,EAAenB,EAAc,EAC7DQ,EAAsBO,EAAgBF,EAAaH,EAAY,OAAO,CAAC,EAE3E,EAAG,CAACP,EAAK,MAAM,CAAC,EAQhB,GANAiB,GAAU,IAAM,CACTd,GACHY,EAAS,CAEb,EAAG,CAACZ,EAAWY,CAAQ,CAAC,EAEpBZ,EAAW,CAEb,IAAMM,EAAQ,CAAC,EAAG,CAAC,EAEnB,OACES,GAAA,cAAAA,GAAA,cAFoB,CAACT,EAAOA,CAAK,EAGhB,IAAI,CAACU,EAAOC,IAGvBF,GAAA,cAACG,GAAA,CAAM,IAFGD,GAGRF,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAS,QAAQ,OAAO,MAAO,GAAI,KAAK,QAAQ,EACjDL,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,CACrB,EACAN,GAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,GAAA,cAACO,GAAA,KACEN,EAAM,IAAI,CAACO,EAAGN,IAENF,GAAA,cAACS,GAAA,CAAa,UAAW,GAAM,IAD1BP,EACoC,CACjD,CACH,CACF,CAEH,CACH,CAEJ,CAEA,OACEF,GAAA,cAACU,GAAA,CACC,WAAY,IAAM,CACZrB,EAAY,QAAUP,EAAK,QAC7Be,EAAS,CAEb,EACA,YAAaX,EACb,aAAegB,GAEXF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACW,GAAA,CACC,QAAQ,QACR,KAAK,SACL,UAAWC,GAAY,GACtBnB,EAAOS,CAAK,CACf,CACF,CACF,EAGJ,YAAa,CAACA,EAAOW,IAAe,CAClC,IAAMC,EAAOvB,EAAMW,CAAK,EACxB,GAAI,CAACY,EACH,OAAO,KAET,IAAMC,EAAYD,EAAK,MAAM,CAAC,EACxBE,EAAWF,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EACjD,OACEd,GAAA,cAACiB,GAAA,CAAkB,IAAKH,EAAK,WAC3Bd,GAAA,cAACS,GAAA,CACC,UAAWK,EAAK,UAChB,aAAcA,EAAK,aACnB,OAAQA,EAAK,OACb,QAAS/B,EACT,iBAAkBmC,EAAa,EAC/B,aAAczB,EAAOoB,CAAU,IAAMM,GAAK,EAAE,OAAO,EACnD,cAAe,CACb,KAAM,CACJ,MAAO,CACL,MAAOJ,EAAU,SACjB,YAAaA,EAAU,UACzB,EACA,WAAY,CACV,MAAOA,EAAU,oBAAsB,EACzC,EACA,OAAQK,EACNN,EAAK,YACL,EACA,CACF,EACA,WAAYO,GAAqBP,EAAK,WAAW,CACnD,EACA,GAAI,CACF,MAAO,CACL,MAAOE,EAAS,OAChB,YAAaA,EAAS,QACxB,EACA,WAAY,CACV,MAAOA,EAAS,kBAAoB,EACtC,EACA,OAAQI,EACNJ,EAAS,cACPA,EAAS,mCACT,GACF,EACA,CACF,EACA,WAAYK,GACVL,EAAS,cACPA,EAAS,iCACb,CACF,CACF,EACF,CACF,CAEJ,EACF,CAEJ,CAnIgBM,EAAA1C,GAAA,sBG5BhB,OAAS,aAAA2C,GAAW,cAAAC,GAAY,cAAAC,GAAY,aAAAC,OAAiB,gBAC7D,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,MAAO,MACP,OAAQ,MACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EDDM,SAASE,GAAYC,EAAkB,CAC5C,GAAM,CACJ,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,KAAAC,EACA,SAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAIR,EAEJ,OACES,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAW,MAAM,QAAQ,CAC5B,EAEF,OACE,CAAC,CAACN,EAAM,QACNG,GAAA,cAACI,GAAA,CACC,QAAQ,QACR,QAAS,IAAMN,IAAW,EAAE,EAC5B,KAAK,SACLE,GAAA,cAACK,GAAA,CAAU,MAAM,OAAO,KAAM,GAAI,CACpC,EAGJ,UAAWZ,EACX,MAAOC,EACP,QAASF,EACT,MAAO,CACL,QAAS,GACT,aAAc,GACd,WAAY,QACd,EACA,KAAMG,EACN,MAAOE,EACP,SAAUD,EACT,GAAGG,EACN,CAEJ,CA3CgBO,EAAAhB,GAAA,eEJhB,OAAS,QAAAiB,OAAY,eACrB,OAAOC,OAAW,QAEX,IAAMC,GAA4BC,EAACC,GAAU,CAClD,IAAMC,EAMF,IAAI,IAAI,CACV,CACE,QACA,CACE,MAAOC,GAAK,EAAE,OAAO,EACrB,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAOA,GAAK,EAAE,WAAW,EACzB,MAAO,CAAC,CACV,CACF,EACA,CACE,QACA,CACE,MAAOA,GAAK,EAAE,YAAY,EAC1B,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAOA,GAAK,EAAE,WAAW,EACzB,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAED,SAASC,EAAiBC,EAAaC,EAAmB,CACnDJ,EAAO,IAAIG,CAAG,GACjBH,EAAO,IAAIG,EAAK,CACd,MAAOA,EACP,MAAO,CAAC,CACV,CAAC,EAEHH,EAAO,IAAIG,CAAG,GAAG,MAAM,KAAKC,CAAI,CAClC,CARSN,EAAAI,EAAA,oBAUT,IAAMG,EAAMC,GAAM,EAClBP,EAAM,QAASK,GAAS,CACtB,IAAMG,EAAO,OAAOH,EAAK,YAAY,EAC/BI,EAAWF,GAAMC,CAAI,EAC3B,GAAIF,EAAI,OAAOG,EAAU,KAAK,EAC5BR,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKI,CAAI,UAC3BC,EAAI,OAAOG,EAAU,MAAM,EACpCR,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKI,CAAI,UAC1BC,EAAI,OAAOG,EAAU,OAAO,EACrCR,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKI,CAAI,UAC3BC,EAAI,OAAOG,EAAU,MAAM,EACpCR,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKI,CAAI,MAC9B,CACL,IAAMK,EAAO,IAAI,KAAKF,CAAI,EAAE,YAAY,EAAE,SAAS,EACnDL,EAAiBO,EAAML,CAAI,CAC7B,CACF,CAAC,EAED,IAAMM,EAAe,MAAM,KAAKV,EAAO,OAAO,CAAC,EAAE,OAC9CW,GAASA,EAAK,MAAM,OAAS,CAChC,EACMC,EAAQF,EAAa,QAASG,GAAUA,EAAM,KAAK,EACnDC,EAAcJ,EAAa,IAAKG,GAAUA,EAAM,MAAM,MAAM,EAC5DE,EAASL,EAAa,IAAKG,GAAUA,EAAM,KAAK,EAEtD,MAAO,CAAE,MAAOD,EAAO,YAAAE,EAAa,OAAAC,CAAO,CAC7C,EA1EyC,oBNUzC,IAAMC,GAA8BC,GAAO,MAAO,CAChD,UAAW,UACX,MAAO,OACP,QAAS,OACT,cAAe,SACf,IAAK,GACL,OAAQ,MACV,CAAC,EAEKC,GAAqBC,EAAA,CAACC,EAA0BC,IAC/CD,GAAO,OAGLA,EAAM,OACVE,GACCC,GAAaD,EAAK,eAAgBD,CAAK,GACvCE,GAAaD,EAAK,aAAcD,CAAK,GACrCE,GAAaD,EAAK,SAAUD,CAAK,GACjCE,GAAaD,EAAK,WAAYD,CAAK,CACvC,EAAE,OARO,GAFgB,sBAapB,SAASG,IAAc,CAC5B,IAAMC,EAAWC,GAAY,EACvB,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAsBC,GAAgBJ,CAAO,EAAE,IAAI,CAAC,CAAE,KAAAK,CAAK,IAAMA,CAAI,EACrE,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnDC,EAAU,CAACR,EAAM,oBAEjBS,EAAgBlB,EAACmB,GAA+C,CACpE,IAAMjB,EAAQiB,EAAM,OAAO,MAC3BJ,EAAeb,CAAK,CACtB,EAHsB,iBAKlBkB,EAAeT,EACfG,IACFM,EAAeT,EAAK,OACjBE,GACCT,GAAaS,EAAK,YAAaC,CAAW,GAC1CV,GAAaS,EAAK,OAAQC,CAAW,GACrCf,GAAmBc,EAAK,MAAOC,CAAW,GAC1CV,GAAaS,EAAK,UAAWC,CAAW,CAC5C,GAGF,IAAMO,EAAU,CAACD,GAAc,QAAU,CAACH,EAE1C,OACEK,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,SAAS,CACzB,GACAF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CACC,SAAUX,EACV,UAAS,GACT,QAAQ,YACR,YAAaS,GAAK,EAAE,oBAAoB,EACxC,UAAS,GACT,SAAUN,EACV,MAAOJ,EACT,EACAQ,GAAA,cAACK,GAAA,CAAQ,KAAK,KAAK,EACnBL,GAAA,cAACzB,GAAA,KACEwB,GACCC,GAAA,cAACM,GAAA,KACCN,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACO,GAAA,CACC,MAAOL,GAAK,EAAE,kBAAkB,EAChC,YACEV,EAAcU,GAAK,EAAE,8BAA8B,EAAI,GAE3D,CACF,EAED,CAACH,GACAC,GAAA,cAACQ,GAAA,CACC,KAAMV,EACN,YAAad,EACb,QAASyB,GACT,UAAWd,EACb,CAEJ,CACF,CACF,CAEJ,CAjEgBjB,EAAAK,GAAA,eOpChB,OAAS,QAAA2B,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,UAAAC,GAAQ,eAAAC,OAAmB,gBACrD,OAAOC,OAAe,eACtB,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAC3C,OAAS,eAAAC,OAAmB,mBCJ5B,OAAS,QAAAC,OAAY,eACrB,OAAS,UAAAC,OAAc,gBACvB,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCD3C,OAAS,QAAAC,OAAY,eACrB,OAAS,WAAAC,GAAS,qBAAAC,GAAmB,cAAAC,OAAkB,gBACvD,OAAOC,OAAW,QCLlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAkBD,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,SAChB,cAAe,SACf,OAAQ,MACV,CAAC,EAEYE,GAAkBF,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYG,GAAkBH,GAAO,MAAO,CAC3C,MAAO,OACT,CAAC,ECfD,OAAS,QAAAI,OAAY,eACrB,OAAS,UAAAC,OAAc,gBACvB,OAAOC,OAAW,QAMX,SAASC,GAAeC,EAAmC,CAChE,GAAM,CAAE,wBAAAC,EAAyB,aAAAC,CAAa,EAAIC,EAAc,EAE1DC,EAA6D,CACjE,CACE,MAAO,QACP,MAAOC,GAAK,EAAE,eAAe,CAC/B,EACA,CACE,MAAO,MACP,MAAOA,GAAK,EAAE,YAAY,CAC5B,EACA,CACE,MAAO,QACP,MAAOA,GAAK,EAAE,kBAAkB,CAClC,EACA,CACE,MAAO,aACP,MAAOA,GAAK,EAAE,gBAAgB,CAChC,EACA,CACE,MAAO,QACP,MAAOA,GAAK,EAAE,gBAAgB,CAChC,CACF,EAEA,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,UAAWR,EAAM,UACjB,QAASI,EACT,MAAOF,EACP,gBAAkBO,GAAS,CACzBR,EAAwB,eAAgBQ,EAAK,KAAK,CACpD,EACA,QAAQ,SACV,CACF,CAEJ,CAvCgBC,EAAAX,GAAA,kBFUhB,IAAMY,GAAsB,EACrB,SAASC,GAAOC,EAAkB,CACvC,GAAM,CACJ,QAAAC,EACA,eAAAC,EACA,MAAAC,EACA,aAAAC,EACA,QAAAC,EAAU,GACV,iBAAAC,EAAmB,GACnB,UAAWC,CACb,EAAIP,EACE,CACJ,cAAAQ,EACA,OAAAC,EACA,wBAAAC,EACA,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,MAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,SAAAC,EAAU,eAAAC,CAAe,EAAIC,EAAY,EAC3CC,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAYb,GAAiBc,EAAa,EAC1CC,EAAY,CAAC,CAACb,GAAUA,EAAO,QAAQ,OACvCc,EAAeN,GAAkBD,EACjCQ,EAAkBC,EAACC,GAAsC,CAC7D,GAAI,CAACf,GAAa,CAACC,GAAW,CAACH,EAC7B,OAAO,KAET,IAAMkB,EAA6B,CACjC,cAAelB,EAAO,cACtB,GAAGiB,CACL,EAEA,OAAOE,GAAsBD,EAAa,CACxC,UAAAhB,EACA,QAAAC,EACA,aAAAW,EACA,OAAAJ,CACF,CAAC,CACH,EAfwB,mBAgBlBU,EACJf,GAAO,OAAS,GAChBA,GAAO,OAAS,EAEZgB,EAAarB,GAAQ,QACvBsB,GAAalB,EAAcJ,GAAQ,OAAO,EAC1C,CAAC,EAEL,OACEuB,GAAA,cAAAA,GAAA,cACG3B,GACC2B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,KAAK,UAAU,QAAQ,SAChCC,GAAK,EAAE,SAAS,CACnB,EACAH,GAAA,cAACI,GAAA,CAAe,UAAWhB,EAAW,CACxC,EACAY,GAAA,cAACK,GAAA,CAAQ,KAAK,KAAK,CACrB,EAGDpC,GACC,MAAM,KAAK,CAAE,OAAQH,EAAoB,EAAG,CAACwC,EAAGC,IAC9CP,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKO,GAClBjC,EACC0B,GAAA,cAACQ,GAAA,CAAkB,QAAO,GAAC,EAE3BR,GAAA,cAACS,GAAA,CACC,UAAW,GACX,KAAK,YACL,SAAU,GACZ,EAEDF,IAAUzC,GAAsB,GAAKkC,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CAC3D,CACD,EAEF,CAACpC,GACA+B,GAAA,cAAAA,GAAA,cACGV,EACGQ,EAAW,IAAI,CAACJ,EAAOa,IAAU,CAC/B,IAAMG,EAAelB,EAAgBE,CAAK,EACpCiB,EAAaC,GAAclB,EAAM,KAAK,EACtCmB,EAAYf,EAAW,OAAS,IAAMS,EAE5C,OACEP,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKN,EAAM,WACzBM,GAAA,cAACc,GAAA,CACC,aAAc1C,EACd,UAAWgB,EACX,SAAUZ,GAAe,YAAckB,EAAM,UAC7C,UAAW,GACX,MAAO,CAAE,GAAGA,EAAO,cAAejB,EAAO,aAAc,EACvD,QAASR,EACT,MAAO0C,GAAY,SAAW,KAC9B,QAASD,EACT,iBAAkBpC,EAClB,QAAUoB,GAAU,CACbiB,GACHjC,EAAwB,UAAWgC,CAAY,EAEjDhC,EACE,QACAiC,GAAY,SAAW,IACzB,EACAzC,EAAewB,CAAK,CACtB,EACA,KAAK,YACP,EACC,CAACmB,GAAab,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACpC,CAEJ,CAAC,EACDR,GACEG,GAAA,cAACe,GAAA,KACCf,GAAA,cAACgB,GAAA,CACC,KAAM1C,EAAmB,QAAU,QACnC,MAAOQ,EACP,MAAOX,EACT,CACF,CAER,CAEJ,CAEJ,CA/HgBsB,EAAA1B,GAAA,UGrBhB,OAAS,aAAAkD,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,WAAY,6CACZ,OAAQ,QACR,MAAO,QACP,QAAS,EACT,WAAY,MACZ,gBAAiB,cACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EAEA,SAAU,CACR,WAAY,CACV,QAAS,CACP,MAAO,OACT,EACA,KAAM,CACJ,MAAO,OACT,CACF,CACF,EAEA,cAAe,CACb,MAAO,EACP,OAAQ,EACR,QAAS,EACT,WAAY,CACd,CACF,CAAC,EAEYG,GAAUF,GAAO,MAAO,CACnC,SAAU,WACV,SAAU,SACV,QAAS,MACT,SAAU,EACV,QAAS,OACT,cAAe,SACf,UAAW,OACX,aAAc,WACd,gBAAiB,aACnB,CAAC,EJ1BM,IAAMG,GAA8B,IAEpC,SAASC,GAAeC,EAAkB,CAC/C,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,eAAAC,EAAgB,eAAAC,EAAgB,UAAAC,CAAU,EAAIL,EAChE,CAACM,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EACxDC,EAAiBH,EAAmB,GAAK,YACzC,CAAE,OAAAI,CAAO,EAAIC,EAAY,EACzBC,EAAmBF,GAAQ,UAAY,gBACvCG,EAAYC,GAAY,EAC9B,OAAAC,GAAU,IAAM,CACd,IAAIC,EAAgD,KAEpD,OAAIX,EACFW,EAAU,WAAW,IAAM,CACzBT,EAAoB,EAAI,CAC1B,EAAGT,EAA2B,GAE9BS,EAAoB,EAAK,EACrBS,GACF,aAAaA,CAAO,GAIjB,IAAM,CACPA,GACF,aAAaA,CAAO,CAExB,CACF,EAAG,CAACX,CAAS,CAAC,EAGZY,GAAA,cAACC,GAAA,CACC,WAAYR,GAAQ,UAAY,gBAAkB,OAAS,UAC3D,UAAW,GAAGD,CAAc,IAAIU,GAAgB,CAAC,GACjD,GAAIC,GAAa,iBACjBH,GAAA,cAACI,GAAA,CACC,MAAOC,GAAK,EAAE,QAAQ,EACtB,OACEL,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACM,GAAA,CAAe,UAAWV,EAAW,EACtCI,GAAA,cAACO,GAAA,CACC,UAAWX,EACX,eAAgBT,EAChB,OAAQ,CAAC,UAAW,gBAAiB,UAAU,EACjD,CACF,EAEJ,EACAa,GAAA,cAACQ,GAAA,KACCR,GAAA,cAACS,GAAA,CACC,aAAc,GACd,MAAOzB,EACP,QAAS,GACT,QAASC,EACT,UAAWY,GAAY,EACvB,eAAgBX,EAChB,iBAAkBS,EACpB,CACF,CACF,CAEJ,CA3DgBe,EAAA5B,GAAA,kBKhBhB,OAAS,QAAA6B,OAAY,eACrB,OAAS,aAAAC,OAAiB,gBAC1B,OAAOC,OAAW,QCJlB,OAAS,eAAAC,OAAmB,gBAC5B,OAAOC,OAAW,QCDlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAA4B,IAEnCC,GAAkBH,GAAU,CAChC,KAAM,CACJ,UAAW,2CACb,EACA,MAAO,CACL,UAAW,6CACb,EACA,MAAO,CACL,UAAW,8CACb,EACA,OAAQ,CACN,UAAW,6CACb,CACF,CAAC,EAEYI,GAAwBH,GAAO,MAAO,CACjD,SAAU,WACV,OAAQ,QACR,KAAM,MACN,UAAW,uBACX,OAAQ,SACV,CAAC,EAEYI,GAAeJ,GAAO,MAAO,CACxC,aAAc,MACd,OAAQ,wBACR,WAAY,cACZ,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,MAAO,cACP,WAAY,CACV,QAAS,CACP,UAAW,GAAGE,EAAe,IAAID,EAAyB,yBAC5D,CACF,EACA,UAAW,CACT,MAAO,gBACP,UAAW,8BACX,UAAW,qCACb,CACF,CAAC,EDpCM,SAASI,IAAwB,CACtC,IAAMC,EAAkBC,EAAc,IAAI,gBAAgB,EAE1D,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,QAAUC,GAAU,CAClB,IAAMC,EAASD,EAAM,cAErBC,EAAO,UAAU,IAAI,QAAQ,EAE7B,WAAW,IAAM,CACfA,EAAO,UAAU,OAAO,QAAQ,CAClC,EAAGC,EAAyB,EAC5BP,EAAgB,CAClB,GACAE,GAAA,cAACM,GAAA,CAAY,KAAM,GAAI,CACzB,CACF,CAEJ,CApBgBC,EAAAV,GAAA,yBEXhB,OAAS,UAAAW,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,IAAK,KACL,UAAW,SACb,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EHeM,SAASG,GAAOC,EAAkB,CACvC,GAAM,CAAE,cAAAC,EAAe,gBAAAC,EAAiB,aAAAC,EAAc,aAAAC,CAAa,EAAIJ,EACjE,CACJ,UAAAK,EACA,eAAAC,EACA,QAAAC,EACA,aAAAC,EACA,eAAAC,EACA,YAAAC,EACA,cAAAC,EACA,aAAAC,EACA,eAAAC,EACA,cAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,EAAgB,EACtDC,EAAmBd,EAAYY,EAAcZ,CAAS,EAAI,KAE1De,EACJC,GAAcF,CAAgB,GAAG,QAAU,IAEvCG,EACFhB,GAAoBD,EAClBkB,EAAeJ,GAAkB,OAAQA,GAAkB,QAAQ,EACnE,IAEAK,EACJ,CAAC,CAAClB,GACFmB,GAAkBT,EAAkBV,EAAe,IAAI,EAEnDoB,EAAmC,CAACC,GACxCb,EACAJ,EACAC,CACF,EAEMiB,EAAoC,CAACD,GACzCb,EACAJ,EACAG,CACF,EAEMgB,EACJ,CAAClB,GAAiB,CAACE,GAAkB,CAACA,EAAe,GAAG,CAAC,EACrD,KACAiB,GAAenB,EAAc,SAAS,EAAGE,EAAe,SAAS,CAAC,EACxE,OACEkB,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,MAAM,EACpB,KAAK,OACL,cAAe1B,EACf,QAASW,EACT,MAAO,CACL,YAAad,GAAgB,aAAe,GAC5C,MAAOA,GAAgB,MAAQ,EACjC,EACA,MAAO,CACL,YAAaD,GAAW,QAAU,GAClC,MAAOA,GAAW,OAAS,EAC7B,EACA,aAAc,IAAMF,EAAa,MAAM,EACvC,MAAO,CACL,MAAOO,EACP,SAAUgB,EACN,OACAH,EACEZ,EACA,EACA,CACF,EACJ,aAAce,EACV,OACAU,GAAqBzB,CAAa,EACtC,MAAOe,EACHW,GAAc,EAAE,kBAAkB,YAClC,MACN,EACA,SAAUnC,IAAoB,SAC9B,QAASA,IAAoB,UAC7B,eAAgBsB,EAChB,iBAAkBc,EAAa,EAC/B,mBAAoB,IAAM,CACxB7B,EAAea,EAAiB,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,CACrD,EACF,EACAS,GAAA,cAACQ,GAAA,IAAsB,CACzB,EACAR,GAAA,cAACG,GAAA,CACC,iBAAkB,CAAC9B,IAAiB,CAAC,CAACU,GAAiBb,GACvD,MAAOkC,GAAK,EAAE,IAAI,EAClB,KAAK,KACL,cAAelC,EACf,MAAO,CACL,YAAaO,GAAc,aAAe,GAC1C,MAAOA,GAAc,MAAQ,EAC/B,EACA,MAAO,CACL,YAAaD,GAAS,QAAU,GAChC,MAAOA,GAAS,OAAS,EAC3B,EACA,iBAAkBgB,EAChBO,GAAenB,EAAeE,CAAc,EAC5C,EACA,CACF,EACA,aAAc2B,GAAoBX,GAAoB,CAAC,EACvD,MAAO,CACL,MAAON,EACLX,EACA,EACA,CACF,EACA,SAAUgB,EACN,OACAL,EACEV,EACA,EACA,CACF,EACJ,UAAWuB,GAAqBxB,CAAY,EAC5C,aAAcgB,EACV,OACAQ,GAAqBvB,CAAc,EACvC,MAAOe,EACHS,GAAc,EAAE,kBAAkB,YAClC,MACN,EACA,aAAc,IAAMlC,EAAa,IAAI,EACrC,SAAUD,IAAoB,SAC9B,QAASA,IAAoB,UAC7B,iBAAkBoC,EAAa,EACjC,CACF,CAEJ,CAvIgBG,EAAA1C,GAAA,UIxBhB,OAAS,eAAA2C,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QCK1C,SAASC,IAGd,CACA,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,YAAAC,CAAY,EAAIC,GAGtC,CACA,QAAS,MAAOC,EAAaC,IAC3B,MAAMC,GAAY,EAAE,aAAaF,EAAaC,CAAO,CACzD,CAAC,EAED,MAAO,CAAE,MAAAL,EAAO,QAAAC,EAAS,YAAAC,CAAY,CACvC,CAbgBK,EAAAR,GAAA,qBDkBhB,IAAMS,GAAiB,IAmBhB,SAASC,GAAa,CAC3B,aAAAC,CACF,EAAoC,CAClC,GAAM,CAAE,MAAOC,EAAY,YAAAC,CAAY,EAAIC,GAAkB,EACvD,CACJ,wBAAyBC,EACzB,SAAAC,EACA,0BAAAC,CACF,EAAIC,EAAY,EAAE,OACZC,EAAmBC,EAAgB,IAAI,iBAAiB,EAExDC,EAASH,EAAY,EAAE,OAAO,EAC9B,CACJ,UAAAI,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,cAAAC,EACA,aAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,wBAAAC,CACF,EAAIC,EAAc,EACZ,CACJ,SAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,YAAAC,CACF,EAAIrB,EAAY,EACVsB,EAAmBtB,EAAY,EAAE,oBAAoB,EACrDuB,EAA2BvB,EAAY,EAAE,4BAA4B,EACrEwB,EAA0BxB,EAAY,EAAE,wBAAwB,EAEhE,CAACyB,EAASC,CAAU,EAAIC,GAAS,EAAI,EACrCC,EAAeX,GAAkBD,EAEjCa,GADqB,CAACzB,GAAa,CAACC,GAGxCyB,GAAe1B,EAAWC,CAAO,GACjC,CAAC0B,GAAiBzB,CAAW,EAEzB0B,GAAaC,EAACR,GAAqB,CACvCC,EAAWD,CAAO,CACpB,EAFmB,cAIbS,EAAQD,EAACE,GAA6B,CAC1C,GAAM,CACJ,UAAA/B,EACA,QAAAC,GACA,YAAAC,EACA,iBAAAgB,GACA,wBAAAE,GACA,yBAAAD,EACA,SAAAP,EACA,aAAAG,EACA,iBAAAD,GACA,iBAAAE,EACF,EAAIe,EAKJ,GAHKV,GACHO,GAAW,EAAI,EAEb,CAACH,IAAqBzB,GAAaC,GAAS,CAC9CK,EAAW,EACX,IAAM0B,GAAcC,GAAuB,CACzC,UAAAjC,EACA,QAAAC,GACA,YAAAC,EACA,iBAAkBgB,GAClB,wBAAAE,GACA,yBAAAD,EACA,QAAStB,EACT,SAAAe,EACA,aAAAG,EACA,iBAAAD,GACA,iBAAAE,GACA,0BAAArB,CACF,CAAC,EACGuC,GAAiB,oBAAqBxC,CAAQ,IAChDsC,GAAY,aAAe,IAE7B1C,EAAW0C,EAAW,EACnB,KAAMG,IAAQ,CACb,IAAMC,GAAaC,GAAahC,EAAc8B,GAAI,OAAO,EACnDG,GAAQC,GACZnC,EACAgC,GACAD,GAAI,aACN,EAEAb,EAAW,EAAK,EAChBZ,EAAwB,SAAUyB,EAAG,EACrC1B,EAAiB6B,EAAK,EAEtBE,GAA+B,CAC7B,kBAAmBL,GAAI,kBACvB,UAAWG,IAAO,WAAa,GAC/B,MAAOA,IAAO,KAChB,CAAC,EAED,IAAMG,GACJH,IACAI,GAAsBJ,GAAO,CAC3B,UAAAtC,EACA,QAAAC,GACA,aAAAuB,EACA,OAAAzB,CACF,CAAC,EACHW,EAAwB,UAAW+B,EAAY,CACjD,CAAC,EACA,MAAOlC,IAAU,CAChB,GAAM,CAAE,MAAOoC,EAAW,EAAIC,GAAkBrC,EAAK,GAEnDoC,IAAY,OAAS,GACrBA,IAAY,OAAS,IAErBrC,EAAW,EAETqC,IAAY,OAAS,IACvBjC,EAAwB,QAASiC,EAAU,EAC3CrB,EAAW,EAAK,EAEpB,CAAC,CACL,CACF,EA/Ec,SAiFRuB,GAAiBC,GACrBC,GAAUhB,GAA6B,CAChCN,IACHK,EAAMC,CAAM,CAEhB,EAAGiB,EAAc,EACjB,CAACvB,EAAiB,CACpB,EAEA,OAAAwB,GAAU,IAAM,CACd,GAAI,CAAC5D,EAAc,CACjBiC,EAAW,EAAK,EAChB,MACF,CACA,GAAIL,IAAgB,UAGpB,IAAIQ,GAAmB,CACrBH,EAAW,EAAK,GACZlB,GAAiBG,GAASC,IAC5BF,EAAW,EAEb,MACF,CACA,GAAI,CAACqB,GAAiBzB,CAAW,GAAKC,GAAe,GAAG,CAAC,EAAG,CAC1DyB,GAAW,EAAK,EAChBrC,EAAY,EACZ,MACF,CAEA,OAAAe,EAAW,EACXsB,GAAW,EAAI,EACfiB,GAAe,CACb,YAAA3C,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAiB,EACA,wBAAAE,EACA,yBAAAD,EACA,SAAUK,EACV,aAAAT,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACMzB,EACT,EAAG,CACD0B,EACAf,EACAF,GAAW,OACXA,GAAW,QACXA,GAAW,WACXC,GAAS,OACTA,GAAS,QACTA,GAAS,WACTwB,GACAP,GAAkB,OAClBzB,EACA0B,EAAyB,OACzBK,EACAT,EACAD,EACA,KAAK,UAAUE,CAAgB,CACjC,CAAC,EAEM,CACL,MAAO,IACLc,EAAM,CACJ,YAAA5B,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAiB,EACA,wBAAAE,EACA,yBAAAD,EACA,SAAUK,EACV,aAAAT,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACH,QAAAK,CACF,CACF,CAlNgBQ,EAAAzC,GAAA,gBVpBhB,IAAM8D,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,oBAAqB,YACrB,WAAY,aACZ,UAAW,IACX,mBAAoB,CAClB,WAAY,cACd,CACF,CAAC,EACYC,GAAgC,IAEtC,SAASC,IAAO,CACrB,IAAMC,EAAWC,GAAY,EACvB,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,aAAAC,EACA,MAAOC,EACP,QAASC,EACT,OAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,0BAAAC,EACA,wBAAAC,CACF,EAAIC,EAAc,EACZ,CAACC,EAAmBC,CAAoB,EAAIC,GAAkB,EAAK,EACnE,CAAE,cAAAC,EAAe,mBAAAC,CAAmB,EAAIC,GAAgB,EAExD,CAAE,MAAOC,EAAY,QAAAC,CAAQ,EAAIC,GAAa,CAAE,aAAAjB,CAAa,CAAC,EAC9D,CAAE,OAAAkB,EAAQ,YAAaC,CAAgB,EAAIC,EAAY,EAEvD,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAAE,YAAAC,CAAY,EAAIC,GAAW,EAC7B,CAACC,EAAuBC,CAAwB,EAAIf,GAAS,EAAK,EAIlEgB,EAAkBC,GAAmB,CACzC,gBAAAT,EACA,cAAeH,EACf,YAAAlB,EACA,MAAOC,EACP,mBAAoBsB,EAAiB,OAAS,EAC9C,MAAOpB,EACP,QAASC,EACT,qBAV2B,EAW7B,CAAC,EAEK2B,EAAeC,GACnBlB,EACAC,EACAK,GAAQ,OACV,EAEMa,EACJ,CAAC,CAACjC,GACF,CAAC,CAACF,GACF,CAAC,CAACC,GACF,IAAImC,GAAUlC,CAAW,EAAE,GAAG,CAAC,GAC/B,CAACmC,GAAkBrC,EAAWC,CAAO,EAEjCqC,EAAgBH,GAAaZ,IAAoB,WAAaH,EAK9DmB,IAFJ,CAACN,GAAiBA,GAAgB1B,GAAQ,QAAQ,UAC1BD,GAAgBD,GAG1CmC,GAAU,IAAM,CACd/B,EAAkB,EAClBE,EAAwB,eAAgB,EAAI,CAC9C,EAAG,CAAC,CAAC,EAEL6B,GAAU,IAAM,CACd1B,EAAqBqB,CAAS,CAChC,EAAG,CAACA,CAAS,CAAC,EAEd,IAAMM,IACDtC,GAAiBE,IAAe,CAACwB,EAChCV,EACA,OAEAuB,EAAqBC,EAACC,GAAkB,CACxCX,GAAgBpB,GAClBC,EAAqB,EAAK,EAC1B,WAAW,IAAM,CACfhB,EAAS8C,CAAK,CAChB,EAAGhD,EAA6B,GAEhCE,EAAS8C,CAAK,CAElB,EAT2B,sBAWrBC,GAAiBF,EAACG,GAAyB,CAC3C3C,GAAe,YAAc2C,EAAM,YACrChB,EAAyB,EAAK,EAC9BtB,EAAiBsC,CAAK,EAE1B,EALuB,kBAOvB,OACEC,GAAA,cAACrD,GAAA,KACCqD,GAAA,cAACC,GAAA,CACC,OAAO,OACP,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,SAAUlB,EAAgB,UAAY,CAACJ,EACvC,OACEI,EAAgB,SAAW,mBAAqBgB,GAAA,cAACG,GAAA,IAAY,EAE/D,UAAS,GACT,QAAS,IAAM,CACTnB,EAAgB,SAAW,iBAC7BW,EAAmBS,EAAiB,OAAO,EAClCpB,EAAgB,SAAW,kBACpCD,EAAyB,EAAI,EAE7BY,EAAmBS,EAAiB,WAAW,CAEnD,GACCpB,EAAgB,KACnB,EAEF,OAAQ,CACN,SAAU,IAAM,CACdW,EAAmBS,EAAiB,OAAO,CAC7C,EACA,cAAe,GACf,MAAO7B,EAAO,OAAS8B,GAAK,EAAE,MAAM,EACpC,OACEL,GAAA,cAACM,GAAA,CACC,OAAQpB,EAAe,CAAC,SAAS,EAAI,OACrC,eAAgBQ,GAChB,eAAgB,IAAMC,EAAmBS,EAAiB,KAAK,EAC/D,gBAAiB,IAAM,CACrBT,EAAmBS,EAAiB,QAAQ,CAC9C,EACF,CAEJ,GACAJ,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CACC,cAAejB,EACf,gBAAiBf,EACjB,aAAcU,EACd,aAAeuB,GAAS,CACtBd,EACEc,IAAS,OACLL,EAAiB,SACjBA,EAAiB,MACvB,CACF,EACF,EACAJ,GAAA,cAACU,GAAA,CAAQ,KAAK,IAAI,EAChBxB,EAiBE,KAhBFc,GAAA,cAACW,GAAA,CACC,MAAOvD,EACP,QAASmC,EACT,MAAOjC,EACP,UAAW,GACX,QAASC,EACT,KAAK,QACL,iBACIC,GAAUA,EAAO,QAAQ,OAAS,EAChC,IAAM,CACJI,EAAwB,eAAgB,EAAK,EAC7C+B,EAAmBS,EAAiB,MAAM,CAC5C,EACA,OAER,EAGDZ,GACCQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACU,GAAA,CAAQ,KAAK,KAAK,EACnBV,GAAA,cAACY,GAAA,CACC,QAASrD,EACT,MAAOD,EACP,oBAAqB,GACrB,aAAcc,EACd,iBAAkBU,EAClB,qBAAsB,CAACF,EACvB,mBAAoB,IAAMG,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,IAAM,CAC3BA,EAAyB,EAAK,EAC9BpB,EAA0B,EAAI,EAC9BgC,EAAmBS,EAAiB,WAAW,CACjD,EACA,iBAAkB,IAChBT,EAAmBS,EAAiB,QAAQ,EAEhD,CACF,EACE,IACN,CACF,EACClB,EACCc,GAAA,cAACa,GAAA,CACC,QAAStB,EACT,eAAgBO,GAChB,MAAO1B,EACP,eAAgBsB,GAChB,UAAW5B,EACb,EACE,IACN,CAEJ,CA1MgB8B,EAAA9C,GAAA,QYnChB,OAAS,QAAAgE,OAAY,eACrB,OACE,SAAAC,GACA,WAAAC,GACA,QAAAC,GACA,kBAAAC,GACA,SAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCKX,SAASC,IAA2B,CACzC,GAAM,CAAE,YAAAC,EAAa,SAAAC,EAAU,OAAAC,CAAO,EAAIC,EAAY,EAChDC,EAAYC,GACZC,EAAkBJ,GAAQ,UAAYK,GAE5C,MAAO,CACL,eAAgBN,GAAYK,EAC5B,UAAAF,EACA,gBAAAE,EACA,eAAiBL,GAAaD,EAAYC,GAAYM,EAAgB,EACtE,cAAe,IAAMP,EAAY,IAAI,CACvC,CACF,CAZgBQ,EAAAT,GAAA,eDCT,SAASU,IAAe,CAC7B,GAAM,CAAE,eAAAC,EAAgB,eAAAC,EAAgB,UAAAC,CAAU,EAAIC,GAAY,EAC5DC,EAAeC,GAAgB,EAE/BC,EAAeJ,EAAU,IAAKK,GAAiB,CACnD,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,QAAAC,CAAQ,EAAIH,EAClC,MAAO,CACL,GAAIC,EACJ,MAAOA,EACP,MACEG,GAAA,cAACC,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BH,CACH,EAEF,QAAS,IAAM,CACbR,EAAeM,EAAa,KAAK,EACjCH,EAAa,CACf,EACA,IAAKO,GAAA,cAACE,GAAA,CAAM,MAAOL,EAAO,EAC1B,MAAOG,GAAA,cAACD,EAAA,IAAQ,CAClB,CACF,CAAC,EAED,OACEC,GAAA,cAACG,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,UAAU,CAC1B,GACAJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CACC,KAAK,UACL,QAAQ,QACR,MAAM,oDACR,EACAN,GAAA,cAACO,GAAA,CAAQ,KAAM,IAAK,EACpBP,GAAA,cAACQ,GAAA,CAAU,MAAOnB,GAChBW,GAAA,cAACS,GAAA,CACC,KACET,GAAA,cAACU,GAAA,CACC,MAAON,GAAK,EAAE,UAAU,EACxB,GAAG,IACH,QAAS,IAAM,QAAQ,IAAI,EAC7B,EAEF,MAAOT,EACT,CACF,CACF,CACF,CAEJ,CAlDgBgB,EAAAvB,GAAA,gBEbhB,OAAS,QAAAwB,OAAY,eACrB,OACE,UAAAC,GACA,YAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QCZhC,OAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACnC,OAAOC,OAAW,QCDlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAsBD,GAAO,KAAM,CAC9C,QAAS,WACT,OAAQ,EACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,SAAU,CACR,SAAU,CACR,KAAM,CACJ,cAAe,MACjB,CACF,CACF,CACF,CAAC,EAEYE,GAAwBF,GAAO,MAAO,CACjD,MAAO,GACP,QAAS,OACT,eAAgB,UAClB,CAAC,EAEYG,GAAoBH,GAAO,MAAO,CAC7C,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,OAAQ,MACV,CAAC,EC7BD,OAAS,YAAAI,GAAU,UAAAC,OAAc,gBAE1B,IAAMC,GAAiBD,GAAOD,GAAU,CAC7C,OAAQ,EACV,CAAC,EFGD,IAAMG,GAAsB,GACrB,SAASC,IAA6B,CAC3C,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMH,EAAmB,EAAG,CAACI,EAAGC,IAC1CH,GAAA,cAACI,GAAA,CACC,WAAU,GACV,IAAKD,EACL,MAAOH,GAAA,cAACK,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,MAAOL,GAAA,cAACK,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACxD,IAAKL,GAAA,cAACM,GAAA,CAAS,QAAS,GAAO,EACjC,CACD,CACH,CAEJ,CAdgBC,EAAAR,GAAA,8BDsBT,SAASS,GAAoB,CAAE,WAAAC,CAAW,EAAc,CAC7D,IAAMC,EAAcC,EAAY,EAAE,YAC5BC,EAAWD,EAAY,EAAE,SAAS,EAClCE,EAA2BF,EAAY,EAAE,4BAA4B,EACrE,CAACG,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnDC,EAAwBN,EAAY,EAAE,sBACtCO,EAAeP,EAAY,EAAE,iBAAiB,EAC9CQ,EACJC,GAAwBR,EAAUC,CAAwB,EAEtDQ,EAAQ,CAAE,UAAWC,GAAK,EAAE,WAAW,EAAG,QAASA,GAAK,EAAE,SAAS,CAAE,EACrEC,EAAiC,CAAC,EACpCd,IAAe,aACjBc,EAAW,KAAK,KAAK,EAEnBd,IAAe,WACjBc,EAAW,KAAK,SAAU,aAAc,WAAW,EAGrD,IAAMC,EAAmBL,EAA8B,OAAQM,GAC7DF,EAAW,SAASE,EAAW,IAAI,CACrC,EAEMC,EACJF,EAAiB,SACjBA,EAAiB,OAAQG,GAAeA,EAAW,QAAQ,EAAE,OAEzDC,EAAmBC,EAAA,IAAM,CAC7BL,EAAiB,QAASG,GAAe,CACnCD,EACFT,EAAsBU,EAAW,UAAU,EAEtCA,EAAW,UACdV,EAAsBU,EAAW,UAAU,CAGjD,CAAC,CACH,EAVyB,oBAYnBG,EAAON,EAAiB,IAAKG,GAAe,CAChD,GAAM,CAAE,SAAAI,EAAU,WAAAC,EAAY,KAAAC,CAAK,EAAIN,EACvC,MAAO,CACL,MAAOO,GAAA,cAACC,GAAA,CAAM,IAAKF,EAAM,KAAM,GAAI,KAAK,WAAW,EACnD,QAAS,IAAM,CACRf,GACHD,EAAsBe,CAAU,CAEpC,EACA,IAAKE,GAAA,cAACE,GAAA,CAAS,QAASL,EAAU,SAAUb,EAAc,EAC1D,MACEgB,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9Bf,GAAK,EAAEU,CAAU,CACpB,EAEF,GAAGL,CACL,CACF,CAAC,EAEKW,EAAgBT,EAACU,GAA+C,CACpE,IAAMC,EAAQD,EAAM,OAAO,MAC3BxB,EAAeyB,CAAK,CACtB,EAHsB,iBAKlBC,EAAeX,EACnB,OAAIhB,IACF2B,EAAeX,EAAK,OAAQH,GAC1Be,GAAaf,EAAW,WAAYb,CAAW,CACjD,GAIAoB,GAAA,cAACS,GAAA,CACC,OAAQ,CACN,MAAOrB,GAAK,EAAEb,CAAU,EACxB,OACEyB,GAAA,cAACU,GAAA,KACCV,GAAA,cAACW,GAAA,CAAO,QAAQ,QAAQ,KAAK,SAAS,QAASjB,GAC5CF,EAAeJ,GAAK,EAAE,cAAc,EAAIA,GAAK,EAAE,YAAY,CAC9D,CACF,CAEJ,GACAY,GAAA,cAACY,GAAA,CAAc,KAAI,IACjBZ,GAAA,cAACa,GAAA,CACC,MAAOjC,EACP,SAAUC,EACV,UAAS,GACT,MAAM,QACN,QAAQ,YACR,YAAaO,GAAK,EAAE,sBAAuB,CACzC,WAAYD,EAAMZ,CAAU,CAC9B,CAAC,EACD,SAAU6B,EACZ,EACC5B,IAAgB,WAAawB,GAAA,cAACc,GAAA,IAA2B,EAEzD,CAACP,EAAa,QAAY3B,EACzBoB,GAAA,cAACe,GAAA,KACCf,GAAA,cAACgB,GAAA,CACC,MAAO5B,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAEAZ,IAAgB,WACdwB,GAAA,cAACiB,GAAA,CAAoB,SAAUjC,GAC5BuB,EAAa,IAAKd,GAAe,CAChC,GAAM,CAAE,WAAAK,EAAY,GAAGoB,CAAW,EAAIzB,EAEtC,OACEO,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKP,EAAW,IAC9BO,GAAA,cAACmB,GAAA,CACC,MAAO,CAAE,OAAQ,MAAO,EACvB,GAAGD,EACJ,SAAU,GACV,WAAU,GACZ,CACF,CAEJ,CAAC,CACH,CAGN,CACF,CAEJ,CA9HgBvB,EAAArB,GAAA,uBI5BhB,OAAS,QAAA8C,OAAY,eACrB,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAUrB,SAASC,IAAa,CAC3B,IAAMC,EAAWC,GAAY,EACvBC,EAAeC,GAAgB,EAE/B,CACJ,cAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,wBAAAC,EACA,MAAOC,CACT,EAAIC,EAAc,EAEZ,CAAE,MAAOC,EAAY,QAASC,CAAc,EAAIC,GAAa,CACjE,aAAAP,CACF,CAAC,EAEKQ,EAAiBC,EAACC,GAAyB,CAC/CT,EAAiBS,CAAK,EACtBR,EAAwB,eAAgB,EAAK,EAC7CL,EAAa,CACf,EAJuB,kBAMjBc,EAAe,MAAMC,EAAiB,QAAQ,GAC9CC,EAAc,MAAMD,EAAiB,OAAO,GAClD,OACEE,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,SAAU,IAAM,CACdpB,EAASkB,CAAW,CACtB,EACA,OAAQ,IAAM,CACZX,EAAwB,eAAgB,EAAK,CAC/C,EACA,MAAOc,GAAK,EAAE,QAAQ,EACtB,OACEF,GAAA,cAACG,GAAA,CACC,eACIlB,GAAiBI,EAAaE,EAAa,OAE/C,OAAQ,CAAC,gBAAiB,SAAS,EACnC,gBAAiB,IAAMV,EAASgB,CAAY,EAC9C,CAEJ,GACAG,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CACC,MAAOd,EACP,QAASC,EACT,eAAgBE,EAClB,CACF,CACF,CAEJ,CArDgBC,EAAAf,GAAA,cCdhB,OAAS,QAAA0B,OAAY,eACrB,OACE,WAAAC,GACA,sBAAAC,GACA,0BAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QCHhC,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCX3C,OAAS,wBAAAC,OAA4B,gBACrC,OAA8B,mBAAAC,OAAuB,YAI9C,IAAMC,GAAeC,EAAA,CAC1BC,EACAC,IACY,CACZ,OAAQA,EAAM,CACZ,KAAKC,GAAqB,IACxB,MAAO,GACT,KAAKA,GAAqB,KACxB,OAAOF,EAAW,OAASG,GAAgB,SAC7C,KAAKD,GAAqB,MACxB,OACEF,EAAW,OAASG,GAAgB,UACpCH,EAAW,OAASG,GAAgB,QACpCH,EAAW,OAASG,GAAgB,IAExC,QACE,OAAOH,EAAW,OAASC,CAC/B,CACF,EAlB4B,gBAoBfG,GAAoBL,EAAA,CAC/BM,EACAC,EACAC,IAEAF,EACG,OAAQL,GAAeF,GAAaE,EAAYO,CAAc,CAAC,EAC/D,OACEP,GACCQ,GAAaR,EAAW,KAAMM,CAAW,GACzCE,GAAaR,EAAW,YAAaM,CAAW,CACpD,EAX6B,qBCzBjC,OAAS,kBAAAG,GAAgB,UAAAC,OAAc,gBAIhC,IAAMC,GAAYC,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,QACZ,CAAC,EAEYC,GAAOD,GAAOE,GAAgB,CACzC,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,CAAC,KAAKC,EAAc,EAAE,EAAG,CACvB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,ECnBD,OAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACnC,OAAOC,OAAW,QAIlB,IAAMC,GAAsB,GACrB,SAASC,IAAwB,CACtC,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMH,EAAmB,EAAII,GACvCF,GAAA,cAACG,GAAA,CACC,IAAKD,EACL,WAAU,GACV,MAAOF,GAAA,cAACI,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,MAAOJ,GAAA,cAACI,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EAC1D,CACD,CACH,CAEJ,CAbgBC,EAAAN,GAAA,yBHaT,SAASO,GAAeC,EAAkB,CAC/C,GAAM,CAAE,KAAAC,EAAM,YAAAC,EAAa,SAAAC,EAAU,mBAAAC,CAAmB,EAAIJ,EACtD,CAACK,EAAaC,CAAc,EAAIC,GAA2BN,CAAI,EAC/D,CAAE,YAAAO,CAAY,EAAIC,EAAY,EAEpCC,GAAU,IAAM,CACdJ,EAAe,CACb,GAAGK,GAAkBV,EAAMC,EAAaE,CAAkB,CAC5D,CAAC,CACH,EAAG,CAACH,EAAMC,EAAaE,CAAkB,CAAC,EAE1C,IAAMQ,EAAaC,EAAA,IACb,CAACR,EAAY,QAAYH,EAEzBY,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAIFH,GAAA,cAACI,GAAA,CAAK,GAAG,KAAK,IAAK,GAAGd,CAAkB,IAAIF,CAAW,IACpDG,EAAY,IAAKc,GAChBL,GAAA,cAACM,GAAA,CACC,IAAK,GAAGD,EAAK,IAAI,IAAIA,EAAK,OAAO,GACjC,WAAU,GACV,QAAS,IAAMhB,EAASgB,CAAI,EAC5B,MAAOL,GAAA,cAACO,GAAA,CAAM,IAAKF,EAAK,KAAM,KAAM,GAAI,EACxC,MACEL,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BH,EAAK,WACR,EAEF,GAAIA,EAAK,QACX,CACD,CACH,EA5Be,cAgCnB,OACEL,GAAA,cAACS,GAAA,KACCT,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BL,GAAK,EAAE,mBAAmB,CAC7B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,EAAG,EACjBP,IAAgB,WAAaM,GAAA,cAACU,GAAA,IAAsB,EACpDhB,IAAgB,WAAaI,EAAW,CAC3C,CAEJ,CArDgBC,EAAAd,GAAA,kBDAT,SAAS0B,GAAqBC,EAAkB,CACrD,GAAM,CAAE,KAAAC,CAAK,EAAID,EACXE,EAAeC,GAAgB,EAC/B,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnD,CAACC,EAAoBC,CAAqB,EAAIF,GAAiB,KAAK,EACpEG,EAAkBC,EAAc,IAAI,gBAAgB,EACpDC,EAAoBD,EAAc,IAAI,kBAAkB,EACxDE,EAAcC,EAAY,EAAE,YAE5BC,EAAcD,EAAY,EAAE,YAAY,CAC5C,KAAAZ,CACF,CAAC,EAIKc,EAFwBC,GAAmBF,CAAW,IAEb,EAE/C,OACEG,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,mBAAmB,CACnC,GACAF,GAAA,cAACG,GAAA,CAAc,KAAI,IAChBL,GACCE,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACI,GAAA,CACC,YAAab,EACb,SAAUD,EACV,YAAaO,EACb,UAAWF,IAAgB,UAC7B,EACAK,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACrB,EAGFL,GAAA,cAACM,GAAA,CACC,MAAOnB,EACP,UAAS,GACT,YAAae,GAAK,EAAE,mBAAmB,EACvC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMd,EAAe,EAAE,EACjC,SAAWmB,GAAUnB,EAAemB,EAAM,OAAO,KAAK,EACxD,EACAP,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAEnBL,GAAA,cAACQ,GAAA,CACC,KAAMX,EACN,YAAaV,EACb,mBAAoBG,EACpB,SAAWmB,GAAe,CACpBzB,IAAS,SACXU,EAAkBe,CAAU,EAE5BjB,EAAgBiB,CAAU,EAE5BxB,EAAa,CACf,EACF,CACF,CACF,CAEJ,CA/DgByB,EAAA5B,GAAA,wBKjBhB,OAAS,QAAA6B,OAAY,eACrB,OAAS,WAAAC,OAAe,gBACxB,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCF5B,OAAS,QAAAC,OAAY,eACrB,OACE,mBAAAC,GACA,WAAAC,GACA,SAAAC,GACA,YAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCNlB,OAAS,aAAAC,OAAiB,QCNnB,IAAMC,GAAwB,CAAC,MAAO,SAAU,SAAS,ECQzD,SAASC,GACdC,EACAC,EACAC,EACe,CAOf,IAAMC,EAAyB,KAAK,MAAM,KAAK,UAAUH,CAAW,CAAC,EACjEI,EAAyB,CAAC,EAK9B,GAHAD,EAAK,KAAKE,EAAyB,EAG7BH,GAAS,OAASF,EAAY,OAASE,EAAQ,MAAO,CAC1D,IAAMI,EAAQJ,EAAQ,MAClBK,EAAsCN,EAE1C,GAAIA,EAAqB,QAAUC,EAAQ,MAAO,CAmBhD,IAAMM,EACJN,EAAQ,MAAQD,EAAqB,OAEvC,QAASQ,EAAI,EAAGA,GAAKD,EAAyCC,IAAK,CACjE,IAAMC,EAAaP,EAAKM,CAAC,EAEzBF,EACEA,EAAoC,OAAQI,GACnCD,EAAW,OAASC,CAC5B,CACL,CACF,CAEAR,EAAK,KACHS,GAAsCL,CAAmC,CAC3E,EAMAH,EAAOD,EAAK,OAAOG,CAAK,CAC1B,CACA,MAAO,CACL,KAAAH,EACA,KAAAC,CACF,CACF,CAnEgBS,EAAAd,GAAA,WAsET,SAASM,GACdS,EACAC,EACA,CACA,IAAMC,EAAWC,GACXC,EAAmBF,EAAS,UAAWG,GAAUA,IAAUL,EAAE,IAAI,EACjEM,EAAmBJ,EAAS,UAAWG,GAAUA,IAAUJ,EAAE,IAAI,EACjEM,EAAcH,EAAmB,GACjCI,EAAcF,EAAmB,GAEvC,OAAIC,GAAeC,EACVJ,EAAmBE,EAAmB,EAAI,GAG/CC,EACK,GAGLC,EACK,EAGF,CACT,CAvBgBT,EAAAR,GAAA,6BAyBT,SAASO,GACdX,EACA,CACA,OAAOY,EAAA,SAAyBC,EAAmBC,EAAmB,CACpE,IAAMQ,EAAoBtB,EAAqB,UAC5CS,GAAeA,IAAeI,EAAE,IACnC,EACMU,EAAoBvB,EAAqB,UAC5CS,GAAeA,IAAeK,EAAE,IACnC,EAEMU,EAAeF,EAAoB,GACnCG,EAAeF,EAAoB,GAEzC,OAAIC,GAAgBC,EACXH,EAAoBC,EAAoB,EAAI,GAGjDvB,EAAqB,SAASa,EAAE,IAAI,EAC/B,GAELb,EAAqB,SAASc,EAAE,IAAI,EAC/B,EAGF,CACT,EAvBO,kBAwBT,CA3BgBF,EAAAD,GAAA,yCA6BT,SAASe,GACdjB,EACAkB,EACS,CACT,MAAO,CAAC,CAACA,EAAc,KAAK,KAAMC,GAASA,EAAK,OAASnB,CAAU,CACrE,CALgBG,EAAAc,GAAA,mBFlHT,SAASG,GACdC,EACAC,EACgB,CAChB,GAAM,CAAE,qBAAAC,EAAsB,uBAAAC,CAAuB,EAAIC,EAAY,EAErEC,GAAU,IAAM,CACd,GAAIJ,GAAS,SAAU,CACrB,IAAMK,EAASC,GAAQP,EAAaE,EAAsBD,CAAO,EAO5DO,GAAgBP,EAAQ,SAAUK,CAAM,GAC3CH,EAAuBF,GAAS,QAAQ,CAE5C,CACF,EAAG,CAACA,GAAS,QAAQ,CAAC,EAEtB,IAAMK,EAASC,GAAQP,EAAaE,EAAsBD,CAAO,EAEjE,MAAO,CACL,KAAMK,EAAO,KACb,KAAMA,EAAO,KACb,QAAS,CAAC,CACZ,CACF,CA5BgBG,EAAAV,GAAA,4BGlBhB,OAAS,UAAAW,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,OACT,IAAK,MACL,oBAAqB,2BACvB,CAAC,EJgBD,IAAME,GAAoB,GAEnB,SAASC,GAAmBC,EAAkB,CACnD,GAAM,CAAE,YAAAC,EAAa,KAAAC,EAAM,WAAAC,EAAY,SAAAC,EAAU,YAAAC,CAAY,EAAIL,EAC3DM,EAAkBC,GAAyBN,EAAa,CAC5D,MAAO,GACP,SAAUE,GAAY,IACxB,CAAC,EAEK,CAAE,YAAAK,CAAY,EAAIC,EAAY,EAC9BC,EAAoBC,EAAc,IAAI,kBAAkB,EACxDC,EAAsBD,EAAc,IAAI,oBAAoB,EAC5DE,EAAqBP,EAAgB,KAAK,OAAS,EAInDQ,EAAoBR,EAAgB,KAAK,SAAW,EACpDS,EAAiB,CAACD,GAAqBD,EAE7C,OACEG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,KACEZ,IAAgB,WACf,MAAM,KAAK,MAAMV,EAAiB,EAAIuB,GACpCL,GAAA,cAACM,GAAA,CAAS,IAAKD,EAAG,QAAQ,UAAU,OAAQ,GAAI,CACjD,EACFb,IAAgB,WACfQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACO,GAAA,CACC,SAAU,CAACpB,EACX,QAAS,IAAM,CACTD,IAAS,OACXU,EAAoB,EAEpBF,EAAkB,CAEtB,GACAM,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,gBAC5CC,GAAK,EAAE,KAAK,CACf,CACF,EACCb,EAAgB,KAAK,IAAKkB,GACzBR,GAAA,cAACS,GAAA,CACC,IAAKD,EAAK,KACV,QAASA,EAAK,UACd,KAAK,SACL,WAAY,EACZ,UAAWE,EAAa,GACxBV,GAAA,cAACO,GAAA,CACC,IAAKC,EAAK,KACV,SAAU,CAAC,CAACrB,GAAcA,EAAW,OAASqB,EAAK,KACnD,QAAS,IAAMpB,EAASoB,CAAI,GAC5BR,GAAA,cAACW,GAAA,CAAM,IAAKH,EAAK,KAAM,KAAM,GAAI,CACnC,CACF,CACD,EAEAV,EACCE,GAAA,cAACO,GAAA,CACC,IAAKjB,EAAgB,KAAK,CAAC,EAAE,KAC7B,SACE,CAAC,CAACH,GACFA,EAAW,OAASG,EAAgB,KAAK,CAAC,EAAE,KAE9C,QAAS,IAAMF,EAASE,EAAgB,KAAK,CAAC,CAAC,GAC/CU,GAAA,cAACW,GAAA,CAAM,IAAKrB,EAAgB,KAAK,CAAC,EAAE,KAAM,KAAM,GAAI,CACtD,EACE,KAEHS,EACCC,GAAA,cAACO,GAAA,CAAgB,QAASlB,EAAa,IAAI,oBACzCW,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,gBAC5CC,GAAK,EAAE,gBAAiB,CACvB,MAAOb,EAAgB,KAAK,MAC9B,CAAC,CACH,CACF,EACE,IACN,CAEJ,CACF,CAEJ,CAtFgBsB,EAAA7B,GAAA,sBKpBhB,OAAS,QAAA8B,OAAY,eACrB,OACE,aAAAC,GACA,WAAAC,GACA,oBAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,WAAAC,GACA,YAAAC,GACA,cAAAC,GACA,mBAAAC,OACK,gBACP,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QCf3C,OAAS,WAAAC,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBAC5C,OAAOC,OAAW,QCHlB,OACE,OAAAC,GACA,aAAAC,GACA,kBAAAC,GACA,UAAAC,GACA,cAAAC,OACK,gBAEA,IAAMC,GAAkBL,GAAI,CACjC,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CAAC,EACYM,GAAoBN,GAAI,CACnC,SAAU,WACV,OAAQ,GACR,MAAO,MACP,SAAU,OACZ,CAAC,EACYO,GAAmBP,GAAI,CAClC,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,OAAQ,MACV,CAAC,EACYQ,GAAqBR,GAAI,CACpC,UAAW,mBACX,WAAY,SACZ,QAAS,OACT,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,SAAU,MACV,WAAY,MACZ,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,UACP,eAAgB,MAClB,CACF,CAAC,EACYQ,GAAyBT,GAAI,CAAC,CAAC,EAC/BU,GAAiBV,GAAI,EAErBW,GAAYR,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,QACZ,CAAC,EAEYS,GAAQT,GAAO,MAAO,CACjC,QAAS,OACT,WAAY,SACZ,eAAgB,CACd,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CACF,CAAC,EACYU,GAAOV,GAAO,KAAM,CAC/B,SAAU,EACV,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,OAAQ,CACN,WAAY,OAEZ,UAAW,CACT,CAAC,MAAMG,EAAiB,EAAE,EAAG,CAC3B,CAAC,MAAME,EAAkB,EAAE,EAAG,CAC5B,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,WAAY,SACd,EAEA,CAAC,MAAMC,EAAsB,EAAE,EAAG,CAChC,OAAQ,OACV,EACA,CAAC,MAAMJ,EAAe,EAAE,EAAG,CACzB,SAAU,WACV,UAAW,oBACX,WAAY,QACd,EACA,CAAC,MAAME,EAAgB,EAAE,EAAG,CAC1B,SAAU,WACV,UAAW,oBACX,OAAQ,OACV,CACF,CACF,CACF,CACF,CAAC,EAEYO,GAAMX,GAAO,MAAO,CAC/B,YAAa,KACb,aAAc,KACd,aAAc,MACd,QAAS,OACT,WAAY,QACd,CAAC,EAEYY,GAAWZ,GAAOC,GAAY,CAAC,CAAC,EAEhCY,GAAmBb,GAAO,MAAO,CAC5C,UAAW,QACX,MAAO,OACP,SAAU,SACV,aAAc,WACd,WAAY,SACZ,CAAC,MAAMO,EAAc,EAAE,EAAG,CACxB,QAAS,qBACT,CAAC,IAAIT,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYgB,GAAMd,GAAO,MAAO,CAC/B,QAAS,OACT,WAAY,MACZ,cAAe,QACjB,CAAC,EAEYe,GAAcf,GAAO,MAAO,CACvC,QAAS,OACT,WAAY,QACd,CAAC,EACYgB,GAAehB,GAAO,MAAO,CACxC,SAAU,WACV,CAAC,KAAKD,EAAc,EAAE,EAAG,CACvB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,EACYkB,GAAMjB,GAAO,MAAO,CAC/B,SAAU,WACV,gBAAiB,cACjB,QAAS,KACT,aAAc,MACd,OAAQ,GACR,MAAO,EACT,CAAC,EAEYkB,GAAelB,GAAOC,GAAY,CAC7C,MAAO,OACP,SAAU,SACV,aAAc,WACd,WAAY,QACd,CAAC,EAEYkB,GAAanB,GAAO,IAAK,CACpC,cAAe,CACb,MAAO,cACT,CACF,CAAC,ED9JM,SAASoB,GAAiBC,EAA8B,CAC7D,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMF,EAAM,IAAI,EAAI,GAC9BC,GAAA,cAACE,GAAA,CACC,IAAK,EACL,WAAU,GACV,MAAOF,GAAA,cAACG,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,IACEH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDH,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,EAClBL,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEF,MACEH,GAAA,cAAC,WACCA,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDH,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,EAClBL,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEJ,CACD,CACH,CAEJ,CA1BgBG,EAAAR,GAAA,oBDsChB,IAAMS,GAAY,GAEZC,GAAaC,EAACC,GAA2B,CAC7C,GAAM,CAAE,QAAAC,EAAS,KAAAC,EAAM,IAAAC,EAAK,MAAAC,EAAO,gBAAAC,EAAiB,qBAAAC,CAAqB,EACvEN,EACIO,EAASN,EAAQ,OAEvB,OACEO,EAAA,cAAC,OAAI,UAAWC,GAAkB,GAC/BP,EACCM,EAAA,cAAC,OAAI,UAAWE,GAAgB,GAAIR,CAAK,EAEzCM,EAAA,cAACG,GAAA,CAAM,UAAWC,GAAiB,GACjCJ,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BT,EAAM,MACT,EACAI,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACO,GAAA,CAAI,IAAKV,GACRG,EAAA,cAACQ,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,IAAKV,GACzCF,EAAM,UACT,CACF,CACF,EAGD,CAAC,CAACH,GACDO,EAAA,cAAC,OACC,UAAW,GAAGS,GAAmB,CAAC,IAChC,CAACf,GAAQgB,GAAuB,CAClC,IACCX,EAAS,GACN,GAAGN,EAAQ,MAAM,EAAG,CAAC,CAAC,MAAMA,EAAQ,MAAMM,EAAS,EAAGA,CAAM,CAAC,GAC7DN,EAAS,IACbO,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCN,EAAA,cAACW,GAAA,CACC,KAAMhB,EACN,OAAO,SACP,IAAI,sBACJ,QAAUiB,GAAMA,EAAE,gBAAgB,GAClCZ,EAAA,cAACa,GAAA,CAAiB,KAAM,GAAI,CAC9B,CACF,CAEJ,CAEJ,EA3CmB,cA6CZ,SAASC,GAAUtB,EAAkB,CAC1C,GAAM,CAAE,KAAAuB,EAAM,YAAAC,EAAc,GAAI,SAAAC,EAAU,mBAAAC,CAAmB,EAAI1B,EAE3D,CAAC2B,EAAQC,CAAS,EAAIC,GAAkBN,CAAI,EAC5CO,EAAcC,EAAY,EAAE,YAC5BC,EAAcD,EAAY,EAAE,YAAY,EACxC,CAACE,EAAaC,CAAc,EAAIL,GAAkB,EAAI,EACtD,CAAE,cAAAM,EAAe,QAASC,CAAc,EAAIC,EAAgB,EAC5D,CAAE,cAAAC,CAAc,EAAIP,EAAY,EAEhCQ,EAAexC,EAAA,IAAM,CACzB6B,EAAUL,EAAK,MAAM,EAAGI,EAAO,OAAS9B,EAAS,CAAC,CACpD,EAFqB,gBAIrB2C,GAAU,IAAM,CACdN,EAAeX,EAAK,OAASI,EAAO,MAAM,CAC5C,EAAG,CAACA,EAAO,MAAM,CAAC,EAElBa,GAAU,IAAM,CACdZ,EAAUL,EAAK,MAAM,EAAG1B,EAAS,CAAC,CACpC,EAAG,CAAC0B,EAAK,MAAM,CAAC,EAEhB,IAAMkB,EAAa1C,EAAA,IACb,CAAC4B,EAAO,QAAYH,EAEpBhB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,EAAA,cAACkC,GAAA,CACC,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAIFnC,EAAA,cAACoC,GAAA,CACC,WAAYX,EAAcM,EAAe,OACzC,YAAcM,GAAU,CACtB,IAAMzC,EAAQuB,EAAOkB,CAAK,EACpBC,EAAeC,GAAcZ,EAAc/B,CAAK,CAAC,EACjDH,EAAUG,EAAM,SAAW,GAC3B4C,EAAahB,EAAY,KAC5BgB,GAAeA,EAAW,OAAS5C,EAAM,UAC5C,EACM6C,EAAaC,GACjBF,GAAY,OAAS,GACrBG,GAASH,GAAY,OAAS,EAAE,EAAI,EAAI,GAC1C,EACMI,EAAYF,GAAcF,GAAY,OAAS,GAAI,IAAI,EAEvD3C,EAAkB,CACtB,QAAS4C,EACT,CAAC,IAAII,EAAS,IAAI,EAAG,CACnB,QAASD,CACX,EACA,gBAAiB,SACnB,EAEM9C,EAAuB,CAC3B,QAAS8C,EACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAASJ,CACX,EACA,MAAO,SACT,EAEA,OACEzC,EAAA,cAAC,OACC,MAAO,CACL,aAAc,CAChB,GACAA,EAAA,cAAC8C,GAAA,CACC,MAAO,CACL,MAAO,OACP,SAAU,SACV,OAAQ,MACV,EACA,YAAWT,EACX,IAAK,GAAGzC,EAAM,MAAM,GAAGA,EAAM,OAAO,GACpC,GAAI,GAAGA,EAAM,MAAM,GAAGA,EAAM,OAAO,GACnC,WAAU,GACV,QAAS,IAAMqB,EAASE,EAAOkB,CAAK,CAAC,EACrC,MACErC,EAAA,cAAC+C,GAAA,KACC/C,EAAA,cAACgD,GAAA,CAAM,IAAKpD,EAAM,MAAO,KAAM,GAAI,EAClCkC,EAAclC,EAAOJ,EAAM,IAAI,GAC9BQ,EAAA,cAACiD,GAAA,KACCjD,EAAA,cAACkD,GAAA,CAAQ,KAAM,GAAI,MAAM,OAAO,CAClC,CAEJ,EAEF,MACEV,GAAY,OAAS,UACnB5C,EAAM,MACP,CAACA,EAAM,MAAQ,CAACH,EACfO,EAAA,cAACG,GAAA,KACCH,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BT,EAAM,MACT,EACAI,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACO,GAAA,CAAI,IAAKV,GACRG,EAAA,cAACQ,GAAA,CACC,QAAQ,OACR,KAAK,SACL,IAAKV,GACJF,EAAM,UACT,CACF,CACF,EACE,OAEN,YACI4C,GAAY,MACZ/C,GACF+C,EAAW,OAAS,SAChBlD,GAAW,CACT,QAAAG,EACA,MAAO0B,EAAOkB,CAAK,EACnB,gBAAAxC,EACA,qBAAAC,EACA,KAAMF,EAAM,KACZ,IAAK4C,EAAW,KAAK,WAClB,MAAM,UAAU,EAChB,KAAK/C,CAAO,CACjB,CAAC,EACDG,EAAM,MAAQ,OAEpB,IACEgC,EACE5B,EAAA,cAACmD,GAAA,KACCnD,EAAA,cAACoD,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDpD,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,EAAA,cAACoD,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEAd,GACEtC,EAAA,cAACqD,GAAA,KACCrD,EAAA,cAACsD,GAAA,CAAa,QAAQ,QAAQ,KAAK,SAChChB,EAAa,MAChB,EACAtC,EAAA,cAAC,UAAI,EACJsC,EAAa,UACZtC,EAAA,cAACK,GAAA,CACC,QAAQ,OACR,UAAWkD,GAAe,EAC1B,KAAK,UACJ,IAAIjB,EAAa,QAAQ,EAC5B,CAEJ,EAIR,CACF,CAEJ,EACA,WAAYnB,EAAO,OACnB,IAAK,GAAGD,CAAkB,IAAIF,CAAW,GAC3C,EA1Ie,cA8InB,OACEhB,EAAA,cAACwD,GAAA,KACCxD,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9B8B,GAAK,EAAE,cAAc,CACxB,EACAnC,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EACjBgB,IAAgB,WAAatB,EAAA,cAACyD,GAAA,CAAiB,KAAMpE,GAAW,EAChEiC,IAAgB,WAAatB,EAAA,cAAC0D,GAAA,CAAK,GAAG,MAAMzB,EAAW,CAAE,CAC5D,CAEJ,CA9KgB1C,EAAAuB,GAAA,aNvET,SAAS6C,GAAoBC,EAAkB,CACpD,GAAM,CAAE,KAAAC,CAAK,EAAID,EACXE,EAAWC,GAAY,EACvBC,EAAeC,GAAgB,EAC/B,CACJ,eAAAC,EACA,aAAAC,EACA,aAAAC,EACA,WAAAC,EACA,kBAAAC,EACA,gBAAAC,CACF,EAAIC,EAAc,EACZC,EAAgBC,EAAgB,IAAI,cAAc,EAClD,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EAGnDC,GADqBjB,IAAS,SAAWK,EAAiBC,IACb,MAAQ,GAGrDY,EAAcC,EAAY,EAAE,YAAY,CAC5C,KAAAnB,CACF,CAAC,EACKoB,EAASD,EAAY,EAAE,OAAO,CAClC,KAAAnB,EACA,WAAYiB,EACZ,UAAWH,EACX,cAAeF,CACjB,CAAC,EAEKS,EAAmBC,EAACC,GAA+B,CACnDvB,IAAS,SACXS,EAAkBc,CAAU,EAE5Bb,EAAgBa,CAAU,CAE9B,EANyB,oBAQnBC,EAAcF,EAACG,GAAiB,CAChCzB,IAAS,SACXO,EAAa,CAAE,MAAAkB,EAAO,KAAM,CAAE,YAAAP,EAAa,OAAAE,CAAO,CAAE,CAAC,EAErDZ,EAAW,CAAE,MAAAiB,EAAO,KAAM,CAAE,YAAAP,EAAa,OAAAE,CAAO,CAAE,CAAC,CAEvD,EANoB,eAOdM,EAAQ,CACZ,OAAQC,GAAK,EAAE,QAAQ,EACvB,YAAaA,GAAK,EAAE,aAAa,CACnC,EAEA,OACEC,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOF,GAAK,EAAE,cAAe,CAAE,KAAMD,EAAM1B,CAAI,CAAE,CAAC,CACpD,GACA4B,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,YAAab,EACb,KAAMlB,GAAQ,SAAW,OAAS,KAClC,WAAYA,IAAS,SAAWK,EAAiBC,EACjD,YAAa,IAAML,EAAS+B,EAAiB,WAAW,EACxD,SAAWT,GAAe,CACxBF,EAAiBE,CAAU,CAC7B,EACF,EACAK,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,MAAOpB,EACP,UAAS,GACT,YAAaa,GAAK,EAAE,cAAc,EAClC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMZ,EAAe,EAAE,EACjC,SAAWoB,GAAUpB,EAAeoB,EAAM,OAAO,KAAK,EACxD,EACAP,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACQ,GAAA,CACC,KAAMhB,EACN,mBAAoBH,EACpB,YAAaH,EACb,KAAMd,EACN,SAAWyB,GAAU,CACnBD,EAAYC,CAAK,EAEjB,IAAMY,EAAkBnB,EAAY,KACjCoB,GAAUb,EAAM,aAAea,EAAM,IACxC,EACID,GACFhB,EAAiBgB,CAAe,EAGlClC,EAAa,CACf,EACF,CACF,CACF,CAEJ,CAjGgBmB,EAAAxB,GAAA,uBSrBhB,OAAS,QAAAyC,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,GAAQ,UAAAC,OAAc,gBACtC,OAAOC,OAAW,QAClB,OAAS,sBAAAC,GAAoB,mBAAAC,OAAuB,mBCHpD,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,YAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,QAAAC,GAAM,UAAAC,GAAQ,aAAAC,OAAiB,gBAEjC,IAAMC,GAAgBF,GAAO,MAAO,CACzC,WAAY,KACZ,QAAS,QACX,CAAC,EAEYG,GAAyBH,GAAO,MAAO,CAClD,QAAS,OACT,SAAU,OACV,IAAK,MACL,CAAC,KAAKC,EAAS,EAAE,EAAG,CAClB,KAAM,QACN,SAAU,QACV,SAAU,MACZ,CACF,CAAC,EAEYG,GAAOJ,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,QAChB,WAAY,SACZ,cAAe,KACjB,CAAC,EAEYK,GAA2BL,GAAO,MAAO,CACpD,SAAU,QACV,QAAS,KACX,CAAC,EAEYM,GAAeN,GAAOD,GAAM,CACvC,MAAO,OACP,WAAY,CACd,CAAC,ECjCD,OAAS,QAAAQ,OAAY,eACrB,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QAIX,SAASC,IAAyB,CACvC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CC,GAAK,EACJ,iGACF,EACAH,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,SAAGG,GAAK,EAAE,SAAS,CAAE,EAAI,IACzBA,GAAK,EACJ,sIACF,CACF,CACF,CAEJ,CAhBgBC,EAAAL,GAAA,0BFoBT,SAASM,IAAW,CACzB,GAAM,CAAE,SAAAC,EAAU,YAAAC,EAAa,eAAAC,EAAgB,kBAAAC,CAAkB,EAC/DC,EAAY,EAEd,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,6BAA6B,CACvC,EACAJ,GAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,GAAA,cAACM,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,WAAY,EACZ,QAASP,GAAA,cAACQ,GAAA,IAAuB,GACjCR,GAAA,cAACS,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EACAT,GAAA,cAACU,GAAA,KACEC,GAAU,IAAI,CAACC,EAAcC,IAAU,CACtC,IAAMC,EAAM,YAAYD,CAAK,GAC7B,OACEb,GAAA,cAACe,GAAA,CACC,IAAKD,EACL,QAAS,IAAM,CACTjB,GACFC,EAAkB,IAAI,EAExBF,EAAYgB,CAAY,CAC1B,EACA,SAAU,CAACf,GAAkBe,IAAiBjB,EAC9C,MAAO,GAAGiB,EAAa,SAAS,CAAC,IACnC,CAEJ,CAAC,EACDZ,GAAA,cAACgB,GAAA,CACC,KAAK,SACL,IAAI,OACJ,IAAI,KACJ,KAAK,OACL,UAAS,GACT,QAAQ,YACR,MAAOnB,GAAkB,GACzB,MAAM,OACN,SAAWoB,GAAU,CACnB,IAAMC,EAAQD,EAAM,OAAO,MACrBE,EAAc,WAAWD,CAAK,EAChCC,GAAeC,IAAgBD,GAAeE,GAChDvB,EAAkBqB,CAAW,EAE7BrB,EAAkB,IAAI,CAE1B,EACA,OACED,GACEG,GAAA,cAACG,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAQ,GAExC,EAGJ,YAAaC,GAAK,EAAE,QAAQ,EAC9B,CACF,CACF,CAEJ,CAlEgBkB,EAAA5B,GAAA,YGvBhB,OAAS,QAAA6B,OAAY,eACrB,OACE,iBAAAC,GACA,eAAAC,GACA,oBAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,gBAAAC,GACA,gBAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,iBAAAC,GACA,QAAAC,GACA,YAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,UAAAC,GACA,UAAAC,GACA,QAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,MAAW,QAClB,OAAS,eAAAC,OAAmB,mBAU5B,IAAMC,GAAeC,GAAO,MAAO,CACjC,MAAO,QACP,OAAQ,KACV,CAAC,EAEKC,GAAa,CACjB,CACE,WACA,KAAMC,EAAA,cAACC,GAAA,CAAc,MAAM,QAAQ,KAAM,GAAI,EAC7C,QACED,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,OAAO,CACjB,CAEJ,EACA,CACE,UACA,KAAMH,EAAA,cAACI,GAAA,CAAa,MAAM,QAAQ,KAAM,GAAI,EAC5C,QACEJ,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,MAAM,CAChB,CAEJ,EACA,CACE,UACA,KAAMH,EAAA,cAACK,GAAA,CAAc,MAAM,QAAQ,KAAM,GAAI,EAC7C,QACEL,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,MAAM,CAChB,CAEJ,CACF,EAEMG,GAAeC,EAACC,GAAqB,CACzC,IAAMC,EAA0B,CAAE,MAAO,OAAQ,KAAM,EAAG,EAE1D,OAAQD,EAAO,CACb,IAAK,OACH,OAAOR,EAAA,cAACK,GAAA,CAAe,GAAGI,EAAW,EACvC,IAAK,OACH,OAAOT,EAAA,cAACI,GAAA,CAAc,GAAGK,EAAW,EACtC,QACE,OAAOT,EAAA,cAACC,GAAA,CAAe,GAAGQ,EAAW,CACzC,CACF,EAXqB,gBAad,SAASC,IAAgB,CAC9B,IAAMC,EAAWC,GAAY,EACvB,CAAE,MAAOC,CAAY,EAAIC,EAAY,EAAE,OACvC,CAAE,SAAAC,EAAU,MAAAP,CAAM,EAAIM,EAAY,EAClC,CAAE,eAAAE,EAAgB,UAAAC,CAAU,EAAIC,GAAY,EAC5CC,EAAkBF,EAAU,KAC/BG,GAAaA,EAAS,QAAUJ,CACnC,GAAG,MAEGK,EAAcP,EAAY,EAAE,YAC5BQ,EAAWR,EAAY,EAAE,SAAS,EAClCS,EAA2BT,EAAY,EAAE,4BAA4B,EACrE,CACJ,OAAQ,CAAE,SAAAU,CAAS,CACrB,EAAIV,EAAY,EACVW,EAAgBC,GAAgB,QAASF,CAAQ,EACjDG,EAAoBD,GAAgB,kBAAmBF,CAAQ,EAC/DI,EAAmBF,GAAgB,WAAYF,CAAQ,EAEvDK,EAAkBf,EAAY,EAAE,gBAChCgB,EAAwBhB,EAAY,EAAE,sBAEtCiB,EAAgCC,GACpCV,EACAC,CACF,EAEMU,EAAgBF,EAA8B,OAAQG,GAC1D,CAAC,SAAU,aAAc,WAAW,EAAE,SAASA,EAAW,IAAI,CAChE,EAEMC,EAAqBF,EAAc,OACnCG,EAA6BH,EAAc,OAC9CC,GAAeA,EAAW,QAC7B,EAAE,OAEIG,EAAkBN,EAA8B,OACnDG,GAAeA,EAAW,OAAS,KACtC,EAEMI,EAAuBD,EAAgB,OACvCE,EAA+BF,EAAgB,OAClDH,GAAeA,EAAW,QAC7B,EAAE,OAEIM,EAAuBjC,EAAA,CAACkC,EAAuBC,IAAkB,CACrE,OAAQrB,EAAa,CACnB,IAAK,UACH,OAAOrB,EAAA,cAAC2C,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,EAC3D,IAAK,SACH,OACE3C,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,aAC5CC,GAAK,EAAE,gBAAgB,CAC1B,EAEJ,QACE,OACEH,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7B,GAAGuC,CAAa,MAAMC,CAAK,EAC9B,CAEN,CACF,EAjB6B,wBAmBvBE,EAAa,CACjB,GAAI,cACJ,MACE5C,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,SAAS,CACnB,EAEF,IACEH,EAAA,cAAAA,EAAA,cACGwC,EAAqBJ,EAA4BD,CAAkB,EACpEnC,EAAA,cAAC6C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC7C,EAAA,cAAC8C,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,QAAS,IAAMnC,EAASoC,EAAiB,OAAO,EAChD,MAAO/C,EAAA,cAACgD,GAAA,CAAY,MAAM,OAAO,KAAM,GAAI,CAC7C,EAEMC,EAAe,CACnB,GAAI,gBACJ,MACEjD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,WAAW,CACrB,EAEF,IACEH,EAAA,cAAAA,EAAA,cACGwC,EACCD,EACAD,CACF,EACAtC,EAAA,cAAC6C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC7C,EAAA,cAAC8C,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,MAAO9C,EAAA,cAACkD,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,QAAS,IAAMvC,EAASoC,EAAiB,SAAS,CACpD,EAEMI,EAAe,CACnB,GAAI,gBACJ,MACEnD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,UAAU,CACpB,EAEF,MAAOH,EAAA,cAACoD,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,IACEpD,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BiB,CACH,EACAnB,EAAA,cAAC6C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC7C,EAAA,cAAC8C,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,QAAS,IAAMnC,EAASoC,EAAiB,SAAS,CACpD,EAEMM,EAAuB,CAC3B,GAAI,yBACJ,MACErD,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EACAH,EAAA,cAAC6C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC7C,EAAA,cAACsD,GAAA,CACC,KAAK,MACL,WAAY,EACZ,UAAWC,EAAa,EACxB,QACEvD,EAAA,cAACwD,GAAA,KACCxD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CC,GAAK,EACJ,+KACF,CACF,CACF,GAEFH,EAAA,cAACyD,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EAEF,MAAOzD,EAAA,cAAC0D,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,IAAK1D,EAAA,cAAC2D,GAAA,CAAO,QAAS9B,EAAiB,EACvC,QAASC,CACX,EAEM8B,EAAY,CAChB,GAAI,aACJ,KAAM5D,EAAA,cAAC6D,GAAA,IAAS,EAChB,MACE7D,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,OAAO,CACjB,EAEF,IACEH,EAAA,cAACH,GAAA,KACCG,EAAA,cAAC8D,GAAA,CACC,UAAWP,EAAa,EACxB,MAAOxD,GACP,MAAOS,EACP,SAAWuD,GAAShD,EAASgD,EAAK,EAAe,EACjD,KAAK,UACL,aAAa,QACf,CACF,EAEF,MAAOzD,GAAaE,CAAK,CAC3B,EAEMwD,EAAuCrC,EACzC,CAAC,EACD,CAACiB,EAAYK,CAAY,EAE7B,OAAKrB,GACHoC,EAAa,KAAKb,CAAY,EAEhCa,EAAa,KAAKX,CAAoB,EAElC,CAACxC,GAAa,aAAe,CAACY,GAChCuC,EAAa,KAAKJ,CAAS,EAI3B5D,EAAA,cAACiE,GAAA,CACC,KAAMjE,EAAA,cAACkE,GAAA,CAAe,WAAU,GAAC,GAAG,IAAI,QAAS,IAAM,QAAQ,IAAI,EAAG,EACtE,MAAOF,EACT,CAEJ,CAnMgBzD,EAAAG,GAAA,iBJzEhB,IAAMyD,GAAcC,GAAO,MAAO,CAChC,YAAa,IACf,CAAC,EAEM,SAASC,IAAe,CAC7B,GAAM,CAAE,iBAAAC,EAAkB,mBAAAC,CAAmB,EAAIC,EAAY,EACvDC,EAAeH,EAAiB,EAEhC,CAAC,CAAEI,CAAe,EAAIC,GAAgB,EACtCC,EAAoBC,GAAmB,EAEvCC,EAAUC,EAAA,IAAM,CAChBH,GAAqBH,IACvBC,EACGM,IACCA,EAAK,yBAAqC,EACnCA,GAET,CAAE,QAAS,EAAK,CAClB,EACAT,EAAmB,mBAAoB,MAAS,EAEpD,EAXgB,WAYhB,OACEU,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,UAAU,CAC1B,GACAF,GAAA,cAACG,GAAA,KACEX,GACCQ,GAAA,cAACI,GAAA,CACC,KAAK,OACL,QAAQ,QACR,MAAOF,GAAK,EACV,uKACF,EACA,OACEF,GAAA,cAACd,GAAA,KACCc,GAAA,cAACK,GAAA,CAAO,KAAK,YAAY,KAAK,QAAQ,QAASR,GAC5CK,GAAK,EAAE,OAAO,CACjB,CACF,EAEJ,EAEFF,GAAA,cAACM,GAAA,IAAS,EACVN,GAAA,cAACO,GAAA,IAAc,CACjB,CACF,CAEJ,CA9CgBT,EAAAV,GAAA,gBKfhB,OAAS,QAAAoB,OAAY,eACrB,OAAS,cAAAC,OAAkB,wCAC3B,OAAS,cAAAC,OAAkB,iCAC3B,OAAS,SAAAC,OAAa,gBACtB,OAAOC,OAAW,QAClB,OAAS,aAAAC,OAAiB,mBCF1B,OAAS,QAAAC,OAAY,eACrB,OACE,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,OACK,wCACP,OACE,UAAAC,GACA,YAAAC,GACA,WAAAC,GACA,cAAAC,GACA,YAAAC,GACA,aAAAC,GACA,eAAAC,GACA,cAAAC,GACA,sBAAAC,OACK,gBACP,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,OAAe,eACtB,OAAS,4BAAAC,OAAgC,cACzC,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QACnD,OAAS,eAAAC,OAAmB,mBCtB5B,OAAS,QAAAC,OAAY,eAErB,IAAMC,GAAa,CACjBC,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,SAAS,EAChBA,GAAK,EAAE,WAAW,EAClBA,GAAK,EAAE,UAAU,EACjBA,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,UAAU,CACnB,EAEO,SAASC,GAAUC,EAAqB,CAC7C,IAAMC,EAAO,IAAI,KAAKD,CAAW,EAC3BE,EAAMD,EAAK,QAAQ,EACnBE,EAAQF,EAAK,eAAe,UAAW,CAAE,MAAO,MAAO,CAAC,EACxDG,EAAOH,EAAK,YAAY,EAM9B,MAAO,GALSA,EAAK,OAAO,IAAM,IAAI,KAAK,EAAE,OAAO,EAEhDH,GAAK,EAAE,OAAO,EACd,GAAGD,GAAWI,EAAK,OAAO,CAAC,CAAC,IAAIC,CAAG,IAAIC,CAAK,IAAIC,CAAI,EAEjC,KAAK,IAAI,KAAKJ,CAAW,EAAE,mBAAmB,CAAC,EACxE,CAXgBK,EAAAN,GAAA,aAaT,SAASO,GAAYC,EAA0B,CAIpD,OAHaA,EAAY,WACrBR,GAAU,SAASQ,EAAY,UAAU,CAAC,EAC1CR,GAAU,SAASQ,EAAY,YAAY,CAAC,CAElD,CALgBF,EAAAC,GAAA,eCzBhB,OAAS,4BAAAE,OAAgC,cACzC,OAAOC,OAAW,QCDlB,OAAS,QAAAC,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,OAAkB,gBAC5C,OAAOC,OAAW,QAEX,IAAMC,GAAgBC,EAAA,CAAC,CAAE,SAAAC,EAAU,QAAAC,CAAQ,IAE9CC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,aAAa,EAC3B,YAAaA,GAAK,EAAE,4CAA4C,EAClE,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASN,GACRK,GAAK,EAAE,gBAAgB,CAC1B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAASL,GAC7DI,GAAK,EAAE,cAAc,CACxB,CACF,EArByB,iBCJ7B,OAAS,QAAAE,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,GAAY,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAEX,IAAMC,GAAgBC,EAAA,CAAC,CAAE,SAAAC,EAAU,QAAAC,CAAQ,IAE9CC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaA,GAAK,EAAE,4CAA4C,EAClE,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASN,GACRK,GAAK,EAAE,gBAAgB,CAC1B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAASL,GAC9DC,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CF,GAAK,EAAE,YAAY,CACtB,CACF,CACF,EAvByB,iBCJ7B,OAAS,QAAAG,OAAY,eACrB,OAAS,4BAAAC,OAAgC,cAElC,IAAMC,GAGT,CACF,CAACD,GAAyB,uBAAuB,EAAG,CAClD,KAAM,UACN,MAAOD,GAAK,EAAE,gBAAgB,CAChC,EACA,CAACC,GAAyB,0BAA0B,EAAG,CACrD,KAAM,UACN,MAAOD,GAAK,EAAE,gBAAgB,CAChC,EACA,CAACC,GAAyB,cAAc,EAAG,CACzC,KAAM,UACN,MAAOD,GAAK,EAAE,iBAAiB,CACjC,CACF,ECnBA,OAAS,SAAAG,OAAa,0BACtB,OAAS,cAAAC,GAAY,UAAAC,OAAc,gBACnC,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,OAAW,QCLlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAkBD,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,QAClB,CAAC,EAEYE,GAAsBF,GAAO,MAAO,CAC/C,SAAU,IACV,iBAAkB,CAChB,SAAU,aACV,QAAS,OACX,CACF,CAAC,EDDM,IAAMG,GAAqBC,EAACC,GAAmC,CACpE,GAAM,CACJ,KAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,qBAAAC,CACF,EAAIN,EACE,CAAE,QAAAO,EAAS,cAAAC,EAAe,MAAAC,CAAM,EAAIC,GAAW,EAC/CC,EAAaR,GAAmB,WAChCS,EAAcD,EAChBE,GAAuBJ,EAAME,CAAU,CAAC,EACxC,KACEG,EAAaH,EAAaH,EAAcG,CAAU,EAAI,KAG5D,OACEI,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAW,KAAMf,EAAM,MAAOC,EAAO,YAAaE,EAAS,EAH9DC,GAAoB,CAAC,CAACM,GAAc,CAAC,CAACC,GAAe,CAAC,CAACE,GAKnDC,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,UAAWC,EAAa,EACxB,MAAOL,EAAW,KAClB,MAAOA,EAAW,IAClB,KAAMH,EACN,MAAOC,EACP,KAAME,EAAW,YACjB,SAAUR,EAEV,QAAS,SACPC,EAAQI,CAAU,EAAE,MAAOS,GAAUC,GAAMD,CAAK,CAAC,EAErD,CACF,CAEJ,CAEJ,EAvCkC,sBJC3B,SAASE,GAAiBC,EAAuB,CACtD,GAAM,CACJ,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,QAAAC,EACA,qBAAAC,CACF,EAAIP,EAEEQ,EACJP,IAAUQ,GAAyB,yBACnCR,IAAUQ,GAAyB,4BACnCR,IAAUQ,GAAyB,eAErC,OACEC,GAAA,cAACC,GAAA,CACC,KAAM,CAAC,CAACV,EACR,QAASC,EACT,UACE,SAAS,eAAeU,GAAa,WAAW,GAAK,SAAS,MAE/DJ,GACCE,GAAA,cAACG,GAAA,CACC,KAAMC,GAAmBb,CAAK,EAAE,KAChC,MAAOa,GAAmBb,CAAK,EAAE,MACjC,kBAAmBI,EACnB,QAASC,EACT,qBAAsBC,EACtB,iBACEN,IAAUQ,GAAyB,wBAEvC,EAEDR,IAAU,UACTS,GAAA,cAACK,GAAA,CAAc,QAASb,EAAS,SAAUC,EAAU,EAEtDF,IAAU,UACTS,GAAA,cAACM,GAAA,CAAc,QAASd,EAAS,SAAUE,EAAU,CAEzD,CAEJ,CA3CgBa,EAAAlB,GAAA,oBMXhB,OAAS,QAAAmB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAMrB,SAASC,GAAyBC,EAA+B,CACtE,GAAM,CACJ,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,WAAAC,EACA,SAAAC,EACA,aAAAC,EACA,UAAAC,EACA,MAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAIZ,EACEa,EAAWC,GAAY,EAE7B,OACEC,GAAA,cAACC,GAAA,CACC,KAAMf,EACN,QAASC,EACT,UACE,SAAS,eAAee,GAAa,WAAW,GAAK,SAAS,MAE/Dd,IAAW,UACVY,GAAA,cAACG,GAAA,CAAW,KAAK,UAAU,MAAOC,GAAK,EAAE,iBAAiB,GACxDJ,GAAA,cAACK,GAAA,CACC,UAAU,WACV,iBAAkBC,EAAa,EAC/B,KAAK,SACL,YAAa,GACb,MAAO,CACL,MAAOjB,EACP,SAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EACA,MAAOC,EACP,MAAOC,EACP,iBAAkBC,EACpB,EACAK,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACQ,GAAA,CACC,QAAQ,OACR,KAAK,SACL,MAAM,aACN,MAAM,UACLZ,CACH,CACF,EAEAI,GAAA,cAACG,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaR,EACf,EAEFI,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EAClBnB,IAAW,WACVY,GAAA,cAACS,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CAEbX,EADa,QACA,CACf,GACAE,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CJ,GAAK,EAAE,MAAM,CAChB,CACF,EAEFJ,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EAClBV,GACCG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACS,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,OAAO,KAAKZ,EAAc,QAAQ,GAChDO,GAAK,EAAE,WAAW,CACrB,EACAJ,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFP,GAAA,cAACS,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAAStB,GAC9Da,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CJ,GAAK,EAAE,aAAa,CACvB,CACF,CACF,CAEJ,CA5FgBM,EAAA1B,GAAA,4BCbhB,OAAO2B,OAAW,QCFlB,OAAS,QAAAC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,YAAAC,OAAgB,gBAC5C,OAAOC,IAAS,YAAAC,OAAgB,QCFhC,OAAS,SAAAC,GAAO,mBAAAC,GAAiB,cAAAC,OAAkB,gBACnD,OAAOC,IAAS,YAAAC,OAAgB,QCHhC,OAAS,OAAAC,GAAK,aAAAC,GAAW,UAAAC,GAAQ,cAAAC,OAAkB,gBAI5C,IAAMC,GAAYC,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,QACZ,CAAC,EAEYC,GAAgBD,GAAO,MAAO,CACzC,MAAO,MACT,CAAC,EAEYE,GAAYF,GAAOG,GAAgB,CAC9C,QAAS,gBACX,CAAC,EAEYC,GAASJ,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,EAEYK,GAAuBL,GAAO,MAAO,CAChD,OAAQ,QACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYM,GAAkBN,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,SAChB,MAAO,OACP,WAAY,MACZ,KAAM,CACR,CAAC,EAEYO,GAAYC,GAAI,CAC3B,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,QAAS,UACT,aAAc,YACd,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,UACb,MAAO,aACT,CAAC,EAEYC,GAAwBF,GAAI,CACvC,QAAS,MACX,CAAC,EAEYG,GAAkBH,GAAI,CACjC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,KACV,CAAC,EAEYI,GAAeJ,GAAI,CAC9B,QAAS,OACT,MAAO,OACP,QAAS,cACT,cAAe,SACf,WAAY,OACd,CAAC,EAEYK,GAAmBL,GAAI,CAClC,MAAO,OACP,QAAS,WACX,CAAC,EAEYM,GAAad,GAAO,IAAK,CACpC,SAAU,MACV,WAAY,OACZ,MAAO,cACP,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYe,GAAgBf,GAAO,MAAO,CACzC,QAAS,OACT,cAAe,SACf,IAAK,IACP,CAAC,EACYgB,GAAchB,GAAOiB,GAAY,CAC5C,UAAW,YACb,CAAC,EC/FD,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAASD,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,EAEYE,GAAaF,GAAO,MAAO,CACtC,WAAY,6BACZ,SAAU,CACR,QAAS,CACP,KAAM,CACJ,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYG,GAAcH,GAAO,MAAO,CACvC,WAAY,8BACZ,UAAW,MACX,SAAU,SACV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,UAAW,OACb,CACF,CACF,CACF,CAAC,EFrBM,SAASI,GAAYC,EAA0B,CACpD,GAAM,CAAE,QAAAC,CAAQ,EAAID,EACd,CAACE,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EAE9D,OACEC,GAAA,cAACC,GAAA,CACC,KAAK,QACL,MAAOL,EAAQ,aACf,gBAAiB,CACf,YAAa,CACX,WAAY,IACd,CACF,EACA,OACEA,EAAQ,gBAAgB,SACtBI,GAAA,cAACE,GAAA,CACC,QAAS,IAAMJ,EAAqBK,GAAS,CAACA,CAAI,EAClD,QAAQ,QACR,KAAK,UACLH,GAAA,cAACI,GAAA,CAAW,QAASP,GACnBG,GAAA,cAACK,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,CACF,EAGJ,OACEL,GAAA,cAACM,GAAA,CAAY,KAAMT,GACjBG,GAAA,cAACO,GAAA,CAAY,QAAQ,OAAO,KAAK,SAAS,MAAM,cAC7CX,EAAQ,gBAAgB,OAC3B,CACF,EAEJ,CAEJ,CAlCgBY,EAAAd,GAAA,eGPhB,OAAS,QAAAe,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,OAAc,gBAC9B,OAAS,4BAAAC,OAAgC,cACzC,OAAOC,OAAW,QAEX,SAASC,GAAaC,EAA0B,CACrD,GAAM,CAAE,cAAAC,EAAe,gBAAAC,EAAiB,QAAAC,EAAS,iBAAAC,CAAiB,EAAIJ,EACtE,OAAMC,EAEFI,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOH,EAAQ,aACf,OACEE,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,UACL,QAAS,IAAM,CACbL,EAAgBM,GAAyB,uBAAuB,EAChEP,EAAc,EAAE,MAAOQ,GAAM,CAC3B,QAAQ,IAAIA,CAAC,CACf,CAAC,CACH,GACCC,GAAK,EAAE,QAAQ,CAClB,EAEJ,EAIFN,IAAqBI,GAAyB,2BAG5CH,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOH,EAAQ,aACf,OACEE,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,UACL,QAAS,IAAM,CACbL,EACEM,GAAyB,0BAC3B,CACF,GACCE,GAAK,EAAE,SAAS,CACnB,EAEJ,EAIGL,GAAA,cAACC,GAAA,CAAM,KAAK,UAAU,MAAOH,EAAQ,aAAc,CAC5D,CA/CgBQ,EAAAZ,GAAA,gBJKT,SAASa,GAAkBC,EAAwB,CACxD,GAAM,CACJ,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,QAAAC,EACA,KAAAC,EACA,0BAAAC,CACF,EAAIN,EAEEO,EAAaC,GAA8BH,CAAI,EAC/CI,EACJJ,EAAK,SAAW,sBAAwB,CAACE,EACrCG,EAAaL,EAAK,SAAW,WAAa,CAACE,EAC3CI,EACHD,GAAc,CAACJ,GACfG,GAAsB,CAACJ,EAAK,aAAa,OAE5C,OACEO,GAAA,cAACC,GAAA,KACER,EAAK,aAAa,IAAI,CAACS,EAAaC,EAAOC,IAAS,CACnD,IAAMC,EAAMF,EAAQD,EAAY,IAC1BI,EAAUH,IAAUC,EAAK,OAAS,EAClCG,GACFD,GAAWR,GAAeD,IAAuB,CAACE,EAChDS,EAAQF,GAAWb,EAAK,SAAW,SAEzC,OACEO,GAAA,cAACS,GAAA,CAAS,IAAKJ,GACbL,GAAA,cAACU,GAAA,CACC,KACEJ,IACKC,GAAW,WAAeC,GAAS,UAAY,UAGtD,MACGN,EAAY,YAET,GAAGA,EAAY,WAAW,MAD1BS,GAAK,EAAE,kBAAkB,EAG/B,OACET,EAAY,KACVF,GAAA,cAACY,GAAA,CACC,QAAQ,QACR,KAAK,SACL,QAAS,IAAM,OAAO,KAAKV,EAAY,IAAK,QAAQ,GACpDF,GAAA,cAACa,GAAA,CAAS,KAAM,GAAI,CACtB,EAGN,CACF,CAEJ,CAAC,EACAd,GAAmBC,GAAA,cAACU,GAAA,CAAM,KAAK,UAAU,MAAOlB,EAAQ,aAAc,EACtEC,EAAK,SAAW,UAAYE,GAC3BK,GAAA,cAACc,GAAA,CACC,cAAezB,EACf,iBAAkBC,EAClB,gBAAiBC,EACjB,QAASC,EACX,EAGDC,EAAK,SAAW,UAAYO,GAAA,cAACe,GAAA,CAAY,QAASvB,EAAS,CAC9D,CAEJ,CAnEgBwB,EAAA7B,GAAA,qBDMT,IAAM8B,GAAiB,IAGvB,IAAMC,GAAWC,EAAA,CAAC,CACvB,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAuB,CACrB,IAAMC,EAA4BJ,EAAK,4BAA8B,GACrE,OAAOA,EAAK,MAAM,IAAI,CAACK,EAAMC,IAAU,CACrC,IAAMC,EACJD,IAAU,EACNN,EAAK,YACLA,EAAK,MAAMM,EAAQ,CAAC,EAAE,cACtBN,EAAK,MAAMM,EAAQ,CAAC,EAAE,kCAC5B,MAAO,CACL,KAAM,CACJ,MAAO,CAAE,YAAaD,EAAK,WAAY,MAAOA,EAAK,UAAY,EAAG,EAClE,MAAO,CACL,YACEG,GAA0BH,EAAK,eAAgBJ,CAAW,GAAK,GACjE,MAAOI,EAAK,oBAAsB,EACpC,EACA,MAAO,CACL,MAAOI,EACLF,EACA,EACA,CACF,EACA,UAAWA,CACb,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaF,EAAK,SAAU,MAAOA,EAAK,MAAO,EACxD,MAAO,CACL,YACEG,GAA0BH,EAAK,aAAcJ,CAAW,GAAK,GAC/D,MAAOI,EAAK,kBAAoB,EAClC,EACA,MAAO,CACL,MAAOI,EACLJ,EAAK,cAAgBA,EAAK,kCAC1B,EACA,CACF,EACA,UACEA,EAAK,cAAgBA,EAAK,iCAC9B,CACF,EACA,QAAS,CACP,YAAaK,GAAsBL,EAAK,UAAWH,CAAQ,EAC3D,MAAOG,EAAK,aAAe,GAC3B,KAAMA,EAAK,WACb,EACA,cAAeA,EAAK,cAChBA,EAAK,cAAc,IAAKM,IACf,CACL,KAAM,CACJ,MAAO,CACL,YACEH,GACEG,EAAa,eACbV,CACF,GAAK,GACP,MAAOU,EAAa,oBAAsB,EAC5C,CACF,EACA,GAAI,CACF,MAAO,CACL,YACEH,GACEG,EAAa,aACbV,CACF,GAAK,GACP,MAAOU,EAAa,kBAAoB,EAC1C,CACF,EACA,QAAS,CACP,YAAaD,GACXC,EAAa,UACbT,CACF,EACA,MAAOS,EAAa,aAAe,GACnC,KAAMA,EAAa,WACrB,CACF,EACD,EACD,CAAC,EACL,OACEC,GAAA,cAACC,GAAA,CACC,KAAMR,EACN,0BAA2BD,EAC1B,GAAGD,EACN,CAEJ,CACF,CAAC,CACH,EA/FwB,YAiGjB,SAASW,GAAaT,EAAkD,CAC7E,GACEU,GAA8BV,CAAI,GAClCA,EAAK,SAAW,UAChBA,EAAK,SAAW,UAEhB,MAAO,UAGT,OAAQA,EAAK,OAAQ,CACnB,IAAK,UACH,MAAO,UACT,IAAK,WACL,IAAK,qBACL,IAAK,UACH,MAAO,cACT,IAAK,SACH,MAAO,QACT,IAAK,UACH,MAAO,WACX,CACF,CArBgBN,EAAAe,GAAA,gBTzCT,SAASE,GAAYC,EAAyB,CACnD,GAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,SAAAC,EAAU,SAAUC,CAAc,EAAIJ,EACzD,CAAE,mBAAAK,EAAoB,QAAAC,EAAS,cAAAC,CAAc,EAAIC,GAAW,EAC5DC,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAAWD,EAAY,EAAE,SAAS,EAClCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAAQC,EAAc,IAAI,MAAM,EAChCC,EAAcC,GAAW,IAAI,YAAY,EACzCC,EAAWC,GAAY,EACvB,CAACC,EAAGC,CAAU,EAAIC,GAAmBC,EAAc,EACnDC,EAAUC,GAA8B,IAAI,EAC5C,CAACC,EAAYC,CAAa,EAAIC,GAAqB,IAAI,EACvD,CAACC,EAAoBC,CAAqB,EAAIF,GAElD,IAAI,EAEAG,EAAWC,EAAA,IAAM,CACrB3B,EAAc,EACdsB,EAAc,IAAI,CACpB,EAHiB,YAKXM,EACJC,GAAqB,IAAI,uBAAuB,EAC5CC,EAAYD,GAAqB,IAAI,UAAU,EAC/CE,EAAsBH,EAAuB,EAC7CI,EAAcC,GAAepC,CAAI,EACjCqC,EAA2BF,GAAa,cAE9CG,GAAU,IAAM,CACYJ,EAAoB,KAC3CK,IAAMA,GAAE,YAAcvC,EAAK,SAC9B,IAEMA,EAAK,SAAW,WAAaA,EAAK,SAAW,UAC/C4B,EAAsB5B,EAAK,MAAM,EACjCiC,EAAUjC,EAAK,SAAS,GACf2B,GACTC,EAAsB,IAAI,EAGhC,EAAG,CAAC5B,EAAK,OAAQA,EAAK,SAAS,CAAC,EAEhCsC,GAAU,IAAM,CACVE,GACFf,EAAcgB,GAAyB,uBAAuB,EAE9DJ,IACEI,GAAyB,4BAC3BJ,IAA6BI,GAAyB,eAEtDhB,EAAcY,CAAwB,EAEtCZ,EAAc,IAAI,CAEtB,EAAG,CAACY,CAAwB,CAAC,EAE7B,IAAMK,EACJC,GAAkC3C,CAAI,EAElC4C,EAAwBT,EAC1BU,GAA6B7C,EAAMmC,CAAW,EAC9C,KACEW,EAAoBX,EACtBY,GAAuB/C,EAAMmC,CAAW,EACxC,KAEEa,EAAWC,GAAYjD,CAAI,EAC3BkD,EAAcC,GAAgBnD,CAAI,EAElCoD,GAAiBtB,EAACuB,IACtB,CAAC,CAAC/C,EAAc+C,EAAU,GAAG,aADR,kBAGjBb,GACJH,IACEI,GAAyB,yBAC3B,CAAC,CAACG,GACF,CAAC,CAACE,GAAmB,aACpBM,GAAeN,EAAkB,UAAU,GAC1C1C,EAAmB0C,EAAkB,WAAYF,CAAqB,GAEpEU,EAAgBd,GAClBnC,EAAQ,KAAK,KAAMyC,EAAkB,WAAYF,CAAqB,EACtE,OAEEW,GAAcC,GAAgBxD,EAAMmC,CAAW,EAC/CsB,EAAQC,GAAS,CACrB,KAAA1D,EACA,cAAAsD,EACA,iBAAkBjB,EAClB,gBAAiBZ,EACjB,QAAS8B,GACT,YAAa/C,EACb,SAAAE,CACF,CAAC,EACKiD,EAAgBF,EAAM,OACtB,CAACG,GAAWC,CAAQ,EAAI,CAAC7D,EAAK,MAAM,CAAC,EAAGA,EAAK,MAAM2D,EAAgB,CAAC,CAAC,EACrEG,GACJD,EAAS,cAAgBA,EAAS,kCAE9BE,GAAW/D,EAAK,MAAM,OAC1B,CAAC+D,GAAUN,KAAUM,GAAW,WAAWN,GAAM,UAAY,EAAE,EAC/D,CACF,EAEMO,EAAehE,EAAK,MAAM,KAC7BiE,IAASA,GAAK,YACjB,GAAG,aAEGC,EAAiBC,EACrB,WACEA,EACEL,GACA,EACA,CACF,CACF,GAAKD,EAAS,YAAc,GAC5B,EACA,CACF,EAEMO,EAAgBD,EACpB,WAAWnE,EAAK,WAAW,GAAK4D,GAAU,cAAgB,GAC1D,EACA,CACF,EAEMS,GAAqBP,GACvBQ,GACE,IAAIC,GAAUT,EAAY,EAAE,aAAaD,EAAS,YAAc,CAAC,CACnE,EACA,GAEEW,GAAoBF,GACxB,IAAIC,GAAUvE,EAAK,WAAW,EAAE,aAAa4D,GAAU,cAAgB,CAAC,CAC1E,EAEMa,GAAmBC,GAAeN,EAAeF,CAAc,EAE/DS,GACJpB,GAAY,gBAAgB,SAAWA,GAAY,aAE/CqB,GACJ5E,EAAK,SAAW,UACd6E,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CACN,OAAQV,EACNL,GACA,EACA,CACF,EACA,MAAOL,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,YACzC,eAAgBmB,GACd9E,EAAK,QAAQyD,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,WAAW,GACtD,SAAW,EACjB,EACA,MAAOF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,WAC3C,CACF,CAAC,EAEDoB,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CACC,QAAQ,OACR,KAAK,SACL,MAAM,aACN,MAAM,UACJN,GAA0D,GAAtCE,GAAK,EAAE,2BAA2B,EACvDnC,EACG,GAAGmC,GAAK,EAAE,CACR,GAAI,0DACJ,OAAQ,CACN,OAAQnC,EAA+B,aACvC,OAAQA,EAA+B,OACvC,WAAYA,EAA+B,UAC7C,CACF,CAAC,CAAC,GACF,EACN,EACCiC,IACCI,EAAA,cAACG,GAAA,CACC,MAAM,SACN,QAAQ,OACR,KAAK,SACL,MAAM,cACNH,EAAA,cAAC,SAAE,SAAO,EAAI,IAAEJ,EAClB,CAEJ,EAGJ,OACEI,EAAA,cAACI,GAAA,CACC,OAAQ,CACN,MAAON,GAAK,EAAE,iBAAiB,EAC/B,SACE7E,EAAK,SAAW,UAAY,IAAMyB,EAAc,QAAQ,EAAI,OAC9D,OAAQzB,EAAK,SAAW,WACtB+E,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,CACC,QAAQ,QACR,KAAK,QACL,KAAK,SACL,QAAS,IAAM5D,EAAc,QAAQ,GACrCsD,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAC7CJ,GAAK,EAAE,QAAQ,CAClB,CACF,CACF,CAEJ,EACA,OACE3B,GACA,CAACvB,GACCoD,EAAA,cAACM,GAAA,CACC,UAAS,GACT,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CACbzE,EAAMZ,EAAM,CAAE,YAAaQ,EAAa,OAAQG,CAAO,CAAC,EACxD,WAAW,IAAM,CAEfK,EADa,QACA,CACf,EAAG,CAAC,CACN,GACC6D,GAAK,EAAE,WAAW,CACrB,GAGJE,EAAA,cAACO,GAAA,CAAc,QAAO,GAAC,KAAI,IACzBP,EAAA,cAACQ,GAAA,KACCR,EAAA,cAAC,OAAI,UAAWS,GAAU,GACxBT,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGJ,GAAK,EAAE,YAAY,CAAC,GAC1B,EACAE,EAAA,cAAC,OAAI,UAAWU,GAAgB,GAC9BV,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5ChF,CACH,EACA8E,EAAA,cAACW,GAAA,CACC,QAAQ,QACR,QAASvE,EAAW,KAAK,KAAMlB,GAAa,EAAE,GAC9C8E,EAAA,cAACY,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,EACAZ,EAAA,cAACa,GAAA,CACC,OAAO,SACP,KAAM,GAAGC,EAAgB,SAAS5F,CAAS,IAC3C8E,EAAA,cAACe,GAAA,CAAS,KAAM,GAAI,CACtB,CACF,CACF,EACAf,EAAA,cAAC,OAAI,UAAWS,GAAU,GACxBT,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGJ,GAAK,EAAE7E,EAAK,WAAa,cAAgB,YAAY,CAAC,GAC5D,EACA+E,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5CjC,CACH,CACF,CACF,EAEA+B,EAAA,cAAC,OAAI,UAAWgB,GAAa,GAC3BhB,EAAA,cAACiB,GAAA,CACC,IAAK7B,EACH,OAAOJ,EAAQ,EACf,EACA,CACF,EACA,KAAMkC,GAAuBC,GAAiBlG,EAAK,KAAK,CAAC,EACzD,MAAO2D,EACT,EACAoB,EAAA,cAACoB,GAAA,CACC,KAAM,CACJ,MAAO,CACL,MAAOhC,EACLnE,EAAK,YACL,EACA,CACF,EACA,SAAUoE,EACV,aAAcI,GACd,UAAWxE,EAAK,WAClB,EACA,MAAO,CACL,YAAayD,EAAM,CAAC,EAAE,KAAK,MAAM,YACjC,MAAOA,EAAM,CAAC,EAAE,KAAK,MAAM,KAC7B,EACA,MAAO,CACL,MAAOA,EAAM,CAAC,EAAE,KAAK,MAAM,MAC3B,YAAaA,EAAM,CAAC,EAAE,KAAK,MAAM,WACnC,CACF,EACA,GAAI,CACF,MAAO,CACL,MAAOU,EACLL,GACA,EACA,CACF,EACA,SAAUI,EACV,aAAcG,GACd,UAAWP,EACb,EACA,MAAO,CACL,YAAaL,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CACL,MAAOF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,MACzC,YAAaF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,WACjD,CACF,EACA,iBAAkBQ,EAChBM,GACA,EACA,CACF,EACA,aAAc2B,GAAoB3B,IAAoB,CAAC,EACzD,CACF,EACAM,EAAA,cAAC,OAAI,UAAWsB,GAAiB,GAC/BtB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BJ,GAAK,EAAE,aAAa,CACvB,CACF,EACAE,EAAA,cAACuB,GAAA,CAAQ,KAAM,EAAG,EAClBvB,EAAA,cAACwB,GAAA,CAAU,IAAKjF,GACbmC,EAAM,IAAI,CAACQ,GAAMuC,KAAU,CAC1B,IAAMC,GAAMD,GACNE,GAAQC,GAAa3G,EAAK,MAAMwG,EAAK,CAAC,EACtCI,GACJF,KAAU,SACVA,KAAU,eACVA,KAAU,WACTA,KAAU,aAAeF,KAAU/C,EAAM,OAAS,EACrD,OACEsB,EAAA,cAAC8B,GAAA,CACC,IAAKJ,GACL,KAAMxC,GACN,KAAK,gBACL,IAAK3C,EACL,MAAOoF,GACP,aAAcF,KAAU,EACxB,SAAUC,GACV,UAAWG,GACX,iBAAkBE,EAAa,EACjC,CAEJ,CAAC,CACH,CACF,EAEA/B,EAAA,cAACgC,GAAA,CACC,MAAOvF,EACP,QAAS,IAAMC,EAAc,IAAI,EACjC,SAAUI,EACV,SAAU3B,EACV,QAASqD,GAAY,gBAAgB,QACrC,kBAAmBT,EACnB,qBAAsB,CAAChC,EACzB,EACAiE,EAAA,cAACiC,GAAA,CACC,KAAM,CAAC,CAACrF,EACR,aAAcqC,EACd,QAAS,IAAMpC,EAAsB,IAAI,EACzC,OAAQ5B,EAAK,SAAW,UAAY,UAAY,SAChD,WAAYmE,EACVL,GACA,EACA,CACF,EACA,SAAUI,EACV,aAAcG,GACd,UAAWC,GAAqBR,EAAY,EAC5C,iBAAkBK,EAChBM,GACA,EACA,CACF,EACA,MAAO,CACL,YAAahB,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CAAE,MAAOF,EAAME,EAAgB,CAAC,EAAE,GAAG,MAAM,KAAM,EACxD,YAAaiB,GACf,CACF,CAEJ,CApYgB9C,EAAAhC,GAAA,ee3EhB,OAAS,QAAAmH,OAAY,eACrB,OAAS,WAAAC,GAAS,YAAAC,GAAU,YAAAC,GAAU,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QCJlB,OAAS,QAAAC,OAAY,eACrB,OAAS,WAAAC,GAAS,YAAAC,GAAU,cAAAC,OAAkB,gBAC9C,OAAOC,OAAW,QCFlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAYD,GAAO,MAAO,CACrC,MAAO,OACP,OAAQ,OACR,QAAS,SACX,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,gBAAiB,cACjB,aAAc,MACd,QAAS,SACX,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,MAAO,MACP,OAAQ,MACR,WAAY,yBACZ,WAAY,MACd,CAAC,EAEYI,GAAyBL,GAAI,CACxC,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYM,GAAoBN,GAAI,CACnC,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYO,GAAaP,GAAI,CAC5B,WAAY,MACZ,QAAS,MACX,CAAC,EAEYQ,GAAqBR,GAAI,CACpC,QAAS,QACX,CAAC,EAEYS,GAA8BT,GAAI,CAC7C,MAAO,MACP,OAAQ,MACR,WAAY,wBACZ,WAAY,MACd,CAAC,EAEYU,GAAmBV,GAAI,CAClC,cAAe,KACjB,CAAC,EAEYW,GAAkBX,GAAI,CACjC,QAAS,OACT,eAAgB,QAChB,WAAY,QACd,CAAC,EAEYY,GAAmBZ,GAAI,CAClC,WAAY,KACZ,QAAS,OACT,WAAY,QACd,CAAC,EAEYa,GAAiBb,GAAI,CAChC,QAAS,OACT,WAAY,QACd,CAAC,EAEYc,GAAiBd,GAAI,CAChC,QAAS,QACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYe,GAAkBf,GAAI,CACjC,QAAS,OACT,WAAY,MACZ,cAAe,IACjB,CAAC,EDpEM,SAASgB,IAAqB,CACnC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAqB,KAAK,eAAe,EAC1CF,GAAA,cAAC,OAAI,UAAU,eACbA,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,GAAK,EAAE,aAAa,CACvB,CACF,EAEAJ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,EAChCN,GAAA,cAAC,OAAI,UAAWO,GAAgB,GAC9BP,GAAA,cAACQ,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,EAC1CR,GAAA,cAACS,GAAA,CAAS,OAAQ,GAAI,QAAQ,cAAc,CAC9C,CACF,EACAT,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,EACAN,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,EACAN,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,CACF,CACF,CAEJ,CAjCgBK,EAAAZ,GAAA,sBDMT,SAASa,GAAuBC,EAAwC,CAC7E,GAAM,CAAE,UAAAC,EAAW,aAAAC,CAAa,EAAIF,EACpC,OACEG,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,iBAAiB,EAC/B,OAAQF,GAAA,cAACG,GAAA,IAAgB,CAC3B,GACCJ,GACCC,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAAC,OAAI,UAAWM,GAAU,GACxBN,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGL,GAAK,EAAE,YAAY,CAAC,GAC1B,EACAF,GAAA,cAAC,OAAI,UAAWQ,GAAgB,GAC9BR,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CP,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAT,GAAA,cAACU,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCV,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,cAAc,EACvDT,GAAA,cAACU,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCV,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,cAAc,CACzD,CACF,EACAT,GAAA,cAAC,OAAI,UAAWM,GAAU,GACxBN,GAAA,cAACO,GAAA,CACC,UAAWI,GAAsB,EACjC,QAAQ,QACR,KAAK,QACL,MAAM,cACNX,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAT,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CP,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,CACF,CACF,EACAT,GAAA,cAACY,GAAA,IAAmB,CACtB,EAED,CAACb,GACAC,GAAA,cAACa,GAAA,KACCb,GAAA,cAACc,GAAA,CACC,MAAOZ,GAAK,EAAE,WAAW,EACzB,YAAaA,GAAK,EAAE,CAClB,GAAI,gDACJ,OAAQ,CAAE,UAAAJ,CAAU,CACtB,CAAC,EACH,CACF,CAEJ,CAEJ,CAtDgBiB,EAAAnB,GAAA,0BhBNT,SAASoB,IAAkB,CAChC,GAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAU,CAACF,EAAM,oBACjBG,EAAeC,GAAgBL,CAAO,EACtC,CAAE,UAAAM,CAAU,EAAIC,GAAiC,EACjDC,EAAeC,GAAgB,EAC/B,CAAE,YAAaC,CAAgB,EAAIC,EAAY,EAErD,GAAI,CAACL,EACH,OACEM,GAAA,cAACC,GAAA,CACC,gBAAiB,CAAE,OAAQ,MAAO,EAClC,KAAK,QACL,MAAOC,GAAK,EACV,0DACF,EACF,EAIJ,IAAMC,EAAeZ,GAAWO,IAAoB,UAE9CM,EAAeV,EACjBF,EAAa,KAAK,CAAC,CAAE,KAAAa,CAAK,IAAMA,EAAK,YAAcX,CAAS,EAC5D,OAEEY,EAAWC,EAAA,IAAM,CACrB,GAAIH,GAAc,GAAI,CACpB,IAAMC,EAAOjB,GAAS,IAAIgB,EAAa,EAAE,EACrCC,GACFG,GAAWH,CAAI,CAEnB,CACF,EAPiB,YASXI,EAAWF,EAAA,SAAY,CAC3B,GAAIH,GAAc,GAChB,GAAI,CACFhB,GAAS,YAAYgB,EAAa,EAAE,EACpCR,EAAa,CACf,OAASc,EAAG,CACV,QAAQ,IAAIA,CAAC,CACf,CAEJ,EATiB,YAUXL,EAAOD,GAAc,KAE3B,MAAI,CAACC,GAAQF,EAETH,GAAA,cAACW,GAAA,CACC,UAAWjB,EACX,aAAcS,EAChB,EAKFH,GAAA,cAACY,GAAA,CACC,KAAMP,EACN,UAAWX,EACX,SAAUY,EACV,SAAUG,EACZ,CAEJ,CAhEgBF,EAAApB,GAAA,mBnIKT,SAAS0B,IAAY,CAO1B,OAAAC,GAAwB,EACxBC,GAAmB,EAEZC,GAAU,CACf,CACE,KAAMC,EAAiB,KACvB,QAASC,GAAA,cAACC,GAAA,IAAK,CACjB,EACA,CACE,KAAMF,EAAiB,OACvB,QAASC,GAAA,cAACE,GAAA,IAAW,CACvB,EACA,CACE,KAAMH,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACG,GAAA,CAAoB,KAAK,SAAS,CAC9C,EACA,CACE,KAAMJ,EAAiB,YACvB,QAASC,GAAA,cAACI,GAAA,CAAqB,KAAK,SAAS,CAC/C,CACF,CACF,EACA,CACE,KAAML,EAAiB,OACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACG,GAAA,CAAoB,KAAK,cAAc,CACnD,EACA,CACE,KAAMJ,EAAiB,YACvB,QAASC,GAAA,cAACI,GAAA,CAAqB,KAAK,cAAc,CACpD,CACF,CACF,EACA,CACE,KAAML,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACK,GAAA,IAAa,CACzB,EACA,CACE,KAAMN,EAAiB,UACvB,QAASC,GAAA,cAACM,GAAA,IAAa,CACzB,EACA,CACE,KAAMP,EAAiB,UACvB,QAASC,GAAA,cAACO,GAAA,CAAoB,WAAW,YAAY,CACvD,EACA,CACE,KAAMR,EAAiB,QACvB,QAASC,GAAA,cAACO,GAAA,CAAoB,WAAW,UAAU,CACrD,CACF,CACF,EACA,CACE,KAAMR,EAAiB,MACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACQ,GAAA,IAAY,CACxB,EACA,CACE,KAAMT,EAAiB,YACvB,QAASC,GAAA,cAACS,GAAA,IAAgB,CAC5B,CACF,CACF,EACA,CACE,KAAMV,EAAiB,QACvB,QAASC,GAAA,cAACU,GAAA,IAAY,CACxB,EACA,CACE,KAAMX,EAAiB,YACvB,QAASC,GAAA,cAACW,GAAA,IAAgB,CAC5B,CACF,CAAC,CACH,CAxFgBC,EAAAjB,GAAA,asJhBhB,OAAS,mBAAAkB,OAAuB,wCAChC,OAAS,sBAAAC,OAA0B,4BACnC,OAAS,mBAAAC,OAAuB,YAChC,OAAS,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QCLhD,OAAS,aAAAC,OAAiB,gBAEnB,IAAMC,GAAaC,EAAA,IACxBC,GAAU,CACR,UAAW,CACT,wJACA,uDACF,CACF,CAAC,EAAE,EANqB,cCanB,SAASC,IAAuC,CACrD,GAAM,CAAE,aAAAC,CAAa,EAAIC,GAAW,EAepC,MAAO,CAAE,eAbmDC,EAAA,SAAY,CACtE,IAAMC,EAAW,MAAM,MACrB,GAAGC,GAAU,UAAU,CAAC,4BAA4BA,GAAU,SAAS,CAAC,EAC1E,EAEA,GAAI,CAACD,EAAS,GACZ,MAAM,IAAI,MAAM,+BAA+BA,EAAS,MAAM,GAAG,EAGnE,IAAME,EAAuB,MAAMF,EAAS,KAAK,EAEjDH,EAAaK,EAAK,OAAO,SAAS,CACpC,EAZ4D,iBAapC,CAC1B,CAjBgBH,EAAAH,GAAA,qBCfhB,OAAS,cAAAO,OAAkB,2BAC3B,OAAS,aAAAC,GAAW,UAAAC,OAAc,QAK3B,SAASC,IAA4B,CAC1C,GAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAYC,GAAmC,CAAC,CAAC,EACjD,CAAE,YAAAC,CAAY,EAAIC,EAAY,EAC9BC,EACJ,IAAI,gBAAgB,SAAS,MAAM,EAAE,iBAA6B,GAAK,GACnEC,EAAcP,EAAMM,CAAU,EAEpCE,GAAU,IAAM,CAEZJ,IAAgB,WAChBE,GACAC,EAAY,WACZ,CAACA,EAAY,YACb,CAACA,EAAY,WACS,CAACL,EAAU,QAAQI,CAAU,IACnDJ,EAAU,QAAQI,CAAU,EAAI,GAC3BP,EAAQO,CAAU,EAE3B,EAAG,CAACC,EAAaH,CAAW,CAAC,CAC/B,CApBgBK,EAAAX,GAAA,uBCJhB,OACE,gBAAAY,GACA,cAAAC,GACA,kBAAAC,GACA,iBAAAC,GACA,4BAAAC,GACA,aAAAC,OACK,wCACP,OAAS,aAAAC,OAAiB,QAMnB,SAASC,IAA6B,CAC3C,IAAMC,EAASC,EAAY,EAAE,OAAO,EAC9BC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAoBD,EAAgB,IAAI,kBAAkB,EAC1DE,EAAkBC,GAAqB,IAAI,gBAAgB,EAC3DC,EAAeC,GAAU,EAE/BC,GAAU,IAAM,CACd,IAAMC,EAAkBC,EAACC,GAA+B,CACtD,GAAM,CAAE,MAAAC,EAAO,KAAAC,EAAM,MAAAC,CAAM,EAAIH,EAO/B,GALGC,EAAM,OAASG,GAAc,cAC5BH,EAAM,SAAWI,GAAyB,SAC1C,CAACC,GAAaJ,CAAI,GACpBD,EAAM,OAASG,GAAc,UAEL,CACxB,IAAMG,EAAcjB,EAAiB,KAClCkB,GAAYA,EAAQ,QAAUN,GAAM,cACvC,EACMO,EACJP,GAAM,iBAAmBA,GAAM,cAC/BZ,EAAiB,KACdoB,GAAWA,EAAO,QAAUR,GAAM,YACrC,EAEFK,GAAef,EAAkB,CAACe,CAAW,EAAGnB,CAAM,EACtDqB,GAAajB,EAAkB,CAACiB,CAAS,EAAGrB,CAAM,CACpD,CAEAK,EAAgBQ,EAAOE,CAAK,CAC9B,EAvBwB,mBAwBxB,OAAAR,EAAa,GAAGgB,GAAW,UAAWb,CAAe,EAE9C,IAAMH,EAAa,IAAIgB,GAAW,UAAWb,CAAe,CACrE,EAAG,CAACH,EAAcL,EAAiB,MAAM,CAAC,EAE1CO,GAAU,IAAM,CACd,IAAMe,EAAmBb,EAACC,GAAgC,CACxD,GAAM,CAAE,MAAAC,EAAO,MAAAE,CAAM,EAAIH,GAGvBC,EAAM,OAASY,GAAe,QAC9BZ,EAAM,OAASY,GAAe,YAE9BpB,EAAgBQ,EAAOE,CAAK,CAEhC,EATyB,oBAUzB,OAAAR,EAAa,GAAGgB,GAAW,WAAYC,CAAgB,EAEhD,IAAMjB,EAAa,IAAIgB,GAAW,WAAYC,CAAgB,CACvE,EAAG,CAACjB,EAAcL,EAAiB,MAAM,CAAC,CAC5C,CApDgBS,EAAAZ,GAAA,8BJCT,SAAS2B,IAAe,CAC7BC,GAAW,EACXC,GAAoB,EACpBC,GAA2B,EAC3B,IAAMC,EAAcC,EAAY,EAAE,YAAY,EACxC,CAAE,mBAAAC,CAAmB,EAAIC,GAAW,EACpC,CAACC,EAAgCC,CAAiC,EACtEC,GAAS,EAAE,EACP,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EACnEG,EAAgBC,GAAWC,EAAa,EAExCC,EAAYZ,EAAY,OAAOa,EAAe,EAE9C,CAAE,eAAAC,CAAe,EAAIC,GAAkB,EAG7CC,GAAgB,CACd,oBAAqBZ,EACrB,wBAAyB,IAAM,CAC7BI,EAAsB,MAAS,CACjC,EACA,mBAAoBD,EACpB,UAAAK,EACA,mBAAAV,CACF,CAAC,EAEDe,GAAU,KACRC,GAAW,KAAK,EAEXC,GAAqB,QAAQ,YAAY,GACvCA,GAAqB,QAAQ,UAAU,EAY9CV,EAAc,gBAAgBJ,CAAiC,EAC/DI,EAAc,mBAAoBW,GAAe,CAC/CZ,EAAsBY,CAAU,EAE9BA,IAAeC,GAAmBjB,CAA8B,IAAI,CAAC,GAErEC,EAAkC,EAAE,CAExC,CAAC,EAEIS,EAAe,EAAE,MAAM,QAAQ,GAAG,EAEhCI,GAAW,SACjB,CAAC,CAAC,CACP,CAxDgBI,EAAA1B,GAAA,gBKjBhB,OAAS,UAAA2B,OAAc,gBAEhB,IAAMC,GAAgBD,GAAO,MAAO,CACzC,WAAY,UACZ,UAAW,aACX,UAAW,OACX,2BAA4B,CAC1B,UAAW,SACb,EACA,oBAAqB,CACnB,aAAc,WACd,WAAY,MACd,EACA,eAAgB,CAAE,cAAe,MAAO,CAC1C,CAAC,E5JHM,SAASE,IAAO,CACrBC,GAAa,EACb,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAY,EACzB,CAAE,YAAAC,CAAY,EAAIC,GAASH,GAAQ,OAAS,CAAC,CAAC,EAC9C,CAAE,eAAAI,CAAe,EAAIC,GAAY,EAEvC,OACEC,GAAA,cAACC,GAAA,CAAY,SAAUH,GACrBE,GAAA,cAACE,GAAA,CAAc,GAAG,iBAAiB,UAAWN,EAAY,GACxDI,GAAA,cAACG,GAAA,IAAU,CACb,CACF,CAEJ,CAbgBC,EAAAZ,GAAA,Q6JRhB,OAAOa,IAAS,WAAAC,OAAe,QCC/B,OACE,gCAAAC,GACA,uBAAAC,OACK,wCACP,OAAS,YAAYC,OAAuB,iCAC5C,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,0CAAAC,OAA8C,4BACvD,OAAS,mBAAAC,OAAuB,cAChC,OAAOC,IAAS,WAAAC,OAAe,QAQ/B,SAASC,GAAaC,EAA+C,CACnE,GAAM,CACJ,UAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,cAAAC,CACF,EAAIC,GAAW,EAETC,EAAeC,GAAQ,IACpBC,GAAoB,CACzB,QAASV,EAAM,QAAUW,GAAU,SAAS,EAC5C,SAAUA,GAAU,UAAU,CAChC,CAAC,EACA,CAACX,EAAM,MAAM,CAAC,EAEXY,EAAcC,EAAY,EAAE,YAAY,EAGxCC,EAAU,CACd,YAHuBC,EAAgB,IAAI,iBAAiB,EAG9B,IAAKC,IAAY,CAC7C,SAAU,CAACA,CAAM,EACjB,KAAMA,EAAO,KACf,EAAE,CACJ,EAEMC,EAAgBC,EAAA,MAAOF,EAAoBG,IAAqB,CACpE,GAAKd,EAAmBW,EAAQG,CAAO,EAGvC,OAAOf,EAAQY,EAAQG,CAAO,CAChC,EALsB,iBAOhBC,EAAiBF,EAACG,GACtB,CAAC,CAACf,EAAce,CAAU,EAAE,aADP,kBAIjBC,EAAiBV,EACpB,OAAQW,GAAeA,EAAW,OAAO,EACzC,OACC,CAACC,EAAqBD,KACnBC,EAAeD,EAAW,IAAI,EAAIA,EAAaC,GAElD,CAAC,CACH,EACIC,EAAiBb,EAAY,OAAOc,EAAe,EACnDC,EAAyBT,EAACU,GAAqB,CACnD,GAAM,CAAE,gBAAAC,CAAgB,EAAIvB,EAAcsB,CAAI,EAC9C,OAAOE,GAA8BD,CAAe,CACtD,EAH+B,0BAIzBE,EAAe9B,EAAU,EAEzB+B,EAA4B,CAChC,KAAM,CACJ,YAAaV,EACb,eAAgBG,EAChB,oBACEQ,GAAuCR,CAAc,EACvD,uBAAAE,CACF,EACA,WAAAzB,EACA,QAAAY,EACA,UAAWiB,EACX,cAAAd,EACA,mBAAAZ,EACA,QAAAD,EACA,MAAAD,EACA,eAAAiB,CACF,EAEMc,EAAcC,GAAW,IAAI,YAAY,EAE/C,OACEC,GAAA,cAACC,GAAA,CACC,WAAY,CAAC7B,CAAY,EACzB,QAASwB,EACT,sBAAwBM,GAAY,CAClCC,GAA6BD,CAAO,CACtC,EACA,SAAU,CAACJ,GACVlC,EAAM,QACT,CAEJ,CApFSkB,EAAAnB,GAAA,gBAsFT,IAAOyC,GAAQzC,GCxGf,OAAS,cAAA0C,OAAkB,iCAC3B,OAAOC,IAAS,iBAAAC,GAAe,cAAAC,OAAkB,QCCjD,OACE,cAAAC,GACA,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,OACK,wCAQA,IAAMC,GAAN,KAAoB,CAjB3B,MAiB2B,CAAAC,EAAA,sBACjB,QACA,QAER,YAAYC,EAA8BC,EAA+B,CACvE,KAAK,QAAUD,EACf,KAAK,QAAUC,CACjB,CAEO,aAAc,CACnB,OAAOC,GAAgB,KAAK,OAAO,CACrC,CAEO,eAAeC,EAAmB,CACvC,OAAO,KAAK,mBAAmBA,CAAI,EAAE,IACvC,CAEO,qBAAqBA,EAAmB,CAC7C,OAAO,KAAK,mBAAmBA,CAAI,EAAE,MACvC,CAEO,sBAAsBA,EAAmB,CAC9C,OAAO,KAAK,mBAAmBA,CAAI,EAAE,OACvC,CAEO,MAAMA,EAAmBC,EAAY,CAC1C,OAAO,KAAK,QAAQ,UAAUD,EAAMC,CAAI,CAC1C,CAEO,OAAOC,EAAY,CACxB,IAAMC,EAAQ,KAAK,SAAS,IAAID,CAAE,EAC9BC,GACFC,GAAWD,CAAK,CAEpB,CAEQ,mBAAmBH,EAAmB,CAC5C,IAAMK,EAAcC,GAAeN,CAAI,EACvC,MAAO,CACL,KAAMK,EACN,OAAQA,EAAcE,GAAuBP,EAAMK,CAAW,EAAI,KAClE,QAASA,EACLG,GAA6BR,EAAMK,CAAW,EAC9C,IACN,CACF,CACF,EDhDO,IAAMI,GAAoBC,GAE/B,MAAS,EAEJ,SAASC,GAAWC,EAAgC,CACzD,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EACzBC,EAAcC,GAAW,IAAI,YAAY,EACzCC,EAAYC,EAAc,IAAI,MAAM,EACpCC,EAAU,IAAIC,GAAcP,EAAS,CAAE,UAAAI,CAAU,CAAC,EAClDI,EAAUC,EAAgB,IAAI,iBAAiB,EAC/CC,EAAYD,EAAgB,IAAI,QAAQ,EACxCE,EAAeC,GAAwBJ,CAAO,EAC9CK,EAAUJ,EAAgB,IAAI,kBAAkB,EAChDK,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAWF,EAAY,EAAE,SAAS,EAClCG,EAAgBH,EAAY,EAAE,YAC9BI,EAAgBC,GAAY,EAAE,cAC9BC,EAAgBC,GAAqB,EAAE,uBAAuB,EAG9DC,EAAoC,CACxC,YAAArB,EACA,sBAAuBsB,GAAW,WAClC,QAAAlB,EACA,QAAS,CACP,UAAAI,EACA,QAAAF,EACA,aAAAG,EACA,QAAAE,CACF,EACA,KAAM,CACJ,YAAAC,EACA,OAAAE,EACA,SAAAC,EACA,cAAAC,CACF,EACA,cAAAC,EACA,cAAe,CACb,KAAME,CACR,CACF,EAEA,OACEI,GAAA,cAAC7B,GAAkB,SAAlB,CAA2B,MAAO2B,GAChCxB,EAAM,QACT,CAEJ,CA5CgB2B,EAAA5B,GAAA,cA8CT,SAAS6B,IAAwC,CACtD,IAAMC,EAAUC,GAAWjC,EAAiB,EAC5C,GAAI,CAACgC,EACH,MAAM,IAAI,MACR,gEACF,EAEF,OAAOA,CACT,CARgBF,EAAAC,GAAA,aFtDT,SAASG,GAAeC,EAAqC,CAClE,GAAM,CAAE,cAAAC,EAAe,OAAAC,CAAO,EAAIF,EAElC,OAAAG,GAAQ,IAAM,CACZC,GAAW,CACT,QAASF,GAAQ,QAAUG,GAC3B,SAAUH,GAAQ,QAAUI,EAC9B,CAAC,CACH,EAAG,CAACJ,EAAO,OAAQA,EAAO,MAAM,CAAC,EAG/BK,GAAA,cAACC,GAAA,CAAc,OAAQN,EAAQ,cAAeD,GAC5CM,GAAA,cAACE,GAAA,CAAa,OAAQP,EAAO,QAC3BK,GAAA,cAACG,GAAA,KAAYV,EAAM,QAAS,CAC9B,CACF,CAEJ,CAjBgBW,EAAAZ,GAAA,kB/JDT,SAASa,GAAOC,EAAuC,CAC5D,IAAMC,EAA2BD,EAAM,QAAQ,gBAE/C,OACEE,GAAA,cAACC,GAAA,KACEF,EACCC,GAAA,cAACE,GAAA,IAAK,EAENF,GAAA,cAACG,GAAA,CAAe,OAAQL,EAAM,QAAUM,IACtCJ,GAAA,cAACE,GAAA,IAAK,CACR,CAEJ,CAEJ,CAdgBG,EAAAR,GAAA",
4
+ "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n Tokens,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteEventData,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepEventData,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n readAccountAddress,\n useWallets,\n Events as WalletEvents,\n} from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n RouteEventData,\n StepEvent,\n StepEventData,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n ConnectedWallet,\n Tokens,\n WidgetVariant,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://explorer.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type {\n OnWalletConnectionChange,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useMemo, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n onDisconnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const { updateConfig, updateSettings, fetch: fetchMeta } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const config = useAppStore().config;\n\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnWalletConnectionChange>();\n const onDisconnectWalletHandler = useRef<OnWalletConnectionChange>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n window['__rango'] = {\n config,\n dappConfig: props.config,\n };\n }\n }, [props.config]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, tokens);\n }\n } else {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const handlers = useMemo(\n () => ({\n onConnectWallet: (handler: OnWalletConnectionChange) => {\n onConnectWalletHandler.current = handler;\n },\n onDisconnectWallet: (handler: OnWalletConnectionChange) => {\n onDisconnectWalletHandler.current = handler;\n },\n }),\n []\n );\n\n return (\n <WidgetContext.Provider value={handlers}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { ProvidersOptions } from '../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../store/wallets';\nimport { matchAndGenerateProviders } from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { httpService } from '../services/httpService';\nimport {\n createTokenHash,\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, tokens) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts, tokens);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n\n const connectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n const walletSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType !== connectedWallet.walletType &&\n connectedWallet.selected\n );\n const walletNotSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType === connectedWallet.walletType &&\n !connectedWallet.selected\n );\n if (walletSelected) {\n return { ...connectedWallet, selected: false };\n } else if (walletNotSelected) {\n return { ...connectedWallet, selected: true };\n }\n\n return connectedWallet;\n }),\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, tokens, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n }))\n )\n);\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokenHash,\n TokensBalance,\n Wallet,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Asset,\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, Token, WalletDetail } from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\nimport {\n detectInstallLink,\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport { isCosmosBlockchain } from 'rango-types';\n\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\n showOnMobile,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedBlockchains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedBlockchains) {\n return null;\n }\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedBlockchains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null,\n isContractWallet: boolean\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedBlockchains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedBlockchains.length > 0;\n const isSupported = supportedBlockchains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n /*\n * Here we check given `network` is not supported by wallet\n * And also the network is known.\n */\n if (notSupportedNetworkByWallet) {\n return;\n }\n\n /*\n * In some cases we can handle unknown network by checking its address\n * pattern and act on it.\n * Example: showing our evm compatible network when the unknown network is evm.\n * Otherwise, we stop executing this function.\n */\n const isUnknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUnknownAndEvmBased) {\n return;\n }\n\n const isEvmBasedChain = evmBasedChains.includes(network);\n\n // If it's an evm network, we will add the address to all the evm chains.\n if (isEvmBasedChain || isUnknownAndEvmBased) {\n if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n retrievedBalance: WalletDetail,\n tokens: Token[]\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return (\n cosmosExperimentalChainInfo &&\n cosmosExperimentalChainInfo[wallet]?.experimental\n );\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: Wallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.usdValue || '0') -\n parseFloat(token1Balance?.usdValue || '0')\n );\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.CONNECTED) ||\n Number(\n b.state === WalletStatus.DISCONNECTED ||\n b.state === WalletStatus.CONNECTING\n ) -\n Number(\n a.state === WalletStatus.DISCONNECTED ||\n a.state === WalletStatus.CONNECTING\n )\n );\n}\n\nexport function getConciseAddress(\n address: string,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxChars = 8,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ellipsisLength = 3\n): string {\n if (address.length < 2 * maxChars + ellipsisLength) {\n return address;\n }\n const start = address.slice(0, maxChars);\n const end = address.slice(-maxChars);\n return `${start}${'.'.repeat(ellipsisLength)}${end}`;\n}\n\nexport function getAddress({\n chain,\n connectedWallets,\n walletType,\n}: {\n connectedWallets: ConnectedWallet[];\n walletType: string;\n chain: string;\n}): string | undefined {\n return connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n )?.address;\n}\n\nexport function createTokenHash(token: Asset): TokenHash {\n return `${token.blockchain}-${token.symbol}-${token.address ?? ''}`;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nimport { TOOLTIP_DECIMALS } from '../constants/routing';\n\n/*\n * if time > 1h -> rounded with 5 minutes precision\n * if time < 1h -> rounded with 15 seconds precision\n */\nexport const roundedSecondsToString = (s: number): string => {\n const seconds = Math.floor((s % 60) / 15) * 15;\n const minutes = parseInt((s / 60).toString());\n if (minutes >= 60) {\n return `${Math.floor(minutes / 5) * 5}:00`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n\nexport function formatTooltipNumbers(\n number: BigNumber | string | number | null | undefined\n) {\n return numberToString(number, TOOLTIP_DECIMALS, TOOLTIP_DECIMALS).replace(\n /(?:\\.0*|(\\.\\d+?)0*)$/,\n '$1'\n );\n}\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import { StoreApi, UseBoundStore } from 'zustand';\n\ntype State = object;\n\ntype WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nconst createSelectors = <S extends UseBoundStore<StoreApi<State>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let k of Object.keys(store.getState())) {\n (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]);\n }\n\n return store;\n};\n\nexport default createSelectors;\n", "import type { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n variant: 'default',\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import type { Token } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\n function wrapper(...args: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, time);\n }\n}\n\nexport function containsText(text: string, searchText: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { areTokensEqual } from './wallets';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => areTokensEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { Balance } from '../../types';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { isTokenExcludedInConfig } from '../../utils/configs';\nimport { isTokenNative } from '../../utils/meta';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokens: Token[];\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map<string, BlockchainMeta>(),\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const tokensFromState = get()._tokens;\n const blockchainsMapByName = get()._blockchainsMapByName;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n {};\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n if (\n supportedTokensConfig &&\n isTokenExcludedInConfig(token, supportedTokensConfig)\n ) {\n return false;\n }\n\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //3. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //4. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //5. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Chinese,\n English,\n Finland,\n French,\n German,\n Greece,\n Italian,\n Japanese,\n Netherlands,\n Poland,\n Portuguese,\n Russian,\n Spanish,\n Swedish,\n Ukrainian,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Chinese', label: '\u4E2D\u56FD\u4EBA', local: 'zh', SVGFlag: Chinese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Ukrainian', label: '\u0423\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Swedish', label: 'svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'Greek', label: 'Grieks', local: 'el', SVGFlag: Greece },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\n", "const LOW = 0.5;\nconst MEDIUM = 1;\nconst HIGH = 3;\n\nexport const SLIPPAGES = [LOW, MEDIUM, HIGH];\n\nexport const DEFAULT_SLIPPAGE = 1;\n\nexport const HIGH_SLIPPAGE = 5;\n\nexport const MAX_SLIPPAGE = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { ConfigSlice } from './config';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features, theme } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const singleTheme = theme?.singleTheme;\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(singleTheme && { theme: nextConfig.theme?.mode || 'light' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n });\n },\n});\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { PropsWithChildren } from 'react';\n\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nexport function AppRouter({ children }: PropsWithChildren) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n\n return <Router>{children}</Router>;\n}\n", "import { I18nManager } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { useBootstrap } from '../../hooks/useBootstrap';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n useBootstrap();\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <AppRoutes />\n </MainContainer>\n </I18nManager>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n ],\n },\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\nimport { areTokensEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.from?.token || null)\n );\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.to?.token || null)\n );\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type { QuoteError, QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { createRetryQuote, getQuoteToTokenUsdPrice } from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\n\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\n subscribeWithSelector((set) => ({\n fromBlockchain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toBlockchain: null,\n toToken: null,\n refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: state.toToken\n ? getUsdValue(state.toToken, state.outputAmount?.toString() || '')\n : new BigNumber(0),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n },\n tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote?.outputAmount ?? '');\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, tokens);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { SwapFee, TagValue } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport const NAME_OF_FEES: Record<NameOfFees, string> = {\n 'Network Fee': i18n.t('Network Fee'),\n 'Swapper Fee': i18n.t('Protocol Fee'),\n 'Affiliate Fee': i18n.t('Affiliate Fee'),\n 'Outbound network fee': i18n.t('Outbound Fee'),\n 'Rango Fee': i18n.t('Rango Fee'),\n};\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type {\n BlockchainValidationStatus,\n RouteTag,\n RoutingResultType,\n SwapResult,\n} from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n\nexport type QuoteResponse = {\n requestId: string;\n swaps?: SwapResult[];\n diagnosisMessages: string[] | null;\n};\n\nexport type SelectedQuote = {\n swaps: SwapResult[];\n requestId: string;\n outputAmount?: string;\n resultType?: RoutingResultType;\n tags?: RouteTag[];\n validationStatus: BlockchainValidationStatus[] | null;\n requestAmount: string;\n};\n\nexport type QuoteErrorResponse = {\n message: string;\n options: QuoteError;\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getRequiredChains } from './wallets';\n\nexport function getOutputRatio(\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n if (\n !inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)\n ) {\n return 0;\n }\n return outputUsdValue\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote\n );\n}\n\nexport function requiredWallets(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\n): BigNumber {\n let totalFeeInUsd = ZERO;\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n swaps: SwapResult[],\n allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\n };\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n default:\n message = message || '';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return pendingSwap.status === 'failed';\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n", "import type { BlockchainMeta, SwapResult } from 'rango-sdk';\n\nexport function getRequiredWallets(swaps: SwapResult[] | null): string[] {\n const wallets: string[] = [];\n\n swaps?.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\n chain: BlockchainMeta,\n address: string\n): boolean {\n const regex = chain.addressPatterns;\n const valid = regex.filter((r) => new RegExp(r).test(address)).length > 0;\n return valid;\n}\n", "import type { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n searchParamToToken,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n\n const getUrlSearchParams = () => {\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl } = getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n const fromToken = searchParamToToken(\n tokens,\n searchParams.fromToken,\n fromBlockchain ?? null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n const toToken = searchParamToToken(\n tokens,\n searchParams.toToken,\n toBlockchain ?? null\n );\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nexport function searchParamToToken(\n tokens: Token[],\n searchParam: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParam?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n styled,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const location = useLocation();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const [isConfirming, setIsConfirming] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n setIsConfirming(true);\n await addNewSwap();\n setIsConfirming(false);\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain =\n selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!selectedQuote?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n quoteWalletsChanged = true;\n }\n }\n\n if (selectedQuote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!selectedQuote) {\n navigate(`../${location.search}`);\n }\n }, []);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={false}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n }}\n footer={\n <Buttons>\n <div className={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!isActiveTab}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded\n tagHidden\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { confirmSwapDisabled } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n alarmsStyles,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const config = useAppStore().config;\n\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n\n const requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!selectedQuote?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const getInitialSelectableWallets = () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n });\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const isAddressMatched =\n !!customDestination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, customDestination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setCustomDestination(null);\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\n });\n });\n };\n\n const onChange = (wallet: Wallet) => {\n if (showMoreWalletFor) {\n setShowMoreWalletFor('');\n }\n const selected = isSelected(wallet.walletType, wallet.chain);\n if (selected) {\n return;\n }\n const connectedWallet = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.walletType &&\n connectedWallet.chain === wallet.chain\n );\n\n if (!connectedWallet) {\n return;\n }\n\n onCancel();\n if (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\n return (\n <div key={key}>\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CustomCollapsible\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}\n hasSelected\n open={showCustomDestination}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() =>\n setShowCustomDestination((prev) => !prev)\n }>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={customDestination || ''}\n onChange={(e) => {\n const value = e.target.value;\n if (!value.length) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n } else {\n setCustomDestination(value.length ? value : null);\n }\n }}\n />\n </CustomCollapsible>\n\n {isAddressMatched && (\n <div className={alarmsStyles()}>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n overflow: 'hidden',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { css, darkTheme, IconButton, styled, TextField } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n outline: 0,\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral100',\n },\n});\n\nexport const alarmsStyles = css({\n paddingTop: '$5',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$0 $15 $15 $15',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomRightRadius: '0',\n borderBottomLeftRadius: '0',\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n $$background: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n", "import type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { WalletModal } from '../WalletModal';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\n const [experimentalChainWallet, setExperimentalChainWallet] =\n useState<Wallet | null>(null);\n const [showExperimentalChainModal, setShowExperimentalChainModal] =\n useState(false);\n const [addingExperimentalChainStatus, setAddingExperimentalChainStatus] =\n useState<'in-progress' | 'completed' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick, disconnectConnectingWallets } =\n useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(list);\n const numberOfSupportedWallets = list.length;\n const shouldShowMoreWallets = limit && numberOfSupportedWallets - limit > 0;\n\n const addExperimentalChain = async (wallet: Wallet) => {\n setShowExperimentalChainModal(false);\n setAddingExperimentalChainStatus('in-progress');\n try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenWalletStateModal('');\n };\n\n return (\n <>\n {sortedList.slice(0, limit).map((wallet) => {\n const address = getAddress({\n connectedWallets,\n walletType: wallet.type,\n chain,\n });\n const conciseAddress = address\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\n\n const experimentalChain = isExperimentalChain(blockchains(), chain);\n\n const experimentalChainNotAdded = !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.type &&\n connectedWallet.chain === chain\n );\n\n const couldAddExperimentalChain =\n experimentalChain &&\n experimentalChainNotAdded &&\n wallet.state === WalletState.CONNECTED;\n\n const connectedWalletDescription = couldAddExperimentalChain\n ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\n : conciseAddress;\n\n const onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\n } else if (couldAddExperimentalChain) {\n setExperimentalChainWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n setShowExperimentalChainModal(true);\n } else {\n selectWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n }\n };\n\n const blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains()\n )\n : undefined;\n return (\n <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={handleCloseWalletModal}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\n type=\"loading\"\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\n type=\"error\"\n title={i18n.t('Request Rejected')}\n description={i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n detectMobileScreens,\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n\n /** It can be what has been set by widget config or as a fallback we use all the supported wallets by our library */\n const listAvailableWalletTypes =\n configWalletsToWalletName(config?.wallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n let wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n wallets = detectMobileScreens()\n ? wallets.filter(\n (wallet) => wallet.showOnMobile || state(wallet.type).installed\n )\n : wallets;\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!config?.multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = useCallback(() => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n // don't show default injected wallet when it's not installed\n const defaultWallet = wallets.find(\n (wallet) => wallet.type === WalletTypes.DEFAULT\n );\n if (!defaultWallet || defaultWallet.state === WalletState.NOT_INSTALLED) {\n return false;\n }\n\n /*\n * if we have another evm wallet installed (except wallet connect),\n * there is no need to show default injected wallet anymore\n */\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![WalletTypes.DEFAULT, WalletTypes.WALLET_CONNECT_2].includes(\n wallet.type as WalletTypes\n ) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n disconnectConnectingWallets,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list, handleClick, error, disconnectConnectingWallets } =\n useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenModal(false);\n };\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={handleCloseWalletModal}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\nimport { RefreshModal } from '../RefreshModal';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const { fetchStatus } = useAppStore();\n const [openRefreshModal, setOpenRefreshModal] = useState(false);\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n useEffect(() => {\n setOpenRefreshModal(fetchStatus === 'failed');\n }, [fetchStatus]);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n <>\n {showBackButton && (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n )}\n </>\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n <RefreshModal\n open={openRefreshModal}\n onClose={() => setOpenRefreshModal(false)}\n />\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n const { theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport function generateShades(\n baseColor: string,\n prefix: string,\n reverse?: boolean\n): { [key: string]: string } {\n const BASE_SHADE_INDEX = 100;\n const NUMBER_OF_COLORS = 9;\n const SHADING_INCREMENT_MAX = 10; // For bright colors\n const SHADING_INCREMENT_MIN = 6; // For dark colors\n\n const HALF_NUMBER_OF_COLORS = 4;\n\n const shadeIncrements: number[] = [];\n let increment = 90;\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n shadeIncrements.push(increment);\n if (i + 1 === HALF_NUMBER_OF_COLORS) {\n increment = 0;\n } else {\n increment -=\n i >= HALF_NUMBER_OF_COLORS\n ? SHADING_INCREMENT_MIN\n : SHADING_INCREMENT_MAX;\n }\n }\n\n // If 'reverse' is true, that means the color should be from dark to light\n const decrementAmounts = reverse\n ? shadeIncrements.slice().reverse()\n : shadeIncrements;\n\n const shades: { [key: string]: string } = {};\n\n // Generate shades\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n const shadeIndex = BASE_SHADE_INDEX + i * BASE_SHADE_INDEX;\n const decrementAmount = decrementAmounts[i];\n\n const shade: { [key: string]: string } = {\n [`${prefix}${shadeIndex}`]: generateShade(baseColor, decrementAmount),\n };\n Object.assign(shades, shade);\n }\n\n return { ...shades, [prefix]: baseColor };\n}\n\nexport function generateShade(\n baseColor: string,\n decrementAmount: number\n): string {\n const [r, g, b] = convertToRGB(baseColor);\n return `#${clamp(r + decrementAmount)}${clamp(g + decrementAmount)}${clamp(\n b + decrementAmount\n )}`;\n}\n\nexport function convertToRGB(baseColor: string): number[] {\n const COLOR_SLICE_START = 1;\n const COLOR_SLICE_END = 3;\n const BASE_COLOR_LENGTH = 7;\n\n // Convert the base color to RGB components\n const r: number = parseInt(\n baseColor.slice(COLOR_SLICE_START, COLOR_SLICE_END),\n 16\n );\n const g: number = parseInt(\n baseColor.slice(COLOR_SLICE_END, COLOR_SLICE_END + 2),\n 16\n );\n const b: number = parseInt(\n baseColor.slice(COLOR_SLICE_END + 2, BASE_COLOR_LENGTH),\n 16\n );\n\n return [r, g, b];\n}\n\n// Function to clamp color component to valid range [0, 255] and convert to hex\nfunction clamp(color: number): string {\n const MAX_COLOR_VALUE = 255;\n const HEX_BASE = 16;\n const HEX_LENGTH = -2;\n return (\n '0' + Math.max(0, Math.min(MAX_COLOR_VALUE, color)).toString(HEX_BASE)\n )\n .slice(HEX_LENGTH)\n .toUpperCase();\n}\n\nexport function isBright(baseColor: string) {\n const BRIGHTNESS_THRESHOLD = 188;\n const RED_COEFFICIENT = 299;\n const GREEN_COEFFICIENT = 587;\n const BLUE_COEFFICIENT = 114;\n const BRIGHTNESS_DIVISOR = 1000;\n\n const [r, g, b] = convertToRGB(baseColor);\n const brightness =\n (r * RED_COEFFICIENT + g * GREEN_COEFFICIENT + b * BLUE_COEFFICIENT) /\n BRIGHTNESS_DIVISOR;\n if (brightness > BRIGHTNESS_THRESHOLD) {\n return true;\n }\n return false;\n}\n\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else {\n const reverse = colorKey === 'neutral' && reverseNeutralRange;\n listOfColors = {\n ...listOfColors,\n ...generateShades(color, colorKey, reverse),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$info100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\n },\n width: '$6',\n height: '$6',\n borderRadius: '$lg',\n right: '$4',\n border: '1px solid $surface100',\n});\n\nexport const SuffixContainer = styled('div', {\n display: 'flex',\n justifyContent: 'flex-end',\n minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button variant=\"ghost\" onClick={props.onClick} size=\"xsmall\">\n <Typography variant=\"label\" size=\"medium\" color=\"error500\">\n {i18n.t('Cancel')}\n </Typography>\n </Button>\n </SuffixContainer>\n );\n}\n\nexport { CancelButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { config } = useAppStore();\n\n const { list } = useWalletList({ config });\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n {props.isConnected && <ConnectedIcon />}\n <WalletIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n );\n}\n\nexport { WalletButton };\n", "import type { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { RefreshButton } from './RefreshButton';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n container,\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={container || getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport {\n ChainToken,\n ChevronRightIcon,\n Divider,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { areTokensEqual } from '../../utils/wallets';\n\nimport {\n Container,\n Images,\n List,\n ListItem,\n} from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem, index) => {\n const { route, requestId, event } = notificationItem;\n const fromToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.from)\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.from.blockchain\n );\n\n const toToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.to)\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.to.blockchain\n );\n\n return (\n <React.Fragment key={requestId}>\n {index > 0 && <Divider size={4} />}\n <ListItem\n onClick={() => handleOnClick(requestId)}\n actionRequired={\n event.messageSeverity === EventSeverity.WARNING\n }\n title={\n <Typography\n variant=\"body\"\n size=\"small\"\n color={\n event.messageSeverity === EventSeverity.WARNING\n ? '$foreground'\n : '$neutral700'\n }>\n {i18n.t(event.message)}\n </Typography>\n }\n id={requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n </React.Fragment>\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { darkTheme, ListItemButton, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n maxWidth: '90vw',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const ListItem = styled(ListItemButton, {\n variants: {\n actionRequired: {\n true: {\n backgroundColor: '$error300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$error600',\n },\n },\n },\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral700\">\n {i18n.t('There are no notifications.')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsList = getUnreadNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import type { PropTypes } from './RefreshModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, MessageBox, RefreshIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { RefreshButton } from './RefreshModal.styles';\n\nexport function RefreshModal(props: PropTypes) {\n const { open, onClose } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Something went wrong')}\n type=\"error\"\n description={i18n.t('Something went wrong. Please refresh the app.')}>\n <Divider size={30} />\n <RefreshButton\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={() => location.reload()}>\n <RefreshIcon size={20} color=\"primary\" />\n <Divider size={4} direction=\"horizontal\" />\n {i18n.t('Refresh')}\n </RefreshButton>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const RefreshButton = styled(Button, {\n '& span': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === WalletState.CONNECTED) {\n return (\n <MessageBox\n type=\"success\"\n title={i18n.t('Wallet Connected')}\n description={i18n.t(\n 'Your wallet is connected, you can use it to swap.'\n )}\n />\n );\n }\n\n if (error) {\n return (\n <MessageBox\n type=\"error\"\n title={i18n.t('Failed to Connect')}\n description={\n error || i18n.t('Your wallet is not connected. Please try again.')\n }\n />\n );\n }\n\n return (\n <MessageBox\n type=\"loading\"\n title={i18n.t('Connecting to your wallet')}\n description={i18n.t('Click connect in your wallet popup.')}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n backgroundColor: '$success300',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${spin} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n couldChangeSettings,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n if (alertInfo && !couldChangeSettings) {\n alertInfo.action = null;\n }\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\n type={info.alert.type}\n prefix={\n <PrefixIcon>\n <RefreshIcon size={8} />\n </PrefixIcon>\n }\n onClick={info.alert.action.onClick}>\n {info.alert.action.title}\n </Button>\n )\n }\n variant=\"alarm\"\n />\n </Footer>\n )}\n </Container>\n );\n}\n", "import type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size=\"4\" />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '$5',\n width: '100%',\n});\n\nexport const Item = styled('div', {\n display: 'flex',\n padding: '$5 0',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n alertInfo.action = 'change-settings';\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n container,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n container={container}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n formatTooltipNumbers,\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd, getUsdFeeOfStep } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (\n swaps: SwapResult[],\n internalSwap?: boolean\n ): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const hasBridgeLimitError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId;\n\n const hasSlippageError =\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index);\n\n const hasSlippageWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n const stepHasError = hasBridgeLimitError || hasSlippageError;\n const stepHasWarning = hasSlippageWarning;\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (hasBridgeLimitError) {\n alertTitle = error?.recommendation;\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers),\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0 && !internalSwap\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(\n index === 0 ? input.value : swap.fromAmount\n ),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.from.usdPrice ?? 0).multipliedBy(\n swap.fromAmount\n )\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(swap.toAmount),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.to.usdPrice ?? 0).multipliedBy(swap.toAmount)\n ),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm dense={fullExpandedMode}>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n !fullExpandedMode ? (\n <FooterAlert>\n {hasBridgeLimitError && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </>\n )}\n {(hasSlippageError || hasSlippageWarning) &&\n !hasBridgeLimitError && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n )}\n </FooterAlert>\n ) : null\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n time: roundedSecondsToString(swap.estimatedTimeInSeconds),\n fee: numberToString(\n getUsdFeeOfStep(swap, tokens),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n internalSwaps: swap.internalSwaps\n ? getQuoteSteps(swap.internalSwaps)\n : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = propContainer || getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = roundedSecondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], tokens);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\"\n css={{\n paddingLeft: '$10',\n paddingRight: '$10',\n paddingTop: '$5',\n paddingBottom: '$5',\n }}>\n <Typography\n color=\"secondary\"\n variant=\"body\"\n size=\"xsmall\"\n className=\"allRoutesLabel\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.value)}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n &nbsp;\n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </Tooltip>\n </ContainerInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.usdValue)}\n container={container}>\n <Divider size={2} direction=\"horizontal\" />\n <Typography color=\"$neutral600\" size=\"xsmall\" variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </Tooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n container={container}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n variants: {\n dense: {\n true: {\n paddingBottom: 0,\n },\n },\n },\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary600',\n [`.${darkTheme} &`]: {\n border: '1px solid $secondary',\n },\n transition: 'background-color 0.3s ease',\n '&:hover': {\n backgroundColor: '$secondary600',\n [`.${darkTheme} &`]: {\n backgroundColor: '$secondary',\n },\n '.allRoutesLabel': {\n $$color: '$colors$background',\n [`.${darkTheme} &`]: {\n $$color: '$colors$foreground',\n },\n color: '$$color',\n transition: 'color 0.3s ease',\n },\n },\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n QuoteCost,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { NAME_OF_FEES } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {NAME_OF_FEES[payableFeesKey as NameOfFees]}\n </Typography>\n <Tooltip\n content={formatTooltipNumbers(fee.amount)}\n container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </Tooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = NAME_OF_FEES[nonPayableFeesKey as NameOfFees];\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const { content, src, className, open, state, container } = props;\n const tooltipContainer = container || getContainer();\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type, container } =\n props;\n const tooltipContainer = container || getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n content={blockchain.displayName}\n sideOffset={4}>\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n </Tooltip>\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n container={container}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useLayoutEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useLayoutEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container expanded={expanded} rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={24} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n expanded: {\n true: {\n paddingBottom: '3px',\n },\n false: {\n paddingBottom: '$12',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={85} height={24} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n <Divider size={12} />\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '14px $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$24',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens extraSpace={separator}>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n variants: {\n extraSpace: {\n true: {\n paddingBottom: '$40',\n },\n },\n },\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n const proceedAnyway = !!confirmSwapWarnings.balance;\n\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n proceedAnyway ? false : true,\n { blockchains, tokens }\n );\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n tokens: params.meta.tokens,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\n});\n\nconst isStepContainsText = (steps: PendingSwapStep[], value: string) => {\n if (!steps?.length) {\n return false;\n }\n return steps.filter(\n (step) =>\n containsText(step.fromBlockchain, value) ||\n containsText(step.toBlockchain, value) ||\n containsText(step.toSymbol, value) ||\n containsText(step.fromSymbol, value)\n ).length;\n};\n\nexport function HistoryPage() {\n const navigate = useNavigate();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const loading = !state.loadedFromPersistor;\n\n const searchHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n }}>\n <PageContainer>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(swap.inputAmount),\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable\n ),\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './SearchInput.types';\n\nimport { CloseIcon, IconButton, SearchIcon, TextField } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { IconWrapper } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const IconWrapper = styled('div', {\n width: '$24',\n height: '$24',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "import type { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { isVariantExpandable } from '../utils/configs';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'auto auto',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0 !important',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n new BigNumber(inputAmount).gt(0) &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n onHandleNavigation(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n isExpandable={isExpandable}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={true}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n const container = getExpanded();\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={container} />\n <HeaderButtons\n container={container}\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n container={getExpanded()}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const tokens = useAppStore().tokens();\n const container = propContainer || getContainer();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={container} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n container={container}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import type { PreferenceType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n ];\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken, isExpandable } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(inputUsdValue),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!isExpandable && (!!selectedQuote || fetchingQuote)}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(outputAmount),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(outputUsdValue),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n ROTATE_ANIMATION_DURATION,\n StyledButton,\n SwitchButtonContainer,\n} from './SwitchFromAndTo.styles';\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={(event) => {\n const button = event.currentTarget;\n\n button.classList.add('rotate');\n\n setTimeout(() => {\n button.classList.remove('rotate');\n }, ROTATE_ANIMATION_DURATION);\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const ROTATE_ANIMATION_DURATION = 450;\n\nconst rotateAnimation = keyframes({\n '0%': {\n transform: 'rotateX(0deg) rotateY(0deg) rotateZ(0deg)',\n },\n '33%': {\n transform: 'rotateX(0deg) rotateZ(78deg) rotateY(66deg)',\n },\n '66%': {\n transform: 'rotateX(0deg) rotateZ(163deg) rotateY(66deg)',\n },\n '100%': {\n transform: 'rotateX(0deg) rotateZ(180deg) rotateY(0deg)',\n },\n});\n\nexport const SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nexport const StyledButton = styled('div', {\n borderRadius: '$md',\n border: '3px solid $background',\n background: '$neutral100',\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n color: '$foreground',\n '&.rotate': {\n '& svg': {\n animation: `${rotateAnimation} ${ROTATE_ANIMATION_DURATION}ms ease-in-out forwards`,\n },\n },\n '&:hover': {\n color: '$secondary500',\n transform: 'translateY(1px) scale(1.04)',\n boxShadow: '1px 1px 1px 1px rgba(0, 0, 0, 0.05)',\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n\n const [loading, setLoading] = useState(true);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n const navigateBack = useNavigateBack();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => {\n changeLanguage(languageItem.local);\n navigateBack();\n },\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n variant=\"alarm\"\n title=\"Important Notice: Machine translations are in use\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter((sourceItem) =>\n containsText(sourceItem.groupTitle, searchedFor)\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={searchHandler}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => navigate(settings_url)}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const fetchStatus = useAppStore().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n\n <BlockchainList\n list={blockchains}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List as=\"ul\" key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\n hasDivider\n onClick={() => onChange(item)}\n start={<Image src={item.logo} size={30} />}\n title={\n <Typography variant=\"title\" size=\"medium\">\n {item.displayName}\n </Typography>\n }\n id={item.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Token')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n <TokenList\n list={tokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === 'success' && (\n <>\n <BlockchainsChip\n selected={!blockchain}\n onClick={() => {\n if (type === 'from') {\n resetFromBlockchain();\n } else {\n resetToBlockchain();\n }\n }}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n.t('All')}\n </Typography>\n </BlockchainsChip>\n {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateShade, isBright } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n StyledLink,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <Divider size={4} direction=\"horizontal\" />\n <StyledLink\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n <ExternalLinkIcon size={12} />\n </StyledLink>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\n\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list.length]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const tokenBalance = formatBalance(getBalanceFor(token));\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const lightShade = generateShade(\n blockchain?.color || '',\n isBright(blockchain?.color || '') ? 5 : 125\n );\n const darkShade = generateShade(blockchain?.color || '', -100);\n\n const customCssForTag = {\n $$color: lightShade,\n [`.${darkTheme} &`]: {\n $$color: darkShade,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: darkShade,\n [`.${darkTheme} &`]: {\n $$color: lightShade,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n height: '60px',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.name || undefined\n }\n end={\n loadingWallet ? (\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n ) : (\n tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n totalCount={tokens.length}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List as=\"ul\">{renderList()}</List>}\n </Container>\n );\n}\n", "import type { LoadingTokenListProps } from './TokenList.types';\n\nimport { Divider, ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { End, List } from './TokenList.styles';\n\nexport function LoadingTokenList(props: LoadingTokenListProps) {\n return (\n <List>\n {Array.from(Array(props.size), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n ))}\n </List>\n );\n}\n", "import {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n display: 'flex',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const Title = styled('div', {\n display: 'flex',\n alignItems: 'center',\n '._typography': {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n },\n});\nexport const List = styled('ul', {\n flexGrow: 1,\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const StyledLink = styled('a', {\n '& svg:hover': {\n color: '$colors$info',\n },\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n InfoIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n return (\n <BaseContainer>\n <Head>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage || ''}\n color=\"dark\"\n onChange={(event) => {\n const value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgesIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n ExchangeIcon,\n InfinityIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 16 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n const { activeLanguage, languages } = useLanguage();\n const currentLanguage = languages.find(\n (language) => language.local === activeLanguage\n )?.label;\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleSwapperEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n start: <BridgesIcon color=\"gray\" size={16} />,\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(\n totalSelectedExchangeSources,\n totalExchangeSources\n )}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <ExchangeIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n start: <LanguageIcon color=\"gray\" size={16} />,\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {currentLanguage}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <InfinityIcon color=\"gray\" size={16} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n LinkIcon,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n formatTooltipNumbers,\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n ErrorMessages,\n HeaderDetails,\n MessageText,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\n const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n } else if (showCompletedModal) {\n setShowCompletedModal(null);\n }\n }\n }, [swap.status, swap.requestId]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const swapDate = getSwapDate(swap);\n const shouldRetry = shouldRetrySwap(swap);\n\n const isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\n blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? formatTooltipNumbers(\n new BigNumber(outputAmount).multipliedBy(lastStep.toUsdPrice || 0)\n )\n : '';\n\n const realInputUsdValue = formatTooltipNumbers(\n new BigNumber(swap.inputAmount).multipliedBy(firstStep.fromUsdPrice || 0)\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const stepDetailMessage =\n stepMessage.detailedMessage.content || stepMessage.shortMessage;\n\n const completeModalDesc =\n swap.status === 'success' ? (\n i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n ) : (\n <ErrorMessages>\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {!stepDetailMessage ? i18n.t('Transaction was not sent.') : ''}\n {lastConvertedTokenInFailedSwap\n ? `${i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })}`\n : ''}\n </Typography>\n {stepDetailMessage && (\n <MessageText\n align=\"center\"\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\">\n <b>Reason:</b> {stepDetailMessage}\n </MessageText>\n )}\n </ErrorMessages>\n );\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('delete')}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Delete')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}\n footer={\n shouldRetry &&\n !showCompletedModal && (\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n retry(swap, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <LinkIcon size={16} />\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t(swap.finishTime ? 'Finished at' : 'Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={roundedSecondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount,\n },\n token: {\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n },\n chain: {\n image: steps[numberOfSteps - 1].to.chain.image,\n displayName: steps[numberOfSteps - 1].to.chain.displayName,\n },\n }}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = getStepState(swap.steps[index]);\n const isFocused =\n state === 'error' ||\n state === 'in-progress' ||\n state === 'warning' ||\n (state === 'completed' && index === steps.length - 1);\n return (\n <StepDetails\n key={key}\n step={step}\n type=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\n walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={formatTooltipNumbers(outputAmount)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </>\n );\n};\n", "import type { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\n\nimport { debug } from '@rango-dev/logging-core';\nimport { MessageBox, Wallet } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const { connect, getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\n // TODO we need to show an error modal when user reject the connection\n onClick={async () =>\n connect(walletType).catch((error) => debug(error))\n }\n />\n </WalletContainer>\n )}\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const TooltipErrorContent = styled('div', {\n maxWidth: 280,\n '& ._typography': {\n wordWrap: 'break-word',\n display: 'block',\n },\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n {i18n.t('Diagnosis')}\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert,\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers),\n image: step.swapperLogo ?? '',\n type: step.swapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.fromBlockchainLogo ?? '',\n },\n },\n to: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.toBlockchainLogo ?? '',\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(\n internalSwap.swapperId,\n swappers\n ),\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n switchNetwork,\n showNetworkModal,\n setNetworkModal,\n message,\n step,\n hasAlreadyProceededToSign,\n } = props;\n\n const hasWarning = isNetworkStatusInWarningState(step);\n const waitingForApproval =\n step.status === 'waitingForApproval' && !hasWarning;\n const inProgress = step.status === 'running' && !hasWarning;\n const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\n showNetworkModal={showNetworkModal}\n setNetworkModal={setNetworkModal}\n message={message}\n />\n )}\n\n {step.status === 'failed' && <FailedAlert message={message} />}\n </Alerts>\n );\n}\n", "import type { FailedAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { Alert, ChevronDownIcon, IconButton } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { MessageText } from '../SwapDetails/SwapDetails.styles';\n\nimport { ActionIcon, AlertFooter } from './SwapDetailsAlerts.styles';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n containerStyles={{\n '& .footer': {\n paddingTop: '$0',\n },\n }}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n <ActionIcon rotated={showContentError}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ActionIcon>\n </IconButton>\n )\n }\n footer={\n <AlertFooter open={showContentError}>\n <MessageText variant=\"body\" size=\"xsmall\" color=\"neutral700\">\n {message.detailedMessage.content}\n </MessageText>\n </AlertFooter>\n }\n />\n );\n}\n", "import { css, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const ErrorMessages = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n});\nexport const MessageText = styled(Typography, {\n wordBreak: 'break-word',\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const ActionIcon = styled('div', {\n transition: 'transform 0.3s ease-in-out',\n variants: {\n rotated: {\n true: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const AlertFooter = styled('div', {\n transition: 'max-height 0.3s ease-in-out',\n maxHeight: '0px',\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n maxHeight: '200px',\n },\n },\n },\n});\n", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\n }}>\n {i18n.t('Change')}\n </Button>\n }\n />\n );\n }\n if (\n showNetworkModal === PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import type { WalletType } from '../..';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { splitWalletNetwork } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WidgetContext } from '../../containers/Wallets';\nimport { globalFont } from '../../globalStyles';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { tabManager } from '../../store/ui';\nimport { useFetchApiConfig } from '../useFetchApiConfig';\nimport { useForceAutoConnect } from '../useForceAutoConnect';\nimport { useSubscribeToWidgetEvents } from '../useSubscribeToWidgetEvents';\n\nexport function useBootstrap() {\n globalFont();\n useForceAutoConnect();\n useSubscribeToWidgetEvents();\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n const { fetchApiConfig } = useFetchApiConfig();\n\n // At the moment, we only detect the disconnection of EVM wallets.\n useQueueManager({\n lastConnectedWallet: lastConnectedWalletWithNetwork,\n clearDisconnectedWallet: () => {\n setDisconnectedWallet(undefined);\n },\n disconnectedWallet: disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n useEffect(() => {\n tabManager.init();\n\n if (!useNotificationStore.persist.hasHydrated()) {\n void useNotificationStore.persist.rehydrate();\n }\n\n /**\n * Add handlers to the widget context for connecting and disconnecting wallets.\n * We pass these handlers to the wallet provider to keep track of the last connected and last disconnected wallets.\n * The 'queue-manager' uses these details to spot any changes in the connection status of the required wallet during the swap process.\n *\n * with this approch anyone who use the widget context can override these handlers and causes some bugs happens.\n * it the future we should add a safer soloution like considering array of handlers .\n * https://github.com/rango-exchange/rango-client/pull/630/files#r1518846728\n */\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n widgetContext.onDisconnectWallet((walletType) => {\n setDisconnectedWallet(walletType);\n if (\n walletType === splitWalletNetwork(lastConnectedWalletWithNetwork)?.[0]\n ) {\n setLastConnectedWalletWithNetwork('');\n }\n });\n\n void fetchApiConfig().catch(console.log);\n\n return tabManager.destroy;\n }, []);\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = () =>\n globalCss({\n '@import': [\n \"url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap')\",\n \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "import { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import type { RouteEventData, StepEventData } from '../..';\n\nimport {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useWalletsStore } from '../../store/wallets';\n\nexport function useSubscribeToWidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n const handleStepEvent = (widgetEvent: StepEventData) => {\n const { event, step, route } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n\n setNotification(event, route);\n };\n widgetEvents.on(MainEvents.StepEvent, handleStepEvent);\n\n return () => widgetEvents.off(MainEvents.StepEvent, handleStepEvent);\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n const handleRouteEvent = (widgetEvent: RouteEventData) => {\n const { event, route } = widgetEvent;\n\n if (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n ) {\n setNotification(event, route);\n }\n };\n widgetEvents.on(MainEvents.RouteEvent, handleRouteEvent);\n\n return () => widgetEvents.off(MainEvents.RouteEvent, handleRouteEvent);\n }, [widgetEvents, connectedWallets.length]);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = async (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const history = new WidgetHistory(manager, { retrySwap });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getUnreadNotifications();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { Meta } from '../../store/quote';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\ninterface WidgetHistoryActions {\n retrySwap: (pendingSwap: PendingSwap, meta: Meta) => void;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n return this.actions.retrySwap(swap, meta);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["EventSeverity", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "useWidgetEvents", "readAccountAddress", "useWallets", "WalletEvents", "Networks", "WalletTypes", "PendingSwapNetworkStatus", "UI_ID", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "SCANNER_BASE_URL", "WIDGET_UI_ID", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useMemo", "useRef", "useEffect", "create", "subscribeWithSelector", "RangoClient", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BigNumber", "roundedSecondsToString", "__name", "s", "seconds", "minutes", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "formatTooltipNumbers", "number", "numberToString", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "showOnMobile", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "b", "a", "ZERO", "numberWithThousandSeparator", "number", "parts", "blockchain", "symbol", "allTokens", "t", "isExperimentalChain", "blockchains", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "isCosmosBlockchain", "formatBalance", "balance", "numberToString", "__name", "compareTokenBalance", "token1Balance", "token2Balance", "areTokensEqual", "tokenA", "tokenB", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "createTokenHash", "token", "makeTokensBalance", "wallet", "balances", "currentBalance", "BigNumber", "ZERO", "tokenHash", "prevBalance", "isFetchingBalance", "blockchain", "hashWalletsState", "walletsInfo", "w", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "DEFAULT_FONT_FAMILY", "THEME_CLASS_NAME_PREFIX", "isTokenExcludedInConfig", "token", "tokensConfig", "result", "asset", "areTokensEqual", "isExcluded", "isBlockchainExcludedInConfig", "blockchain", "blockchainsConfig", "isVariantExpandable", "isLargeScreen", "isExtraLargeScreen", "variant", "rango", "httpService", "__name", "RangoClient", "getConfig", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "tokens", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "connectedWallets", "makeTokensBalance", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "token", "balances", "tokenHash", "createTokenHash", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "React", "createContext", "useContext", "useEffect", "useRef", "create", "persist", "DEFAULT_CONFIG", "DEFAULT_IFRAME_CONFIGS", "DEFAULT_CAMPAIGN_MODE", "createConfigSlice", "__name", "initialData", "set", "get", "config", "campaignMode", "disabledLiquiditySources", "nextConfig", "currentConfig", "name", "value", "currentCampaignMode", "currentIframeConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "exactText", "startWithText", "getContainer", "WIDGET_UI_ID", "getExpanded", "compareExactMatchText", "searchFor", "textA", "textB", "exactMatchA", "exactMatchB", "compareContainsText", "textContainsA", "textContainsB", "compareStartWithText", "textStartWithA", "textStartWithB", "compareWithSearchFor", "tokenA", "tokenB", "symbolExactMatchCompare", "tokenNameExactMatchCompare", "symbolStartWithCompare", "symbolContainsCompare", "tokenNameStartWithCompare", "tokenNameContainsCompare", "addressStartWithCompare", "addressContainCompare", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findToken", "tokens", "token", "areTokensEqual", "findBlockchain", "name", "isTokenNative", "feeAsset", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "isFeatureHidden", "feature", "features", "isFeatureEnabled", "createDataSlice", "__name", "set", "get", "options", "blockchainsMapByName", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "blockchain", "tokensFromState", "supportedTokensConfig", "blockchains", "token", "isTokenExcludedInConfig", "containsText", "tokenA", "tokenB", "isToken1Pinned", "isToken2Pinned", "token1Balance", "token2Balance", "balanceCompare", "compareTokenBalance", "blockChainA", "blockChainB", "isNativeTokenA", "isTokenNative", "isNativeTokenB", "symbolSearchForCompare", "compareWithSearchFor", "type", "pinnedToken", "areTokensEqual", "campaignMode", "campaignModeLiquiditySource", "liquiditySources", "excludeLiquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "enableCentralizedSwappers", "response", "httpService", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "a", "b", "error", "Chinese", "English", "Finland", "French", "German", "Greece", "Italian", "Japanese", "Netherlands", "Poland", "Portuguese", "Russian", "Spanish", "Swedish", "Ukrainian", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "createSettingsSlice", "__name", "set", "get", "DEFAULT_SLIPPAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "nextConfig", "features", "isThemeHidden", "isFeatureHidden", "isLanguageHidden", "isLiquidityHidden", "singleTheme", "DEFAULT_LANGUAGE", "createAppStore", "initialData", "create", "persist", "a", "createDataSlice", "createSettingsSlice", "createConfigSlice", "state", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "useEffect", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "create", "CHANNEL_NAME", "TabManager", "__name", "events", "CHANNEL_NAME", "message", "pingAt", "isPingSentBefore", "event", "name", "resolve", "nextActiveTab", "useUiStore", "selectors_default", "create", "set", "get", "setCurrentTabAsActive", "hasRunningSwaps", "showActivateTabModal", "flag", "watermark", "tabManager", "TabManager", "WidgetContext", "createContext", "Main", "props", "updateConfig", "updateSettings", "fetchMeta", "useAppStore", "blockchains", "tokens", "config", "walletOptions", "providers", "useWalletProviders", "connectWallet", "disconnectWallet", "useWalletsStore", "onConnectWalletHandler", "useRef", "onDisconnectWalletHandler", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "isActiveTab", "useUiStore", "handlers", "useMemo", "handler", "React", "Provider", "WidgetWallets", "otherProps", "AppStoreProvider", "React", "React", "Fragment", "MemoryRouter", "useInRouterContext", "AppRouter", "children", "Router", "useInRouterContext", "Fragment", "MemoryRouter", "React", "__name", "I18nManager", "React", "React", "useRoutes", "navigationRoutes", "useEffect", "useRef", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "i18n", "NAME_OF_FEES", "HIGH_PRIORITY_TAGS", "GAS_FEE_MAX", "QuoteWarningType", "i18n", "BigNumber", "PendingSwapNetworkStatus", "getRequiredWallets", "swaps", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "__name", "isValidAddress", "chain", "address", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "swaps", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "quote", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "ZERO", "requiredWallets", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getUsdFee", "getTotalFeesInUsd", "fees", "getFeesGroup", "result", "name", "feeGroup", "checkSlippageErrors", "swaps", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "quote", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "destination", "enableCentralizedSwappers", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "blockchains", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "i18n", "getBlockchainShortNameFor", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "lastStepToBlockchain", "chain", "isValidAddress", "isTokensIdentical", "tokenA", "tokenB", "getQuoteToTokenUsdPrice", "quote", "swaps", "__name", "isNumberOfSwapsChanged", "quoteA", "quoteB", "quoteASwaps", "quoteBSwaps", "isQuoteSwappersUpdated", "quoteASwappers", "swap", "quoteBSwappers", "areEqual", "isQuoteInternalCoinsUpdated", "quoteAInternalCoins", "quoteBInternalCoins", "isQuoteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "createRetryQuote", "pendingSwap", "blockchains", "tokens", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "findToken", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "getUsdValue", "outputUsdValue", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "getUniqueBlockchains", "steps", "set", "result", "step", "sortQuotesBy", "strategy", "quotes", "quote1", "quote2", "getScore", "route", "score", "quote1Score", "quote2Score", "lowerQuoteId1", "lowerQuoteId2", "getDefaultQuote", "currentQuote", "requestAmount", "currentQuoteSwapperIds", "swap", "matchedQuote", "quoteSwapperIds", "swapperId", "sortTags", "tags", "customSort", "a", "b", "indexA", "HIGH_PRIORITY_TAGS", "indexB", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "key", "value", "state", "quote", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "pendingSwap", "meta", "tokens", "blockchains", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "createRetryQuote", "flag", "wallets", "address", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "fromTokensConfig", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "t", "areTokensEqual", "isTokenExcludedInConfig", "isBlockchainExcludedInConfig", "__name", "useEffect", "useRef", "useInRouterContext", "useLocation", "useSearchParams", "searchParamToToken", "tokens", "searchParam", "chain", "token", "symbolAndAddress", "__name", "tokenToSearchParam", "useSyncUrlAndStore", "location", "useLocation", "searchParams", "setSearchParams", "useSearchParams", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "setFromBlockchain", "setToBlockchain", "setFromToken", "setToToken", "setInputAmount", "useQuoteStore", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "isInRouterContext", "useInRouterContext", "updateIframe", "updateCampaignMode", "campaignMode", "liquiditySourcesParamsRef", "useRef", "getUrlSearchParams", "__name", "fromAmount", "autoConnect", "clientUrl", "liquiditySources", "updateUrlSearchParams", "property", "useEffect", "tokenToSearchParam", "blockchain", "searchParamToToken", "i18n", "useManager", "Alert", "Button", "css", "Divider", "IconButton", "styled", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "flushSync", "useLocation", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Typography", "WalletIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "Modal", "React", "WatermarkedModal", "props", "watermark", "useUiStore", "React", "Modal", "__name", "React", "useRef", "Collapsible", "keyframes", "styled", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "CollapsibleRoot", "Trigger", "CollapsibleContent", "ExpandedIcon", "CustomCollapsible", "props", "open", "hasSelected", "onOpenChange", "children", "onClickTrigger", "trigger", "triggerAnchor", "ref", "useRef", "React", "CollapsibleRoot", "Trigger", "CollapsibleContent", "__name", "css", "darkTheme", "IconButton", "styled", "TextField", "Title", "ListContainer", "WalletButton", "ShowMoreWallets", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "walletsListStyles", "CustomDestination", "alarmsStyles", "ConfirmButton", "StyledTextField", "Wallets", "CustomDestinationButton", "i18n", "Button", "Divider", "Image", "MessageBox", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "detectMobileScreens", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useCallback", "useEffect", "useState", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "detectMobileScreens", "wallet", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "useCallback", "connectingWallets", "hashWalletsState", "useEffect", "shouldShowDefaultInjectedWallet", "defaultWallet", "blockchain", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "useState", "useManager", "BottomLogo", "Divider", "Header", "React", "useEffect", "useRef", "useState", "useRef", "isAppLoadedIntoIframe", "__name", "useIframe", "heightObserver", "useRef", "iframe", "useAppStore", "isMessagePassingAvailable", "isAppLoadedIntoIframe", "send", "__name", "message", "element", "entries", "entry", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "React", "generateShades", "baseColor", "prefix", "reverse", "shadeIncrements", "increment", "i", "decrementAmounts", "shades", "shadeIndex", "decrementAmount", "shade", "generateShade", "__name", "r", "g", "b", "convertToRGB", "clamp", "color", "isBright", "generateColors", "mainColors", "reverseNeutralRange", "colors", "changeColors", "listOfColors", "colorKey", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "darkColorsWithDefaults", "generateColors", "defaultDarkColors", "lightColorsWithDefaults", "hasDefaultDarkColors", "hasDefaultLightColors", "light", "dark", "tokens", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "joinList", "list", "divider", "element", "key", "React", "output", "item", "index", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "OSTheme", "setOSTheme", "useState", "theme", "useAppStore", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "__name", "event", "lightClassNames", "darkClassNames", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "i18n", "Alert", "Button", "React", "ActivateTabAlert", "props", "React", "Alert", "Button", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ActivateTabModal", "props", "open", "onClose", "onConfirm", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "__name", "ChevronLeftIcon", "React", "css", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "ProgressIcon", "InProgressTransactionBadgeContainer", "rowStyles", "WalletImageContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Image", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "config", "useAppStore", "list", "useWalletList", "connectedWallets", "wallet", "content", "React", "rowStyles", "WalletImageContainer", "Image", "i18n", "Tooltip", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "i18n", "EventSeverity", "ChainToken", "ChevronRightIcon", "Divider", "Typography", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "darkTheme", "ListItemButton", "styled", "Container", "List", "ListItem", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "getUnreadNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "tokens", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "navigationRoutes", "React", "Container", "List", "notificationItem", "index", "route", "event", "fromToken", "tokenItem", "areTokensEqual", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "Divider", "ListItem", "EventSeverity", "Typography", "i18n", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "useManager", "InProgressIcon", "React", "InProgressTransactionBadge", "__name", "manager", "useManager", "getPendingSwaps", "swap", "React", "InProgressTransactionBadgeContainer", "InProgressIcon", "InProgressTransactionBadge_default", "RefreshProgressButton", "React", "useEffect", "useState", "REFRESH_INTERVAL", "MAX_ELAPSED_TIME", "MAX_PERCENTAGE", "RefreshButton", "onClick", "elapsedTime", "setElapsedTime", "useState", "isRefetched", "setIsRefetched", "handleVisibilityChange", "__name", "interval", "clearTimeout", "useEffect", "prevTime", "handleRefreshClick", "React", "HeaderButton", "ProgressIcon", "RefreshProgressButton", "EventSeverity", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsList", "notificationsCount", "hasSeverNotification", "notificationItem", "EventSeverity", "React", "NotificationsBadgeContainer", "Typography", "__name", "HeaderButtons", "props", "onClickRefresh", "onClickHistory", "onClickSettings", "hidden", "container", "features", "useAppStore", "isNotificationsHidden", "isFeatureHidden", "React", "Tooltip", "getContainer", "i18n", "RefreshButton", "Popover", "NotificationContent", "HeaderButton", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "InProgressTransactionBadge_default", "__name", "i18n", "Divider", "MessageBox", "RefreshIcon", "React", "Button", "styled", "RefreshButton", "RefreshModal", "props", "open", "onClose", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "RefreshButton", "RefreshIcon", "__name", "onScrollContentAttachStatusToContainer", "e", "contentElement", "fromTop", "container", "getContainer", "__name", "css", "styled", "WIDGET_HEIGHT", "LayoutContainer", "Container", "Content", "Footer", "Layout", "props", "connectHeightObserver", "disconnectHeightObserver", "useIframe", "children", "header", "footer", "height", "fetchStatus", "useAppStore", "openRefreshModal", "setOpenRefreshModal", "useState", "connectedWallets", "useWalletsStore", "features", "theme", "watermark", "useUiStore", "hasWatermark", "activeTheme", "useTheme", "isConnectWalletHidden", "isFeatureHidden", "isActiveTab", "tabManagerInitiated", "showActivateTabModal", "setShowActivateTabModal", "activateCurrentTab", "navigateBack", "useNavigateBack", "manager", "useManager", "hasRunningSwap", "getPendingSwaps", "swap", "onActivateTab", "__name", "tabManager", "onConnectWallet", "showBackButton", "scrollViewRef", "useRef", "containerRef", "useEffect", "isAppLoadedIntoIframe", "onScrollContentAttachStatusToContainer", "React", "Container", "WIDGET_UI_ID", "LayoutContainer", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "ActivateTabModal", "Footer", "ActivateTabAlert", "Divider", "BottomLogo", "RefreshModal", "styled", "CONTENT_PADDING", "ScrollableArea", "styled", "PageContainer", "Divider", "React", "i18n", "Image", "MessageBox", "WalletState", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "ModalContent", "props", "state", "image", "error", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "WalletModal", "props", "open", "onClose", "otherProps", "React", "WatermarkedModal", "WIDGET_UI_ID", "ModalContent", "Divider", "__name", "ListContainer", "styled", "Container", "PageContainer", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "fetchMetaStatus", "useAppStore", "openModal", "setOpenModal", "useState", "selectedWalletType", "setSelectedWalletType", "modalTimerId", "isActiveTab", "useUiStore", "list", "handleClick", "error", "disconnectConnectingWallets", "useWalletList", "type", "handleCloseWalletModal", "__name", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "Typography", "index", "key", "Wallet", "getContainer", "WalletModal", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "ACCOUNT_ADDRESS_MAX_CHARACTERS", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "config", "useAppStore", "isActiveTab", "useUiStore", "connectedWallets", "useWalletsStore", "blockchains", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "modalTimerId", "list", "error", "handleClick", "disconnectConnectingWallets", "useWalletList", "type", "TIME_TO_IGNORE_MODAL", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "WIDGET_UI_ID", "timeout", "handleCloseWalletModal", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "WatermarkedModal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "ShowMoreWallets", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "config", "useAppStore", "blockchains", "selectedQuote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "showCustomDestination", "setShowCustomDestination", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "getInitialSelectableWallets", "connectedWallet", "selectableWallets", "setSelectableWallets", "lastStepToBlockchainMeta", "chain", "isInsufficientBalanceModalOpen", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "modalContainer", "WIDGET_UI_ID", "navigate", "useNavigate", "React", "WatermarkedModal", "ConfirmButton", "Button", "confirmSwapDisabled", "i18n", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "walletsListStyles", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CustomCollapsible", "checked", "CustomDestinationButton", "WalletIcon", "ExpandedIcon", "ChevronDownIcon", "prev", "StyledTextField", "e", "value", "alarmsStyles", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "SMALL_NO_ROUTE__ICON_SIZE", "LARGE_NO_ROUTE_ICON_SIZE", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "NoRouteIconSize", "NoRouteTitleSize", "styled", "Container", "ErrorDescription", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "size", "disabledLiquiditySources", "useAppStore", "toggleAllLiquiditySources", "swappers", "info", "makeInfo", "React", "Container", "NoRouteIcon", "NoRouteIconSize", "Divider", "Typography", "NoRouteTitleSize", "errorMessages", "ErrorDescription", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "WarningIcon", "React", "Typography", "React", "darkTheme", "styled", "Alerts", "Flex", "Item", "Action", "QuoteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "HighValueLossWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "type", "highValueLossData", "i18n", "numberToString", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "i18n", "getPriceImpactLevel", "errorMessages", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useAppStore", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "navigate", "useNavigate", "userSlippage", "React", "WatermarkedModal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "MessageBox", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "confirmationDisabled", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "couldChangeSettings", "showWarningModal", "confirmationDisabled", "refetchQuote", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "BigNumber", "React", "i18n", "Alert", "Divider", "FullExpandedQuote", "InfoIcon", "QuoteTag", "StepDetails", "TokenAmount", "Tooltip", "Typography", "BigNumber", "React", "useRef", "useState", "styled", "QuoteContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "Button", "css", "darkTheme", "Image", "styled", "Typography", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "stepsDetailsStyles", "css", "AllRoutesButton", "Button", "SummaryContainer", "summaryStyles", "summaryHeaderStyles", "rowStyles", "basicInfoStyles", "Trigger", "Image", "ImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "BasicInfoOutput", "Typography", "ContainerInfoOutput", "MoreStep", "TagContainer", "Line", "i18n", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "QuoteCost", "Tooltip", "Typography", "React", "useState", "css", "styled", "FeeSection", "Line", "ModalContainer", "ModalHeader", "trigger", "NonPayableFee", "__name", "props", "React", "FeeSection", "Typography", "numberToString", "QuoteCostDetails", "open", "setOpen", "useState", "openCollapse", "setOpenCollapse", "steps", "quote", "fee", "time", "feeWarning", "showModalFee", "swaps", "container", "getContainer", "feesGroup", "getFeesGroup", "QuoteCost", "e", "i18n", "WatermarkedModal", "ModalHeader", "IconButton", "CloseIcon", "ModalContainer", "Divider", "payableFeesKey", "feeArray", "index", "key", "usdValue", "getUsdFee", "NAME_OF_FEES", "Tooltip", "formatTooltipNumbers", "Line", "CustomCollapsible", "prev", "trigger", "ExpandedIcon", "ChevronDownIcon", "nonPayableFeesKey", "fees", "totalFeeInUsd", "getTotalFeesInUsd", "label", "i18n", "TokenAmount", "React", "css", "styled", "Container", "separatorStyles", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "i18n", "getContainer", "separatorStyles", "__name", "i18n", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "Tooltip", "Typography", "React", "useLayoutEffect", "useState", "MIN_TABLET_WIDTH", "MIN_NOTEBOOK_WIDTH", "MIN_LARGE_SCREEN_WIDTH", "MIN_EXTRA_LARGE_SCREEN_WIDTH", "useScreenDetect", "__name", "isMobile", "setIsMobile", "useState", "isTablet", "setIsTablet", "isNotebook", "setIsNotebook", "isLargeScreen", "setIsLargeScreen", "isExtraLargeScreen", "setIsExtraLargeScreen", "handleResize", "useLayoutEffect", "useScreenDetect_default", "MAX_STEPS", "MAX_BLOCKCHAINS", "ImageComponent", "__name", "props", "content", "src", "className", "open", "state", "container", "tooltipContainer", "getContainer", "React", "Tooltip", "ImageContainer", "Image", "QuoteTrigger", "quoteRef", "selected", "setExpanded", "steps", "expanded", "type", "numberOfSteps", "blockchains", "getUniqueBlockchains", "isTablet", "isMobile", "useScreenDetect_default", "Trigger", "ref", "e", "prevState", "rowStyles", "Typography", "i18n", "Divider", "step", "index", "key", "arrow", "IconContainer", "ChevronRightIcon", "i", "MoreStep", "blockchain", "chain", "ChevronDownIcon", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "selected", "tagHidden", "showModalFee", "onClickAllRoutes", "fullExpandedMode", "propContainer", "blockchains", "useAppStore", "tokens", "swappers", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "roundedInput", "numberToString", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "getQuoteSteps", "__name", "swaps", "internalSwap", "swap", "index", "stepState", "hasBridgeLimitError", "hasSlippageError", "hasSlippageWarning", "stepHasError", "stepHasWarning", "alertTitle", "i18n", "getSwapperDisplayName", "getBlockchainShortNameFor", "formatTooltipNumbers", "BigNumber", "React", "FooterStepAlarm", "Alert", "FooterAlert", "Typography", "Divider", "roundedSecondsToString", "getUsdFeeOfStep", "steps", "numberOfSteps", "container", "getContainer", "sortedQuoteTags", "sortTags", "showAllRoutesButton", "totalTime", "totalArrivalTime", "totalFee", "getTotalFeeInUsd", "fee", "feeWarning", "GAS_FEE_MAX", "FullExpandedQuote", "getExpanded", "SummaryContainer", "summaryStyles", "TagContainer", "tag", "key", "QuoteTag", "Line", "summaryHeaderStyles", "QuoteCostDetails", "AllRoutesButton", "e", "basicInfoStyles", "FrameIcon", "InfoIcon", "ContainerInfoOutput", "BasicInfoOutput", "Tooltip", "TokenAmount", "QuoteSummary", "QuoteContainer", "QuoteTrigger", "Content", "HorizontalSeparator", "stepsDetailsStyles", "step", "StepDetails", "Divider", "Skeleton", "React", "darkTheme", "styled", "Container", "Chains", "Steps", "StepSeparator", "ChainToken", "Divider", "Skeleton", "React", "css", "styled", "FlexContent", "BasicSummary", "Output", "OutputTokenInfo", "QuoteSummary", "QuoteSummarySeparator", "TokenAmount", "TokenAmountLabel", "SwapPreview", "RowStyle", "QuoteSummarySkeleton", "props", "type", "tagHidden", "quotePreview", "React", "QuoteSummary", "TokenAmount", "ChainToken", "Divider", "TokenAmountLabel", "Skeleton", "showAllRoutesSkeleton", "FlexContent", "Line", "RowStyle", "BasicSummary", "Output", "OutputTokenInfo", "SwapPreview", "QuoteSummarySeparator", "__name", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "styled", "StepContent", "StepTokens", "StepTokenInfo", "StepIconContainer", "StepTitle", "StepSkeleton", "props", "separator", "React", "StepTitle", "Skeleton", "Divider", "StepContent", "StepSeparator", "StepTokens", "StepTokenInfo", "ChainToken", "StepIconContainer", "NextIcon", "__name", "QuoteSkeleton", "props", "type", "expanded", "tagHidden", "React", "Container", "QuoteSummarySkeleton", "Chains", "Skeleton", "Steps", "Divider", "StepSkeleton", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "expanded", "tagHidden", "onClick", "showModalFee", "selected", "onClickAllRoutes", "fullExpandedMode", "container", "inputAmount", "inputUsdValue", "toToken", "useQuoteStore", "outputAmount", "BigNumber", "outputUsdValue", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "showQuote", "React", "QuoteContainer", "QuoteSkeleton", "Quote", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "useFetch", "request", "loading", "setLoading", "useState", "abortController", "useRef", "cancelFetch", "__name", "requestBody", "res", "error", "useFetchConfirmQuote", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "quoteError", "getQuoteError", "__name", "swaps", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setSelectedQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "resetAlerts", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "disabledLiquiditySources", "blockchains", "tokens", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchConfirmQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "wallets", "acc", "item", "requestBody", "response", "result", "throwErrorIfResponseIsNotValid", "currentQuote", "swapSettings", "confirmSwapWarnings", "generateWarnings", "proceedAnyway", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "error", "handleQuoteErrors", "Buttons", "styled", "IconButton", "confirmBtnStyles", "css", "iconStyles", "descriptionStyles", "ConfirmSwapPage", "selectedQuote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "location", "useLocation", "dbErrorMessage", "setDbErrorMessage", "useState", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "isConfirming", "setIsConfirming", "isActiveTab", "useUiStore", "disabledLiquiditySources", "useAppStore", "prevDisabledLiquiditySources", "useRef", "manager", "useManager", "confirmSwap", "fetchingConfirmationQuote", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showQuoteWarningModal", "setShowQuoteWarningModal", "onConfirmSwap", "__name", "result", "addNewSwap", "swap_url", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "quoteChanged", "QuoteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "quoteWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "useLayoutEffect", "quoteWarning", "quoteError", "alerts", "React", "Alert", "getQuoteUpdateWarningMessage", "settings_url", "QuoteWarningsAndErrors", "Layout", "i18n", "wallets_url", "Button", "WalletIcon", "ConfirmWalletsModal", "PageContainer", "Typography", "RefreshButton", "Divider", "joinList", "alert", "index", "QuoteInfo", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "i18n", "Divider", "GroupedVirtualizedList", "Skeleton", "SwapListItem", "Typography", "React", "useCallback", "useEffect", "useRef", "useState", "calculateGroupsSoFar", "totalGroups", "count", "groups", "index", "group", "__name", "css", "darkTheme", "styled", "groupStyles", "SwapItemContainer", "Group", "Time", "SwapList", "NotFoundContainer", "ITEMS_PER_PAGE", "HistoryGroupedList", "props", "list", "onSwapClick", "groupBy", "isLoading", "currentGroupCounts", "setCurrentGroupCounts", "useState", "loadedItems", "useRef", "swaps", "groupCounts", "groups", "calculateGroups", "useCallback", "calculateGroupsSoFar", "loadMore", "remainedItems", "useEffect", "React", "group", "index", "Group", "Time", "Skeleton", "Divider", "SwapList", "_", "SwapListItem", "GroupedVirtualizedList", "Typography", "groupStyles", "groupIndex", "swap", "firstStep", "lastStep", "SwapItemContainer", "getContainer", "i18n", "numberToString", "formatTooltipNumbers", "__name", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "i18n", "addYearsToOutput", "key", "swap", "now", "dayjs", "time", "swapDate", "year", "groupedSwaps", "item", "items", "group", "groupCounts", "groups", "HistoryGroupedListContainer", "styled", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "i18n", "PageContainer", "SearchInput", "Divider", "NotFoundContainer", "NotFound", "HistoryGroupedList", "groupSwapsByDate", "i18n", "Button", "Divider", "styled", "WarningIcon", "BigNumber", "React", "useEffect", "useState", "useNavigate", "i18n", "Header", "React", "useEffect", "useState", "i18n", "Divider", "FullExpandedQuote", "Typography", "React", "styled", "ErrorsContainer", "StrategyContent", "SelectContainer", "i18n", "Select", "React", "SelectStrategy", "props", "updateQuotePartialState", "sortStrategy", "useQuoteStore", "ROUTE_STRATEGY", "i18n", "React", "SelectContainer", "Select", "item", "__name", "ITEM_SKELETON_COUNT", "Quotes", "props", "loading", "onClickOnQuote", "fetch", "showModalFee", "hasSort", "fullExpandedMode", "propContainer", "selectedQuote", "quotes", "updateQuotePartialState", "fromToken", "toToken", "sortStrategy", "error", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "tokens", "container", "getContainer", "hasQuotes", "userSlippage", "getQuoteWarning", "__name", "quote", "mergedQuote", "generateQuoteWarnings", "showNoResultMessage", "sortQuotes", "sortQuotesBy", "React", "StrategyContent", "Typography", "i18n", "SelectStrategy", "Divider", "_", "index", "FullExpandedQuote", "QuoteSkeleton", "quoteWarning", "quoteError", "getQuoteError", "lastIndex", "QuoteInfo", "ErrorsContainer", "NoResult", "darkTheme", "styled", "Container", "Content", "TIME_TO_CLOSE_OPEN_EXPANDED", "ExpandedQuotes", "props", "fetch", "loading", "onClickOnQuote", "onClickRefresh", "isVisible", "isDelayedVisible", "setIsDelayedVisible", "useState", "containerClass", "config", "useAppStore", "fullExpandedMode", "container", "getExpanded", "useEffect", "timeout", "React", "Container", "LayoutContainer", "WIDGET_UI_ID", "Header", "i18n", "SelectStrategy", "HeaderButtons", "Content", "Quotes", "__name", "i18n", "SwapInput", "React", "ReverseIcon", "React", "keyframes", "styled", "ROTATE_ANIMATION_DURATION", "rotateAnimation", "SwitchButtonContainer", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "SwitchButtonContainer", "StyledButton", "event", "button", "ROTATE_ANIMATION_DURATION", "ReverseIcon", "__name", "styled", "Container", "FromContainer", "Inputs", "props", "fetchingQuote", "fetchMetaStatus", "onClickToken", "isExpandable", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "selectedQuote", "useQuoteStore", "connectedWallets", "getBalanceFor", "useWalletsStore", "fromTokenBalance", "fromTokenFormattedBalance", "formatBalance", "tokenBalanceReal", "numberToString", "fetchingBalance", "isFetchingBalance", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "percentageChange", "getPriceImpact", "React", "Container", "FromContainer", "SwapInput", "i18n", "formatTooltipNumbers", "errorMessages", "getContainer", "SwitchFromAndToButton", "getPriceImpactLevel", "__name", "useCallback", "useEffect", "useState", "useFetchAllQuotes", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "DEBOUNCE_DELAY", "useSwapInput", "refetchQuote", "fetchQuote", "cancelFetch", "useFetchAllQuotes", "configExcludeLiquiditySources", "features", "enableCentralizedSwappers", "useAppStore", "connectedWallets", "useWalletsStore", "tokens", "fromToken", "toToken", "inputAmount", "inputUsdValue", "selectedQuote", "sortStrategy", "resetQuote", "error", "warning", "setSelectedQuote", "updateQuotePartialState", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "fetchStatus", "liquiditySources", "disabledLiquiditySources", "excludeLiquiditySources", "loading", "setLoading", "useState", "userSlippage", "shouldSkipRequest", "areTokensEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "requestBody", "createQuoteRequestBody", "isFeatureEnabled", "res", "sortQuotes", "sortQuotesBy", "quote", "getDefaultQuote", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "MainContainer", "styled", "TIME_TO_NAVIGATE_ANOTHER_PAGE", "Home", "navigate", "useNavigate", "fromToken", "toToken", "inputAmount", "selectedQuote", "refetchQuote", "quoteError", "quoteWarning", "quotes", "setSelectedQuote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "updateQuotePartialState", "useQuoteStore", "isVisibleExpanded", "setIsVisibleExpanded", "useState", "isLargeScreen", "isExtraLargeScreen", "useScreenDetect_default", "fetchQuote", "loading", "useSwapInput", "config", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "isActiveTab", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "swapButtonState", "getSwapButtonState", "isExpandable", "isVariantExpandable", "hasInputs", "BigNumber", "isTokensIdentical", "fetchingQuote", "showMessages", "useEffect", "onClickRefresh", "onHandleNavigation", "__name", "route", "onClickOnQuote", "quote", "React", "Layout", "Button", "WarningIcon", "navigationRoutes", "i18n", "HeaderButtons", "PageContainer", "Inputs", "mode", "Divider", "QuoteInfo", "QuoteWarningsAndErrors", "ExpandedQuotes", "i18n", "Alert", "Divider", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useLanguage", "setLanguage", "language", "config", "useAppStore", "languages", "LANGUAGES", "defaultLanguage", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "navigateBack", "useNavigateBack", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "PageContainer", "Alert", "Divider", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "styled", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "ListItem", "styled", "CustomListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "_", "index", "CustomListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "disabledLiquiditySources", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "campaignMode", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "types", "i18n", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "PageContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "otherProps", "ListItemButton", "i18n", "React", "useNavigate", "RoutesPage", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "selectedQuote", "refetchQuote", "setSelectedQuote", "updateQuotePartialState", "quoteError", "useQuoteStore", "fetchQuote", "fetchingQuote", "useSwapInput", "onClickOnQuote", "__name", "quote", "settings_url", "navigationRoutes", "wallets_url", "React", "Layout", "i18n", "HeaderButtons", "PageContainer", "Quotes", "i18n", "Divider", "getCountCategories", "SelectableCategoryList", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "BlockchainCategories", "TransactionType", "filterByType", "__name", "blockchain", "type", "BlockchainCategories", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "ImageContainer", "styled", "Container", "styled", "List", "ScrollableArea", "ImageContainer", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "blockchains", "showCategory", "getCountCategories", "React", "Layout", "i18n", "PageContainer", "SelectableCategoryList", "Divider", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "Tooltip", "Typography", "React", "useEffect", "MOST_USED_BLOCKCHAINS", "prepare", "blockchains", "preferredBlockchains", "options", "list", "more", "sortByMostUsedBlockchains", "start", "preferredBlockchainsWithoutMainList", "howManyItemsShouldBeCheckedFromMainList", "i", "blockchain", "preferredBlockchain", "generateSortByPreferredBlockchainsFor", "__name", "a", "b", "mostUsed", "MOST_USED_BLOCKCHAINS", "aIndexInMostUsed", "token", "bIndexInMostUsed", "aIsMostUsed", "bIsMostUsed", "aIndexInPreferred", "bIndexInPreferred", "aIsPreferred", "bIsPreferred", "isInVisibleList", "prepareOutput", "item", "usePrepareBlockchainList", "blockchains", "options", "preferredBlockchains", "addPreferredBlockchain", "useAppStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Blockchains", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Blockchains", "e", "Skeleton", "BlockchainsChip", "item", "Tooltip", "getContainer", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "useEffect", "useState", "Divider", "ListItem", "Skeleton", "React", "css", "darkTheme", "ImageContainer", "styled", "Typography", "tokenNameStyles", "descriptionStyles", "tokenTitleStyles", "tokenAddressStyles", "tokenWithoutNameStyles", "usdValueStyles", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "TokenBalance", "StyledLink", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "descriptionStyles", "tokenNameStyles", "Title", "tokenTitleStyles", "Typography", "Divider", "Tag", "TagTitle", "tokenAddressStyles", "tokenWithoutNameStyles", "StyledLink", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "getBalanceFor", "loadingWallet", "useWalletsStore", "isTokenPinned", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "tokenBalance", "formatBalance", "blockchain", "lightShade", "generateShade", "isBright", "darkShade", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "TokenBalance", "usdValueStyles", "Container", "LoadingTokenList", "List", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "getBalanceFor", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "selectedBlockchainName", "blockchains", "useAppStore", "tokens", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "types", "i18n", "React", "Layout", "PageContainer", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "Alert", "Button", "styled", "React", "useInRouterContext", "useSearchParams", "i18n", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "Chip", "styled", "TextField", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "SlippageChip", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "setSlippage", "customSlippage", "setCustomSlippage", "useAppStore", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "SlippageChip", "TextField", "event", "value", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "i18n", "AutoThemeIcon", "BridgesIcon", "ChevronRightIcon", "DarkModeIcon", "Divider", "ExchangeIcon", "InfinityIcon", "InfoIcon", "LanguageIcon", "LightModeIcon", "List", "ListItem", "ListItemButton", "Skeleton", "styled", "Switch", "Tabs", "Tooltip", "Typography", "React", "useNavigate", "ThemeSection", "styled", "themesList", "React", "LightModeIcon", "Typography", "i18n", "DarkModeIcon", "AutoThemeIcon", "getThemeIcon", "__name", "theme", "iconProps", "SettingsLists", "navigate", "useNavigate", "themeConfig", "useAppStore", "setTheme", "activeLanguage", "languages", "useLanguage", "currentLanguage", "language", "fetchStatus", "swappers", "disabledLiquiditySources", "features", "isThemeHidden", "isFeatureHidden", "isLiquidityHidden", "isLanguageHidden", "infiniteApprove", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleSwapperEndItem", "totalSelected", "total", "Skeleton", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "BridgesIcon", "exchangeItem", "ExchangeIcon", "languageItem", "LanguageIcon", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "InfinityIcon", "Switch", "themeItem", "ListItem", "Tabs", "item", "settingItems", "List", "ListItemButton", "ResetAction", "styled", "SettingsPage", "isInCampaignMode", "updateCampaignMode", "useAppStore", "campaignMode", "setSearchParams", "useSearchParams", "isRouterInContext", "useInRouterContext", "onClick", "__name", "prev", "React", "Layout", "i18n", "PageContainer", "Alert", "Button", "Slippage", "SettingsLists", "i18n", "cancelSwap", "useManager", "Alert", "React", "useParams", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "Button", "CopyIcon", "Divider", "IconButton", "LinkIcon", "QuoteCost", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "BigNumber", "PendingSwapNetworkStatus", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "daysOfWeek", "i18n", "timeSince", "millisecond", "date", "day", "month", "year", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "React", "i18n", "Button", "Divider", "MessageBox", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "debug", "MessageBox", "Wallet", "useWallets", "React", "styled", "WalletContainer", "TooltipErrorContent", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "walletButtonDisabled", "connect", "getWalletInfo", "state", "useWallets", "walletType", "walletState", "mapStatusToWalletState", "walletInfo", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "error", "debug", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "walletButtonDisabled", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "WatermarkedModal", "WIDGET_UI_ID", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "realUsdValue", "realValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "WatermarkedModal", "WIDGET_UI_ID", "MessageBox", "i18n", "TokenAmount", "getContainer", "Divider", "Typography", "Button", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "IconButton", "React", "useState", "css", "darkTheme", "styled", "Typography", "Container", "styled", "HeaderDetails", "StepsList", "ScrollableArea", "Alerts", "PlaceholderContainer", "LoaderContainer", "rowStyles", "css", "darkTheme", "datePlaceholderStyles", "requestIdStyles", "outputStyles", "titleStepsStyles", "StyledLink", "ErrorMessages", "MessageText", "Typography", "styled", "Alerts", "ActionIcon", "AlertFooter", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ActionIcon", "ChevronDownIcon", "AlertFooter", "MessageText", "__name", "i18n", "Alert", "Button", "PendingSwapNetworkStatus", "React", "WarningAlert", "props", "switchNetwork", "setNetworkModal", "message", "showNetworkModal", "React", "Alert", "Button", "PendingSwapNetworkStatus", "e", "i18n", "__name", "SwapDetailsAlerts", "props", "switchNetwork", "showNetworkModal", "setNetworkModal", "message", "step", "hasAlreadyProceededToSign", "hasWarning", "isNetworkStatusInWarningState", "waitingForApproval", "inProgress", "waitingProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "swappers", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "getSwapperDisplayName", "internalSwap", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "swappers", "tokens", "retry", "useQuoteStore", "isActiveTab", "useUiStore", "navigate", "useNavigate", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "onCancel", "__name", "getUnreadNotifications", "useNotificationStore", "setAsRead", "unreadNotifications", "currentStep", "getCurrentStep", "currentStepNetworkStatus", "useEffect", "n", "showSwitchNetwork", "PendingSwapNetworkStatus", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "currentStepBlockchain", "getCurrentBlockchainOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "isMobileWallet", "walletType", "switchNetwork", "stepMessage", "getSwapMessages", "steps", "getSteps", "numberOfSteps", "firstStep", "lastStep", "outputAmount", "totalFee", "diagnosisUrl", "step", "outputUsdValue", "numberToString", "inputUsdValue", "realOutputUsdValue", "formatTooltipNumbers", "BigNumber", "realInputUsdValue", "percentageChange", "getPriceImpact", "stepDetailMessage", "completeModalDesc", "i18n", "getConciseAddress", "React", "ErrorMessages", "Typography", "MessageText", "Layout", "SuffixContainer", "Button", "PageContainer", "HeaderDetails", "rowStyles", "requestIdStyles", "IconButton", "CopyIcon", "StyledLink", "SCANNER_BASE_URL", "LinkIcon", "outputStyles", "QuoteCost", "roundedSecondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "titleStepsStyles", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "getContainer", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "Divider", "NotFound", "Skeleton", "Typography", "React", "i18n", "Divider", "Skeleton", "Typography", "React", "css", "styled", "Container", "StepContainer", "StepSeparator", "quoteSummaryItemStyles", "tokenAmountStyles", "costStyles", "quoteSummaryStyles", "quoteSummarySeparatorStyles", "swapsStepsStyles", "stepTitleStyles", "stepTokensStyles", "stepInfoStyles", "stepIconStyles", "extraInfoStyles", "LoadingSwapDetails", "React", "Container", "QuoteSummarySkeleton", "Typography", "i18n", "StepContainer", "StepSkeleton", "extraInfoStyles", "Divider", "Skeleton", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "rowStyles", "Typography", "requestIdStyles", "Skeleton", "Divider", "datePlaceholderStyles", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useParams", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "React", "Alert", "i18n", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "SwapDetailsPlaceholder", "SwapDetails", "AppRoutes", "useSyncStoresWithConfig", "useSyncUrlAndStore", "useRoutes", "navigationRoutes", "React", "Home", "RoutesPage", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "useQueueManager", "splitWalletNetwork", "isEvmBlockchain", "useContext", "useEffect", "useState", "globalCss", "globalFont", "__name", "globalCss", "useFetchApiConfig", "setWatermark", "useUiStore", "__name", "response", "getConfig", "data", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "useSubscribeToWidgetEvents", "tokens", "useAppStore", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "widgetEvents", "useEvents", "useEffect", "handleStepEvent", "__name", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "MainEvents", "handleRouteEvent", "RouteEventType", "useBootstrap", "globalFont", "useForceAutoConnect", "useSubscribeToWidgetEvents", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "evmChains", "isEvmBlockchain", "fetchApiConfig", "useFetchApiConfig", "useQueueManager", "useEffect", "tabManager", "useNotificationStore", "walletType", "splitWalletNetwork", "__name", "styled", "MainContainer", "Main", "useBootstrap", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "useLanguage", "React", "I18nManager", "MainContainer", "AppRoutes", "__name", "React", "useMemo", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "isActiveTab", "useUiStore", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "cancelSwap", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WidgetHistory", "__name", "manager", "actions", "getPendingSwaps", "swap", "meta", "id", "queue", "cancelSwap", "currentStep", "getCurrentStep", "getRelatedWalletOrNull", "getCurrentBlockchainOfOrNull", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "isActiveTab", "useUiStore", "retrySwap", "useQuoteStore", "history", "WidgetHistory", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "blockchains", "useAppStore", "tokens", "swappers", "loadingStatus", "resetLanguage", "useLanguage", "notifications", "useNotificationStore", "value", "tabManager", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "isExternalWalletsEnabled", "React", "AppRouter", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name"]
7
7
  }