@liberfi.io/ui-predict 0.1.44 → 0.1.45
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.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/contexts/PredictContext.tsx","../src/hooks/usePredictContext.ts","../src/hooks/usePredictClient.ts","../src/hooks/useEventsQuery.ts","../src/hooks/useEventsInfiniteQuery.ts","../src/hooks/useEventByIdQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useMarketByIdQuery.ts","../src/hooks/useMarketByMintQuery.ts","../src/hooks/useMarketsBatchQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/usePriceHistoryQuery.ts","../src/hooks/useForecastHistoryQuery.ts","../src/hooks/useLiveDataQuery.ts","../src/hooks/useSeriesQuery.ts","../src/hooks/useCategoriesQuery.ts","../src/hooks/useSearchQuery.ts","../src/hooks/useOutcomeMintsQuery.ts","../src/hooks/useQuoteQuery.ts","../src/hooks/useSwapMutation.ts","../src/hooks/useOrderQuery.ts","../src/hooks/useIntentQuery.ts","../src/hooks/usePredictionMarketMutation.ts","../src/hooks/useTokensQuery.ts","../src/hooks/useVenuesQuery.ts","../src/client/ws.ts","../src/hooks/useWsConnection.ts","../src/hooks/useWsClient.ts","../src/hooks/usePricesSubscription.ts","../src/hooks/useTradesSubscription.ts","../src/hooks/useOrderbookSubscription.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/consts/index.ts","../src/components/events/events.script.tsx","../src/components/events/events.skeleton.tsx","../src/components/events/gauge-chart.ui.tsx","../src/components/events/event-item.ui.tsx","../src/components/events/events.ui.tsx","../src/components/events/events.widget.tsx","../src/components/events/events.page.tsx","../src/components/trade-form/trade-form.script.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/hooks/useMarketsHoldings.ts","../src/components/event-detail/event-candlesticks.ui.tsx","../src/components/event-detail/event-market-candlesticks.script.ts","../src/components/event-detail/event-market-candlesticks.ui.tsx","../src/components/event-detail/event-market-orderbook.script.ts","../src/components/event-detail/event-market-orderbook.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-markets.ui.tsx","../src/components/event-detail/event-rules.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/order-book/order-book.script.tsx","../src/components/order-book/order-book.ui.tsx","../src/components/order-book/order-book.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/providers/PredictProvider.tsx","../src/client/base.ts","../src/client/dflow.ts"],"names":["version_default","PredictContext","createContext","usePredictContext","context","useContext","usePredictClient","client","eventsQueryKey","params","fetchEvents","useEventsQuery","queryOptions","useQuery","eventsInfiniteQueryKey","useEventsInfiniteQuery","options","useInfiniteQuery","pageParam","lastPage","eventByIdQueryKey","fetchEventById","useEventByIdQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","marketByIdQueryKey","fetchMarketById","useMarketByIdQuery","marketByMintQueryKey","mintAddress","fetchMarketByMint","useMarketByMintQuery","marketsBatchQueryKey","request","fetchMarketsBatch","useMarketsBatchQuery","orderBookQueryKey","marketTicker","fetchOrderBook","useOrderBookQuery","orderBookByMintQueryKey","fetchOrderBookByMint","useOrderBookByMintQuery","tradesQueryKey","fetchTrades","useTradesQuery","tradesByMintQueryKey","fetchTradesByMint","useTradesByMintQuery","eventCandlesticksQueryKey","fetchEventCandlesticks","ticker","rest","useEventCandlesticksQuery","marketCandlesticksQueryKey","fetchMarketCandlesticks","useMarketCandlesticksQuery","marketCandlesticksByMintQueryKey","fetchMarketCandlesticksByMint","useMarketCandlesticksByMintQuery","usePriceHistoryQuery","forecastPercentileHistoryQueryKey","fetchForecastPercentileHistory","useForecastPercentileHistoryQuery","forecastPercentileHistoryByMintQueryKey","fetchForecastPercentileHistoryByMint","useForecastPercentileHistoryByMintQuery","liveDataQueryKey","fetchLiveData","useLiveDataQuery","liveDataByEventQueryKey","fetchLiveDataByEvent","useLiveDataByEventQuery","liveDataByMintQueryKey","fetchLiveDataByMint","useLiveDataByMintQuery","seriesQueryKey","fetchSeries","useSeriesQuery","seriesByTickerQueryKey","seriesTicker","fetchSeriesByTicker","useSeriesByTickerQuery","tagsByCategoriesQueryKey","fetchTagsByCategories","useTagsByCategoriesQuery","filtersBySportsQueryKey","fetchFiltersBySports","useFiltersBySportsQuery","useCategoriesQuery","searchQueryKey","fetchSearch","useSearchQuery","outcomeMintsQueryKey","fetchOutcomeMints","useOutcomeMintsQuery","filterOutcomeMints","useFilterOutcomeMintsMutation","useMutation","quoteQueryKey","fetchQuote","useQuoteQuery","createSwap","useCreateSwapMutation","createSwapInstructions","useCreateSwapInstructionsMutation","orderQueryKey","fetchOrder","useOrderQuery","orderStatusQueryKey","fetchOrderStatus","useOrderStatusQuery","intentQuoteQueryKey","fetchIntentQuote","useIntentQuoteQuery","submitIntentSwap","useSubmitIntentSwapMutation","initPredictionMarket","useInitPredictionMarketMutation","tokensQueryKey","fetchTokens","useTokensQuery","tokensWithDecimalsQueryKey","fetchTokensWithDecimals","useTokensWithDecimalsQuery","venuesQueryKey","fetchVenues","useVenuesQuery","DflowPredictWsClient","config","event","error","onUpdate","removeListener","callback","listeners","index","key","channel","subscription","status","data","listener","message","type","dataMsg","delay","createDflowPredictWsClient","useWsConnection","wsEndpoint","autoConnect","autoReconnect","enabled","setStatus","useState","setError","clientRef","useRef","useEffect","unsubStatus","newStatus","unsubError","err","unsubConnect","connect","useCallback","disconnect","useWsClient","wsClient","wsStatus","setWsStatus","usePricesSubscription","all","tickers","prices","setPrices","isSubscribed","setIsSubscribed","onUpdateRef","unsubscribe","update","prev","next","useTradesSubscription","maxHistory","trades","setTrades","trade","clearHistory","useOrderbookSubscription","orderbooks","setOrderbooks","getOrderbook","CATEGORY_ORDER","useEventsCategories","tagsData","isLoading","isError","useMemo","orderIndex","cat","idx","category","tags","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","className","t","useTranslation","handleSelectAll","jsxs","cn","jsx","HorizontalScrollContainer","Chip","tag","label","isSelected","onPress","variant","CategoriesSkeleton","count","_","i","Skeleton","CategoriesWidget","onSelect","setSelectedCategory","setSelectedTag","handleCategorySelect","c","handleTagSelect","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","useEvents","restParams","needsSeriesLookup","seriesData","isSeriesFetching","isSeriesError","seriesError","derivedSeriesTickers","s","mergedParams","infiniteData","isEventsLoading","isEventsFetching","isFetchingMore","hasMore","fetchMore","refetch","page","isSeriesResolving","EventItemSkeleton","EventsSkeleton","GaugeChartUI","value","showLabel","normalized","EventItemUI","onSelectOutcome","manualSelectedMarket","setManualSelectedMarket","rawMarkets","markets","openMarkets","market","isSingleMarket","selectedMarket","formattedVolume","formatAmountUSDCompact","getYesCents","getNoCents","getYesPercent","yesCents","noCents","formatPercent","getNoPercent","cents","eventStatus","hasActiveMarket","m","handleMarketClick","handleBack","handleYesClick","handleNoClick","handleSelect","displayedMarkets","hasMoreMarkets","Avatar","StyledTooltip","e","ChevronUpIcon","Button","ChevronRightIcon","ChevronLeftIcon","SM","MD","LG","XL","GAP","ROW_HEIGHT_XS","ROW_HEIGHT_SM","ROW_HEIGHT_LG","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","containerRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","List","EventGridRow","style","gap","Spinner","startIdx","rowEvents","emptySlots","innerStyle","EventsWidget","queryParams","isFetching","EventsPage","selection","setSelection","getMintAddress","accounts","collateralMint","outcome","accountInfo","USDC_MINT","SOLANA_TOKENS","fireCelebration","defaults","confetti","useTradeForm","_chain","initialOutcome","initialSide","authStatus","useAuth","solanaWallet","useWallets","w","ChainNamespace","isAuthenticated","userPublicKey","setOutcome","side","setSideRaw","quantity","setQuantityRaw","outcomeMint","inputMint","outputMint","quoteEnabled","pricePerShare","shares","amount","order","isQuoteLoading","quoteError","refetchOrder","walletPortfolios","isBalanceLoading","refetchBalance","useWalletPortfoliosQuery","Chain","usdcBalance","usdcPortfolio","p","outcomeTokenBalance","outcomePortfolio","yesMint","noMint","yesTokenBalance","noTokenBalance","orderBook","bestBid","bestAsk","priceImpact","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","setQuantity","v","clamped","rounded","validation","errors","txHash","setTxHash","isSubmitting","setIsSubmitting","submit","currentOrder","txBytes","hash","toast","reset","USDC_LOGO","TradeFormUI","isValid","onOutcomeChange","onSideChange","onQuantityChange","onSubmit","submitLabel","sideLabel","outcomeLabel","submitColor","Tabs","Tab","o","holdingBalance","price","StyledNumberInput","Fragment","amt","pct","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","MarketRow","EventDetailSkeleton","marketCount","TradeFormSkeleton","useEventDetail","candlestickMarketTickers","chartRange","candlestickPeriodInterval","rangeDuration","candlestickEndTs","isEventLoading","eventError","candlestickStartTs","series","isSeriesLoading","marketsToQuery","candlestickQueries","useQueries","isCandlesticksLoading","q","candlestickErrors","candlesticks","map","useMarketsHoldings","address","balanceByMint","yesShares","noShares","BreathingDot","props","cx","cy","dataLength","stroke","CHART_COLORS","formatTimestamp","timestamp","date","transformCandlesticks","marketTickers","sampleInterval","perMarketMaps","response","point","bucket","allTimestamps","ts","sortedTimestamps","lastValues","dataPoint","lastValue","EventCandlesticks","onDataChange","activeIndex","setActiveIndex","onDataChangeRef","chartData","yAxisDomain","minValue","maxValue","range","padding","domainMin","domainMax","getDataAtIndex","handleMouseMove","state","handleMouseLeave","ResponsiveContainer","LineChart","XAxis","x","y","payload","totalPoints","sampleIntervalX","isFirst","isLast","isSampled","CartesianGrid","YAxis","Tooltip","name","Line","dotProps","getLatestEventData","useMarketCandlesticks","openTime","periodInterval","endTs","startTs","CHART_COLOR","RANGE_OPTIONS","formatCompact","n","points","bucketMap","existing","close","volume","EventMarketCandlesticksUI","onRangeChange","dp","RangeSelector","active","opt","isActive","useMarketOrderbook","orderbook","isOrderbookLoading","orderbookError","yesBids","yesAsks","noBids","noAsks","buildRows","levels","maxLevels","sliced","cumulative","level","applyDepth","rows","maxCum","row","formatPrice","formatQty","qty","formatTotal","total","RowItem","showType","onClick","isAsk","barColor","typeColor","SkeletonRow","widths","DEFAULT_MAX_LEVELS","EventMarketOrderbookUI","bids","asks","onPriceClick","bidRows","askRows","spread","spreadPercent","mid","EventMarketDetailWidget","onTradeAction","activeTab","setActiveTab","setChartRange","handleYesPriceClick","_price","bookSide","handleNoPriceClick","DEFAULT_VISIBLE_COUNT","getMarketPrices","EventMarketsUI","renderMarketDetail","marketHoldings","showAll","setShowAll","expandedTicker","setExpandedTicker","visibleMarkets","toggleExpand","isExpanded","holding","hasYes","hasNo","ChevronDownIcon","CLOSED_STATUSES","month","day","year","hours","minutes","EventTimeline","isClosed","items","openItem","closeItem","payoutItem","closeDescription","item","EventRulesUI","selectedMarketTicker","setSelectedMarketTicker","marketsWithRules","Select","keys","selected","SelectItem","EventDetailUI","selectedMarketTickers","onMarketSelectionChange","currentData","setCurrentData","isCompact","setIsCompact","sentinelRef","sentinel","compact","rafId","bottom","shouldBeCompact","onScroll","formattedEndDate","option","SelectSection","EventDetailWidget","eventId","initialMarketTickers","initialChartRange","setSelectedMarketTickers","marketsInitializedRef","defaultMarketTickers","handleRangeChange","newRange","handleMarketSelectionChange","EventDetailPage","widgetProps","isMobile","useScreen","isOpen","onOpen","onClose","useDisclosure","tradeSelection","setTradeSelection","handleTradeAction","tradeFormKey","Drawer","DrawerContent","DrawerBody","useOrderBook","refetchInterval","rawBids","rawAsks","midpoint","OrderBookRowItem","isBid","textColor","OrderBookUI","isEmpty","OrderBookWidget","useOpenOrders","_params","cancellingOrderId","setCancellingOrderId","cancelError","cancelOrder","_orderId","formatDate","iso","OpenOrdersUI","orders","onCancel","StyledTable","TableHeader","TableColumn","TableBody","TableRow","TableCell","OpenOrdersWidget","useTradeHistory","pageSize","setPage","cursors","setCursors","currentCursor","hasNextPage","hasPrevPage","goToPage","nextPage","newCursors","prevPage","TradeHistoryUI","onNextPage","onPrevPage","TradeHistoryWidget","usePositions","summary","fmtCents","PnlText","isPositive","PositionsUI","positions","onSell","pos","PositionsWidget","PredictProvider","children","buildQuery","provider","qs","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","httpPost","parseSide","raw","sort","priceStr","normalizeOrderbook","DflowPredictClient","withNestedMarkets","marketId","eventTicker"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-predict\"] = \"0.1.44\";\n}\n\nexport default \"0.1.44\";\n","import { createContext } from \"react\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport interface PredictContextValue {\n /** The predict API client instance */\n client: IPredictClient;\n\n /** The WebSocket client instance for real-time data */\n wsClient: IPredictWsClient | null;\n}\n\nexport const PredictContext = createContext<PredictContextValue>(\n {} as PredictContextValue,\n);\n","import { useContext } from \"react\";\nimport { PredictContext } from \"../contexts\";\n\nexport function usePredictContext() {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictContext must be used within a PredictProvider\");\n }\n return context;\n}\n","import { usePredictContext } from \"./usePredictContext\";\n\nexport function usePredictClient() {\n const { client } = usePredictContext();\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n StandardEvent,\n EventQueryParams,\n IPredictClient,\n StandardEventsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsQueryKey(params?: EventQueryParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\nexport async function fetchEvents(\n client: IPredictClient,\n params?: EventQueryParams,\n): Promise<StandardEventsResponse> {\n return await client.getEvents(params);\n}\n\nexport function useEventsQuery(\n params?: EventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardEventsResponse,\n Error,\n StandardEventsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: async () => fetchEvents(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardEvent, EventQueryParams, StandardEventsResponse };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { EventQueryParams, StandardEventsResponse } from \"../types\";\nimport { fetchEvents } from \"./useEventsQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsInfiniteQueryKey(\n params?: Omit<EventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"events\", \"infinite\", params ?? {}];\n}\n\nexport function useEventsInfiniteQuery(\n params: Omit<EventQueryParams, \"cursor\"> = {},\n options: Omit<\n UseInfiniteQueryOptions<\n StandardEventsResponse,\n Error,\n InfiniteData<StandardEventsResponse>,\n unknown[],\n number | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: eventsInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchEvents(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n // If API returns a non-null cursor, use it as the next page param\n return lastPage.cursor ?? undefined;\n },\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { StandardEvent, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseEventByIdQueryParams {\n /** Event ticker ID */\n id: string;\n /** Include nested markets in response */\n withNestedMarkets?: boolean;\n}\n\nexport function eventByIdQueryKey(params: UseEventByIdQueryParams): unknown[] {\n return [\"predict\", \"event\", \"byId\", params.id, params.withNestedMarkets];\n}\n\nexport async function fetchEventById(\n client: IPredictClient,\n params: UseEventByIdQueryParams,\n): Promise<StandardEvent> {\n return await client.getEventById(params.id, params.withNestedMarkets);\n}\n\nexport function useEventByIdQuery(\n params: UseEventByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardEvent, Error, StandardEvent, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventByIdQueryKey(params),\n queryFn: async () => fetchEventById(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n StandardMarket,\n MarketQueryParams,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketsQueryKey(params?: MarketQueryParams): unknown[] {\n return [\"predict\", \"markets\", params ?? {}];\n}\n\nexport async function fetchMarkets(\n client: IPredictClient,\n params?: MarketQueryParams,\n): Promise<StandardMarketsResponse> {\n return await client.getMarkets(params);\n}\n\nexport function useMarketsQuery(\n params?: MarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardMarket, MarketQueryParams, StandardMarketsResponse };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketByIdQueryParams {\n /** Market ticker ID */\n id: string;\n}\n\nexport function marketByIdQueryKey(\n params: UseMarketByIdQueryParams,\n): unknown[] {\n return [\"predict\", \"market\", \"byId\", params.id];\n}\n\nexport async function fetchMarketById(\n client: IPredictClient,\n params: UseMarketByIdQueryParams,\n): Promise<StandardMarket> {\n return await client.getMarketById(params.id);\n}\n\nexport function useMarketByIdQuery(\n params: UseMarketByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByIdQueryKey(params),\n queryFn: async () => fetchMarketById(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Market by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function marketByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"market\", \"byMint\", mintAddress];\n}\n\nexport async function fetchMarketByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<StandardMarket> {\n return await client.getMarketByMint(mintAddress);\n}\n\nexport function useMarketByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByMintQueryKey(mintAddress),\n queryFn: async () => fetchMarketByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MarketsBatchRequest,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Markets Batch Query\n// -----------------------------------------------------------------------------\n\nexport function marketsBatchQueryKey(request: MarketsBatchRequest): unknown[] {\n return [\"predict\", \"markets\", \"batch\", request];\n}\n\nexport async function fetchMarketsBatch(\n client: IPredictClient,\n request: MarketsBatchRequest,\n): Promise<StandardMarketsResponse> {\n return await client.getMarketsBatch(request);\n}\n\nexport function useMarketsBatchQuery(\n request: MarketsBatchRequest,\n options: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsBatchQueryKey(request),\n queryFn: async () => fetchMarketsBatch(client, request),\n enabled: Boolean(request.tickers?.length || request.mints?.length),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, OrderbookResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderBookQueryKey(marketTicker: string): unknown[] {\n return [\"predict\", \"orderBook\", marketTicker];\n}\n\nexport async function fetchOrderBook(\n client: IPredictClient,\n marketTicker: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbook(marketTicker);\n}\n\nexport function useOrderBookQuery(\n marketTicker: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookQueryKey(marketTicker),\n queryFn: async () => fetchOrderBook(client, marketTicker),\n ...options,\n });\n}\n\n// Also export a hook for getting orderbook by mint address\nexport function orderBookByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"orderBook\", \"byMint\", mintAddress];\n}\n\nexport async function fetchOrderBookByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbookByMint(mintAddress);\n}\n\nexport function useOrderBookByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookByMintQueryKey(mintAddress),\n queryFn: async () => fetchOrderBookByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiTradeResponse,\n TradesQueryParams,\n TradesByMintQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params?: TradesQueryParams): unknown[] {\n return [\"predict\", \"trades\", params ?? {}];\n}\n\nexport async function fetchTrades(\n client: IPredictClient,\n params?: TradesQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params?: TradesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: async () => fetchTrades(client, params),\n ...queryOptions,\n });\n}\n\n// Also export a hook for getting trades by mint address\nexport function tradesByMintQueryKey(\n params: TradesByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"trades\", \"byMint\", params];\n}\n\nexport async function fetchTradesByMint(\n client: IPredictClient,\n params: TradesByMintQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTradesByMint(params);\n}\n\nexport function useTradesByMintQuery(\n params: TradesByMintQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesByMintQueryKey(params),\n queryFn: async () => fetchTradesByMint(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n CandlesticksResponse,\n CandlesticksQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseEventCandlesticksParams extends CandlesticksQueryParams {\n /** Event ticker */\n ticker: string;\n}\n\nexport function eventCandlesticksQueryKey(\n params: UseEventCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"event\", params];\n}\n\nexport async function fetchEventCandlesticks(\n client: IPredictClient,\n params: UseEventCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getEventCandlesticks(ticker, rest);\n}\n\nexport function useEventCandlesticksQuery(\n params: UseEventCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventCandlesticksQueryKey(params),\n queryFn: async () => fetchEventCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksParams extends CandlesticksQueryParams {\n /** Market ticker */\n ticker: string;\n}\n\nexport function marketCandlesticksQueryKey(\n params: UseMarketCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", params];\n}\n\nexport async function fetchMarketCandlesticks(\n client: IPredictClient,\n params: UseMarketCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getMarketCandlesticks(ticker, rest);\n}\n\nexport function useMarketCandlesticksQuery(\n params: UseMarketCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksQueryKey(params),\n queryFn: async () => fetchMarketCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks by Mint Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksByMintParams\n extends CandlesticksQueryParams {\n /** Mint address */\n mintAddress: string;\n}\n\nexport function marketCandlesticksByMintQueryKey(\n params: UseMarketCandlesticksByMintParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", \"byMint\", params];\n}\n\nexport async function fetchMarketCandlesticksByMint(\n client: IPredictClient,\n params: UseMarketCandlesticksByMintParams,\n): Promise<CandlesticksResponse> {\n const { mintAddress, ...rest } = params;\n return await client.getMarketCandlesticksByMint(mintAddress, rest);\n}\n\nexport function useMarketCandlesticksByMintQuery(\n params: UseMarketCandlesticksByMintParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksByMintQueryKey(params),\n queryFn: async () => fetchMarketCandlesticksByMint(client, params),\n ...options,\n });\n}\n\n// Legacy aliases for backward compatibility\n/** @deprecated Use useEventCandlesticksQuery or useMarketCandlesticksQuery instead */\nexport const usePriceHistoryQuery = useMarketCandlesticksQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n ForecastPercentileHistoryResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryQueryKey(\n params: ForecastPercentileHistoryQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", params];\n}\n\nexport async function fetchForecastPercentileHistory(\n client: IPredictClient,\n params: ForecastPercentileHistoryQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistory(params);\n}\n\nexport function useForecastPercentileHistoryQuery(\n params: ForecastPercentileHistoryQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistory(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryByMintQueryKey(\n params: ForecastPercentileHistoryByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", \"byMint\", params];\n}\n\nexport async function fetchForecastPercentileHistoryByMint(\n client: IPredictClient,\n params: ForecastPercentileHistoryByMintQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistoryByMint(params);\n}\n\nexport function useForecastPercentileHistoryByMintQuery(\n params: ForecastPercentileHistoryByMintQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryByMintQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistoryByMint(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n LiveDataResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Live Data Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataQueryKey(params: LiveDataQueryParams): unknown[] {\n return [\"predict\", \"liveData\", params];\n}\n\nexport async function fetchLiveData(\n client: IPredictClient,\n params: LiveDataQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveData(params);\n}\n\nexport function useLiveDataQuery(\n params: LiveDataQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataQueryKey(params),\n queryFn: async () => fetchLiveData(client, params),\n enabled: params.milestoneIds.length > 0,\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Event Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByEventQueryKey(\n params: LiveDataByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byEvent\", params];\n}\n\nexport async function fetchLiveDataByEvent(\n client: IPredictClient,\n params: LiveDataByEventQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByEvent(params);\n}\n\nexport function useLiveDataByEventQuery(\n params: LiveDataByEventQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByEventQueryKey(params),\n queryFn: async () => fetchLiveDataByEvent(client, params),\n enabled: Boolean(params.eventTicker),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByMintQueryKey(\n params: LiveDataByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byMint\", params];\n}\n\nexport async function fetchLiveDataByMint(\n client: IPredictClient,\n params: LiveDataByMintQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByMint(params);\n}\n\nexport function useLiveDataByMintQuery(\n params: LiveDataByMintQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByMintQueryKey(params),\n queryFn: async () => fetchLiveDataByMint(client, params),\n enabled: Boolean(params.mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SeriesListResponse,\n SeriesResponse,\n SeriesQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Series List Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesQueryKey(params?: SeriesQueryParams): unknown[] {\n return [\"predict\", \"series\", params ?? {}];\n}\n\nexport async function fetchSeries(\n client: IPredictClient,\n params?: SeriesQueryParams,\n): Promise<SeriesListResponse> {\n return await client.getSeries(params);\n}\n\nexport function useSeriesQuery(\n params?: SeriesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SeriesListResponse, Error, SeriesListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesQueryKey(params),\n queryFn: async () => fetchSeries(client, params),\n ...queryOptions,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Series by Ticker Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesByTickerQueryKey(seriesTicker: string): unknown[] {\n return [\"predict\", \"series\", \"byTicker\", seriesTicker];\n}\n\nexport async function fetchSeriesByTicker(\n client: IPredictClient,\n seriesTicker: string,\n): Promise<SeriesResponse> {\n return await client.getSeriesByTicker(seriesTicker);\n}\n\nexport function useSeriesByTickerQuery(\n seriesTicker: string,\n options: Omit<\n UseQueryOptions<SeriesResponse, Error, SeriesResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesByTickerQueryKey(seriesTicker),\n queryFn: async () => fetchSeriesByTicker(client, seriesTicker),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tags by Categories Hook\n// -----------------------------------------------------------------------------\n\nexport function tagsByCategoriesQueryKey(): unknown[] {\n return [\"predict\", \"tags\", \"byCategories\"];\n}\n\nexport async function fetchTagsByCategories(\n client: IPredictClient,\n): Promise<TagsByCategoriesResponse> {\n return await client.getTagsByCategories();\n}\n\nexport function useTagsByCategoriesQuery(\n options: Omit<\n UseQueryOptions<\n TagsByCategoriesResponse,\n Error,\n TagsByCategoriesResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tagsByCategoriesQueryKey(),\n queryFn: async () => fetchTagsByCategories(client),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filters by Sports Hook\n// -----------------------------------------------------------------------------\n\nexport function filtersBySportsQueryKey(): unknown[] {\n return [\"predict\", \"filters\", \"bySports\"];\n}\n\nexport async function fetchFiltersBySports(\n client: IPredictClient,\n): Promise<FiltersBySportsResponse> {\n return await client.getFiltersBySports();\n}\n\nexport function useFiltersBySportsQuery(\n options: Omit<\n UseQueryOptions<\n FiltersBySportsResponse,\n Error,\n FiltersBySportsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: filtersBySportsQueryKey(),\n queryFn: async () => fetchFiltersBySports(client),\n ...options,\n });\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use useTagsByCategoriesQuery instead */\nexport const useCategoriesQuery = useTagsByCategoriesQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SearchQueryParams,\n SearchResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function searchQueryKey(params: SearchQueryParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\nexport async function fetchSearch(\n client: IPredictClient,\n params: SearchQueryParams,\n): Promise<SearchResponse> {\n return await client.search(params);\n}\n\nexport function useSearchQuery(\n params: SearchQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SearchResponse, Error, SearchResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: searchQueryKey(params),\n queryFn: async () => fetchSearch(client, params),\n ...queryOptions,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OutcomeMintsQueryParams,\n OutcomeMintsResponse,\n FilterOutcomeMintsRequest,\n FilterOutcomeMintsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Outcome Mints Query\n// -----------------------------------------------------------------------------\n\nexport function outcomeMintsQueryKey(\n params?: OutcomeMintsQueryParams,\n): unknown[] {\n return [\"predict\", \"outcomeMints\", params ?? {}];\n}\n\nexport async function fetchOutcomeMints(\n client: IPredictClient,\n params?: OutcomeMintsQueryParams,\n): Promise<OutcomeMintsResponse> {\n return await client.getOutcomeMints(params);\n}\n\nexport function useOutcomeMintsQuery(\n params?: OutcomeMintsQueryParams,\n options: Omit<\n UseQueryOptions<\n OutcomeMintsResponse,\n Error,\n OutcomeMintsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: outcomeMintsQueryKey(params),\n queryFn: async () => fetchOutcomeMints(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filter Outcome Mints Mutation\n// -----------------------------------------------------------------------------\n\nexport async function filterOutcomeMints(\n client: IPredictClient,\n request: FilterOutcomeMintsRequest,\n): Promise<FilterOutcomeMintsResponse> {\n return await client.filterOutcomeMints(request);\n}\n\nexport function useFilterOutcomeMintsMutation(\n options: Omit<\n UseMutationOptions<\n FilterOutcomeMintsResponse,\n Error,\n FilterOutcomeMintsRequest\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: FilterOutcomeMintsRequest) =>\n filterOutcomeMints(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, QuoteQueryParams, QuoteResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Quote Query\n// -----------------------------------------------------------------------------\n\nexport function quoteQueryKey(params: QuoteQueryParams): unknown[] {\n return [\"predict\", \"quote\", params];\n}\n\nexport async function fetchQuote(\n client: IPredictClient,\n params: QuoteQueryParams,\n): Promise<QuoteResponse> {\n return await client.getQuote(params);\n}\n\nexport function useQuoteQuery(\n params: QuoteQueryParams,\n options: Omit<\n UseQueryOptions<QuoteResponse, Error, QuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: quoteQueryKey(params),\n queryFn: async () => fetchQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Quotes are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds (formerly cacheTime)\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SwapRequestBody,\n SwapResponse,\n SwapInstructionsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Create Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwap(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapResponse> {\n return await client.createSwap(request);\n}\n\nexport function useCreateSwapMutation(\n options: Omit<\n UseMutationOptions<SwapResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) => createSwap(client, request),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Create Swap Instructions Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwapInstructions(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapInstructionsResponse> {\n return await client.createSwapInstructions(request);\n}\n\nexport function useCreateSwapInstructionsMutation(\n options: Omit<\n UseMutationOptions<SwapInstructionsResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) =>\n createSwapInstructions(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OrderQueryParams,\n OrderResponse,\n OrderStatusQueryParams,\n OrderStatusResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Order Query (Get quote and optionally transaction)\n// -----------------------------------------------------------------------------\n\nexport function orderQueryKey(params: OrderQueryParams): unknown[] {\n return [\"predict\", \"order\", params];\n}\n\nexport async function fetchOrder(\n client: IPredictClient,\n params: OrderQueryParams,\n): Promise<OrderResponse> {\n return await client.getOrder(params);\n}\n\nexport function useOrderQuery(\n params: OrderQueryParams,\n options: Omit<\n UseQueryOptions<OrderResponse, Error, OrderResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params),\n queryFn: async () => fetchOrder(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Orders are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Order Status Query\n// -----------------------------------------------------------------------------\n\nexport function orderStatusQueryKey(params: OrderStatusQueryParams): unknown[] {\n return [\"predict\", \"order\", \"status\", params.signature];\n}\n\nexport async function fetchOrderStatus(\n client: IPredictClient,\n params: OrderStatusQueryParams,\n): Promise<OrderStatusResponse> {\n return await client.getOrderStatus(params);\n}\n\nexport function useOrderStatusQuery(\n params: OrderStatusQueryParams,\n options: Omit<\n UseQueryOptions<OrderStatusResponse, Error, OrderStatusResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderStatusQueryKey(params),\n queryFn: async () => fetchOrderStatus(client, params),\n enabled: Boolean(params.signature),\n // Poll for status updates\n refetchInterval: options.refetchInterval ?? 3000,\n ...options,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n IntentQuoteQueryParams,\n IntentQuoteResponse,\n IntentSwapRequestBody,\n IntentSwapResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Intent Quote Query (Declarative Swap)\n// -----------------------------------------------------------------------------\n\nexport function intentQuoteQueryKey(params: IntentQuoteQueryParams): unknown[] {\n return [\"predict\", \"intent\", \"quote\", params];\n}\n\nexport async function fetchIntentQuote(\n client: IPredictClient,\n params: IntentQuoteQueryParams,\n): Promise<IntentQuoteResponse> {\n return await client.getIntentQuote(params);\n}\n\nexport function useIntentQuoteQuery(\n params: IntentQuoteQueryParams,\n options: Omit<\n UseQueryOptions<IntentQuoteResponse, Error, IntentQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: intentQuoteQueryKey(params),\n queryFn: async () => fetchIntentQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Intent quotes are time-sensitive\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Submit Intent Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function submitIntentSwap(\n client: IPredictClient,\n request: IntentSwapRequestBody,\n): Promise<IntentSwapResponse> {\n return await client.submitIntentSwap(request);\n}\n\nexport function useSubmitIntentSwapMutation(\n options: Omit<\n UseMutationOptions<IntentSwapResponse, Error, IntentSwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: IntentSwapRequestBody) =>\n submitIntentSwap(client, request),\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n PredictionMarketInitQueryParams,\n PredictionMarketInitResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Initialize Prediction Market Mutation\n// -----------------------------------------------------------------------------\n\nexport async function initPredictionMarket(\n client: IPredictClient,\n params: PredictionMarketInitQueryParams,\n): Promise<PredictionMarketInitResponse> {\n return await client.initPredictionMarket(params);\n}\n\nexport function useInitPredictionMarketMutation(\n options: Omit<\n UseMutationOptions<\n PredictionMarketInitResponse,\n Error,\n PredictionMarketInitQueryParams\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (params: PredictionMarketInitQueryParams) =>\n initPredictionMarket(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tokens Query\n// -----------------------------------------------------------------------------\n\nexport function tokensQueryKey(): unknown[] {\n return [\"predict\", \"tokens\"];\n}\n\nexport async function fetchTokens(\n client: IPredictClient,\n): Promise<TokenListResponse> {\n return await client.getTokens();\n}\n\nexport function useTokensQuery(\n options: Omit<\n UseQueryOptions<TokenListResponse, Error, TokenListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensQueryKey(),\n queryFn: async () => fetchTokens(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Tokens With Decimals Query\n// -----------------------------------------------------------------------------\n\nexport function tokensWithDecimalsQueryKey(): unknown[] {\n return [\"predict\", \"tokens\", \"decimals\"];\n}\n\nexport async function fetchTokensWithDecimals(\n client: IPredictClient,\n): Promise<TokenListWithDecimalsResponse> {\n return await client.getTokensWithDecimals();\n}\n\nexport function useTokensWithDecimalsQuery(\n options: Omit<\n UseQueryOptions<\n TokenListWithDecimalsResponse,\n Error,\n TokenListWithDecimalsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensWithDecimalsQueryKey(),\n queryFn: async () => fetchTokensWithDecimals(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, VenueListResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Venues Query\n// -----------------------------------------------------------------------------\n\nexport function venuesQueryKey(): unknown[] {\n return [\"predict\", \"venues\"];\n}\n\nexport async function fetchVenues(\n client: IPredictClient,\n): Promise<VenueListResponse> {\n return await client.getVenues();\n}\n\nexport function useVenuesQuery(\n options: Omit<\n UseQueryOptions<VenueListResponse, Error, VenueListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: venuesQueryKey(),\n queryFn: async () => fetchVenues(client),\n // Venue list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { DflowPredictWsClient, createDflowPredictWsClient } from \"../client/ws\";\nimport type { WsClientConfig } from \"../client/ws\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsConnectionParams {\n /** WebSocket endpoint URL */\n wsEndpoint: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Enable connection (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseWsConnectionResult {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Current connection status */\n status: WsConnectionStatus;\n /** Whether currently connected */\n isConnected: boolean;\n /** Connect to WebSocket */\n connect: () => void;\n /** Disconnect from WebSocket */\n disconnect: () => void;\n /** Last error */\n error: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for managing WebSocket connection lifecycle\n */\nexport function useWsConnection({\n wsEndpoint,\n autoConnect = true,\n autoReconnect = true,\n enabled = true,\n}: UseWsConnectionParams): UseWsConnectionResult {\n const [status, setStatus] = useState<WsConnectionStatus>(\"disconnected\");\n const [error, setError] = useState<Error | null>(null);\n const clientRef = useRef<DflowPredictWsClient | null>(null);\n\n // Initialize client\n useEffect(() => {\n if (!enabled) {\n if (clientRef.current) {\n clientRef.current.disconnect();\n clientRef.current = null;\n }\n setStatus(\"disconnected\");\n return;\n }\n\n const config: WsClientConfig = {\n wsUrl: wsEndpoint,\n autoConnect,\n autoReconnect,\n };\n\n const client = createDflowPredictWsClient(config);\n clientRef.current = client;\n\n // Listen for status changes\n const unsubStatus = client.on(\"status\", (newStatus) => {\n setStatus(newStatus);\n });\n\n // Listen for errors\n const unsubError = client.on(\"error\", (err) => {\n setError(err);\n });\n\n // Listen for successful connection to clear error\n const unsubConnect = client.on(\"connect\", () => {\n setError(null);\n });\n\n // Cleanup on unmount\n return () => {\n unsubStatus();\n unsubError();\n unsubConnect();\n client.disconnect();\n clientRef.current = null;\n };\n }, [wsEndpoint, autoConnect, autoReconnect, enabled]);\n\n const connect = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n const disconnect = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n return {\n client: clientRef.current,\n status,\n isConnected: status === \"connected\",\n connect,\n disconnect,\n error,\n };\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { PredictContext } from \"../contexts/PredictContext\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsClientResult {\n /** WebSocket client instance (null if not configured) */\n wsClient: IPredictWsClient | null;\n /** Current connection status */\n wsStatus: WsConnectionStatus;\n /** Whether currently connected */\n isWsConnected: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook to access the WebSocket client from PredictContext.\n * Connection status is derived directly from the wsClient instance.\n */\nexport function useWsClient(): UseWsClientResult {\n const context = useContext(PredictContext);\n\n if (!context) {\n throw new Error(\"useWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n\n // Sync initial status\n setWsStatus(wsClient.getStatus());\n\n // Listen for status changes\n const unsubscribe = wsClient.onStatusChange(setWsStatus);\n return unsubscribe;\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useEffect, useState, useRef } from \"react\";\nimport type { IPredictWsClient, WsPriceUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when price update received */\n onUpdate?: (update: WsPriceUpdate) => void;\n}\n\nexport interface PriceData {\n yesBid: string | null;\n yesAsk: string | null;\n noBid: string | null;\n noAsk: string | null;\n updatedAt: number;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Map of market ticker to latest price data */\n prices: Map<string, PriceData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time price updates\n */\nexport function usePricesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, PriceData>>(new Map());\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribePrices(options, (update) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBid: update.yes_bid,\n yesAsk: update.yes_ask,\n noBid: update.no_bid,\n noAsk: update.no_ask,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n return {\n prices,\n isSubscribed,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type { IPredictWsClient, WsTradeUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Maximum number of trades to keep in history (default: 100) */\n maxHistory?: number;\n /** Callback when trade update received */\n onUpdate?: (update: WsTradeUpdate) => void;\n}\n\nexport interface TradeData {\n tradeId: string;\n marketTicker: string;\n price: number;\n count: number;\n yesPrice: number;\n noPrice: number;\n takerSide: \"yes\" | \"no\";\n createdTime: number;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Recent trades (newest first) */\n trades: TradeData[];\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Clear trade history */\n clearHistory: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time trade updates\n */\nexport function useTradesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n maxHistory = 100,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<TradeData[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeTrades(options, (update) => {\n const trade: TradeData = {\n tradeId: update.trade_id,\n marketTicker: update.market_ticker,\n price: update.price,\n count: update.count,\n yesPrice: update.yes_price,\n noPrice: update.no_price,\n takerSide: update.taker_side,\n createdTime: update.created_time,\n };\n\n setTrades((prev) => {\n const next = [trade, ...prev];\n if (next.length > maxHistory) {\n return next.slice(0, maxHistory);\n }\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled, maxHistory]);\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n return {\n trades,\n isSubscribed,\n clearHistory,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type {\n IPredictWsClient,\n WsOrderbookUpdate,\n OrderbookLevel,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when orderbook update received */\n onUpdate?: (update: WsOrderbookUpdate) => void;\n}\n\nexport interface OrderbookData {\n yesBids: OrderbookLevel[];\n yesAsks: OrderbookLevel[];\n noBids: OrderbookLevel[];\n noAsks: OrderbookLevel[];\n updatedAt: number;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Map of market ticker to latest orderbook data */\n orderbooks: Map<string, OrderbookData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Get orderbook for a specific ticker */\n getOrderbook: (ticker: string) => OrderbookData | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time orderbook updates\n */\nexport function useOrderbookSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbooks, setOrderbooks] = useState<Map<string, OrderbookData>>(\n new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeOrderbook(options, (update) => {\n setOrderbooks((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBids: update.yes_bids,\n yesAsks: update.yes_asks,\n noBids: update.no_bids,\n noAsks: update.no_asks,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n const getOrderbook = useCallback(\n (ticker: string) => orderbooks.get(ticker),\n [orderbooks],\n );\n\n return {\n orderbooks,\n isSubscribed,\n getOrderbook,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTagsByCategoriesQuery } from \"../../hooks\";\n\n// -----------------------------------------------------------------------------\n// Preferred display order\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Culture\",\n \"Crypto\",\n \"Climate\",\n \"Economics\",\n \"Mentions\",\n \"Companies\",\n \"Financials\",\n \"Tech & Science\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** A single category with its tags */\nexport interface EventCategory {\n /** Category name (e.g. \"Politics\", \"Economics\") */\n category: string;\n /** Tags associated with this category */\n tags: string[];\n}\n\n/** Return type for the useEventsCategories hook */\nexport interface UseEventsCategoriesResult {\n /** Structured category list */\n data: EventCategory[];\n /** Whether data is still loading */\n isLoading: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Fetches event categories and their tags.\n *\n * Uses `getTagsByCategories()` to build a sorted list of categories, each\n * containing the tags that belong to it.\n *\n * @example\n * ```tsx\n * const { data: categories, isLoading } = useEventsCategories();\n *\n * // categories = [\n * // { category: \"Politics\", tags: [\"US Elections\", ...] },\n * // { category: \"Sports\", tags: [\"NFL\", \"NBA\", ...] },\n * // ...\n * // ]\n * ```\n */\nexport function useEventsCategories(): UseEventsCategoriesResult {\n const {\n data: tagsData,\n isLoading,\n isError,\n error,\n } = useTagsByCategoriesQuery();\n\n const data = useMemo<EventCategory[]>(() => {\n if (!tagsData?.tagsByCategories) return [];\n\n const orderIndex = (cat: string) => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(tagsData.tagsByCategories)\n .map(([category, tags]) => ({ category, tags }))\n .sort((a, b) => orderIndex(a.category) - orderIndex(b.category));\n }, [tagsData]);\n\n return { data, isLoading, isError, error: error ?? null };\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, HorizontalScrollContainer, Skeleton } from \"@liberfi.io/ui\";\nimport type { EventCategory } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: EventCategory[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: string[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n return (\n <div className={cn(\"flex w-full flex-col gap-2\", className)}>\n {/* Primary: category chips */}\n <HorizontalScrollContainer>\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {/* \"Trending\" chip */}\n <Chip\n label={t(\"predict.categories.trending\")}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n />\n\n {/* Category chips */}\n {categories.map((cat) => (\n <Chip\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n />\n ))}\n </div>\n </HorizontalScrollContainer>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <HorizontalScrollContainer>\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {/* \"All\" tag chip — resets tag filter to full category */}\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n variant=\"secondary\"\n />\n\n {activeTags.map((tag) => (\n <Chip\n key={tag}\n label={tag}\n isSelected={selectedTag === tag}\n onPress={() => onTagSelect(tag)}\n variant=\"secondary\"\n />\n ))}\n </div>\n </HorizontalScrollContainer>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — reusable chip button\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n variant?: \"primary\" | \"secondary\";\n}\n\nfunction Chip({ label, isSelected, onPress, variant = \"primary\" }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"shrink-0 rounded-full px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer\",\n \"border whitespace-nowrap\",\n variant === \"primary\"\n ? isSelected\n ? \"bg-foreground text-background border-foreground\"\n : \"bg-content1 text-foreground/70 border-default-200 hover:bg-default-100 hover:text-foreground\"\n : isSelected\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content1 text-foreground/50 border-default-100 hover:bg-default-50 hover:text-foreground/70\",\n )}\n >\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-8 shrink-0 rounded-full\"\n style={{ width: `${60 + Math.random() * 40}px` }}\n />\n ))}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useEventsCategories } from \"./categories.script\";\nimport { CategoriesUI, CategoriesSkeleton } from \"./categories.ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Selection state emitted by the categories widget */\nexport interface CategorySelection {\n /** Selected category name, null when \"Trending\" is selected */\n category: string | null;\n /** Tags to filter by, null when no filter is applied */\n tags: string[] | null;\n}\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback when category / tag selection changes.\n * - `category = null, tags = null` → \"Trending\" is selected (no filter)\n * - `category = \"Politics\", tags = [...]` → category selected with its tags\n */\n onSelect?: (selection: CategorySelection) => void;\n /** Optional class name */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n className,\n}: CategoriesWidgetProps) {\n const { data: categories, isLoading } = useEventsCategories();\n\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (category: string | null) => {\n setSelectedCategory(category);\n setSelectedTag(null); // reset tag when category changes\n\n if (!category) {\n // \"Trending\" selected\n onSelect?.({ category: null, tags: null });\n } else {\n // find the category and emit all its tags\n const cat = categories.find((c) => c.category === category);\n onSelect?.({ category, tags: cat?.tags ?? null });\n }\n },\n [categories, onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tag: string | null) => {\n setSelectedTag(tag);\n\n if (!tag) {\n // deselected tag → fall back to full category\n const cat = categories.find((c) => c.category === selectedCategory);\n onSelect?.({ category: selectedCategory, tags: cat?.tags ?? null });\n } else {\n onSelect?.({ category: selectedCategory, tags: [tag] });\n }\n },\n [categories, selectedCategory, onSelect],\n );\n\n // --- render ---\n\n if (isLoading) {\n return <CategoriesSkeleton />;\n }\n\n // Get the tags for the currently selected category\n const activeTags =\n categories.find((c) => c.category === selectedCategory)?.tags ?? [];\n\n return (\n <CategoriesUI\n categories={categories}\n selectedCategory={selectedCategory}\n selectedTag={selectedTag}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n className={className}\n />\n );\n}\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","import { useMemo } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfiniteQuery, useSeriesQuery } from \"../../hooks\";\nimport type { StandardEvent, EventQueryParams } from \"../../types\";\n\n/**\n * useEvents parameters — extends EventQueryParams (without cursor) with\n * optional category / tags filtering.\n */\nexport interface UseEventsParams extends Omit<EventQueryParams, \"cursor\"> {\n /** Filter events by category (scopes the series lookup when tags is set) */\n category?: string | null;\n /**\n * Filter events by tags.\n * Internally converts tags → matching series tickers, then filters events.\n * Takes precedence over `seriesTickers` when provided.\n */\n tags?: string[] | null;\n}\n\n/**\n * useEvents return value\n */\nexport interface UseEventsResult {\n /** All accumulated events data */\n data: StandardEvent[];\n /** Whether *initial* data is still loading (no cache yet) */\n isLoading: boolean;\n /** Whether any fetch is in-flight (includes refetch / param change, excludes fetchNextPage) */\n isFetching: boolean;\n /** Whether more data is being fetched (infinite scroll) */\n isFetchingMore: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n /** Whether there is more data to load */\n hasMore: boolean;\n /** Fetch more results */\n fetchMore: () => void;\n /** Refetch all pages */\n refetch: () => void;\n}\n\n/**\n * Events list hook with infinite scroll support (cursor-based pagination)\n *\n * Supports filtering by `tags` – internally converts tags into matching series\n * tickers via a series query, then filters events by `seriesTickers`.\n *\n * @example\n * ```tsx\n * const {\n * data,\n * isLoading,\n * hasMore,\n * isFetchingMore,\n * fetchMore,\n * } = useEvents({\n * limit: 20,\n * status: 'active',\n * withNestedMarkets: true,\n * category: 'Politics',\n * tags: ['US Elections'],\n * });\n * ```\n */\nexport function useEvents(params: UseEventsParams = {}): UseEventsResult {\n // --- category / tags → seriesTickers conversion ---\n\n const { category, tags, ...restParams } = params;\n const needsSeriesLookup = !!category || (!!tags && tags.length > 0);\n\n const {\n data: seriesData,\n isFetching: isSeriesFetching,\n isError: isSeriesError,\n error: seriesError,\n } = useSeriesQuery(\n {\n ...(category ? { category } : {}),\n ...(tags && tags.length > 0 ? { tags: tags.join(\",\") } : {}),\n isInitialized: true,\n status: \"active\",\n },\n { enabled: needsSeriesLookup },\n );\n\n const derivedSeriesTickers = useMemo(() => {\n if (!needsSeriesLookup || !seriesData?.series) return undefined;\n\n // dflow API limits seriesTickers to 25\n const tickers = seriesData.series.map((s) => s.ticker).slice(0, 25);\n return tickers.length > 0 ? tickers.join(\",\") : undefined;\n }, [needsSeriesLookup, seriesData]);\n\n // --- build final query params ---\n\n const mergedParams = useMemo<Omit<EventQueryParams, \"cursor\">>(\n () => ({\n status: \"active\",\n withNestedMarkets: true,\n sort: \"volume24h\",\n order: \"desc\",\n limit: DEFAULT_PAGE_SIZE,\n ...restParams,\n ...(derivedSeriesTickers !== undefined\n ? { seriesTickers: derivedSeriesTickers }\n : {}),\n }),\n [restParams, derivedSeriesTickers],\n );\n\n const {\n data: infiniteData,\n isLoading: isEventsLoading,\n isFetching: isEventsFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage: fetchMore,\n refetch,\n } = useEventsInfiniteQuery(mergedParams);\n\n // Flatten all pages into a single events array\n const data = useMemo(\n () => infiniteData?.pages.flatMap((page) => page.events) ?? [],\n [infiniteData],\n );\n\n // If series query errors out, stop resolving to avoid stuck state\n const isSeriesResolving = needsSeriesLookup && !seriesData && !isSeriesError;\n\n // isLoading — true only on *initial* load (no cached data at all)\n // isFetching — true whenever any request is in-flight (param change / refetch), excludes fetchNextPage\n // includes isSeriesFetching so that switching tag shows skeleton even when stale series cache exists\n const isLoading = isSeriesResolving || isEventsLoading;\n const isFetching =\n isSeriesFetching ||\n isSeriesResolving ||\n (isEventsFetching && !isFetchingMore);\n\n return {\n data,\n isLoading,\n isFetching,\n isFetchingMore,\n isError: isSeriesError || isError,\n error: seriesError ?? error,\n hasMore,\n fetchMore,\n refetch,\n };\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport type EventItemSkeletonProps = {\n className?: string;\n};\n\nexport function EventItemSkeleton({ className }: EventItemSkeletonProps) {\n return (\n <div\n className={`flex h-full w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 @5xl:gap-y-3 @5xl:p-4 ${className ?? \"\"}`}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: avatar, title, gauge/status */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-8 w-8 flex-shrink-0 rounded-lg @5xl:h-12 @5xl:w-12\" />\n <Skeleton className=\"h-10 flex-1 rounded-md @5xl:h-12\" />\n <Skeleton className=\"h-8 w-12 flex-shrink-0 rounded-lg @5xl:h-10 @5xl:w-14\" />\n </div>\n\n {/* Market rows placeholder */}\n <div className=\"flex w-full flex-col gap-y-0.5 @5xl:gap-y-1\">\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-2/3 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer: show more + volume */}\n <div className=\"flex items-center justify-between gap-x-2\">\n <Skeleton className=\"h-3 w-16 rounded-md @5xl:h-4\" />\n <Skeleton className=\"h-3 w-20 rounded-md @5xl:h-4\" />\n </div>\n </div>\n );\n}\n\nexport type EventsSkeletonProps = {\n count?: number;\n};\n\nexport function EventsSkeleton({ count = 8 }: EventsSkeletonProps) {\n return (\n <div className=\"@container w-full h-full\">\n <div className=\"grid grid-cols-1 gap-4 @[640px]:grid-cols-2 @[1024px]:grid-cols-3 @[1280px]:grid-cols-4\">\n {Array.from({ length: count }).map((_, index) => (\n <EventItemSkeleton key={index} className=\"min-h-44 @5xl:min-h-56\" />\n ))}\n </div>\n </div>\n );\n}\n","export type GaugeChartUIProps = {\n /** Value between 0 and 100 (cents) */\n value: number;\n /** Whether to show percentage label */\n showLabel?: boolean;\n};\n\nexport function GaugeChartUI({ value, showLabel = true }: GaugeChartUIProps) {\n const normalized = value / 100;\n\n return (\n <div className=\"flex-shrink-0 flex flex-col items-center\">\n <div className=\"relative w-16 h-12 lg:w-20 lg:h-14\">\n <svg className=\"w-full h-full\" viewBox=\"0 0 100 70\">\n {/* Background arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-default-200\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n {/* Progress arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-primary\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n strokeDasharray={`${normalized * 125.6} 125.6`}\n style={{\n transition: \"stroke-dasharray 0.5s ease-in-out\",\n }}\n />\n </svg>\n {/* Percentage in center */}\n {showLabel && (\n <div className=\"absolute inset-0 flex items-center justify-center pt-3 lg:pt-4\">\n <span className=\"text-sm font-bold text-foreground lg:text-base leading-none\">\n {value.toFixed(0)}%\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronUpIcon,\n StyledTooltip,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { GaugeChartUI } from \"./gauge-chart.ui\";\n\nexport type EventItemUIProps = {\n event: StandardEvent;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventItemUI({\n event,\n onSelect,\n onSelectOutcome,\n}: EventItemUIProps) {\n const { t } = useTranslation();\n const [manualSelectedMarket, setManualSelectedMarket] =\n useState<StandardMarket | null>(null);\n\n const rawMarkets = event.markets || [];\n const markets =\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n )\n : rawMarkets;\n const openMarkets = markets.filter((market) => market.status === \"active\");\n\n const isSingleMarket = markets.length === 1;\n const selectedMarket = isSingleMarket ? markets[0] : manualSelectedMarket;\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n // Get the yes price in cents (0-100) from the market\n // yesAsk / yesBid are in dollars (0~1), multiply by 100 to get cents\n const getYesCents = (market: StandardMarket): number | null => {\n if (market.yesAsk) return parseFloat(market.yesAsk) * 100;\n return null;\n };\n\n const getNoCents = (market: StandardMarket): number | null => {\n if (market.noAsk) return parseFloat(market.noAsk) * 100;\n return null;\n };\n\n const getYesPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (yesCents != null) {\n if (noCents == null && yesCents <= 1) return \"< 1%\";\n return formatPercent(yesCents);\n }\n if (noCents != null) {\n if (noCents <= 1) return \"> 99%\";\n return formatPercent(100 - noCents);\n }\n return \"0%\";\n };\n\n const getNoPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (noCents != null) {\n if (yesCents == null && noCents <= 1) return \"< 1%\";\n return formatPercent(noCents);\n }\n if (yesCents != null) {\n if (yesCents <= 1) return \"> 99%\";\n return formatPercent(100 - yesCents);\n }\n return \"0%\";\n };\n\n // Format cents price as percentage string\n const formatPercent = (cents: number | null): string =>\n cents != null ? `${cents.toFixed(0)}%` : \"--\";\n\n // Determine event status based on market statuses\n const eventStatus = useMemo(() => {\n const hasActiveMarket = markets.some((m) => m.status === \"active\");\n const allClosed = markets.every(\n (m) => m.status === \"closed\" || m.status === \"determined\",\n );\n\n if (allClosed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (hasActiveMarket)\n return {\n label: t(\"predict.event.status.live\"),\n color: \"bg-primary-100/50 text-primary\",\n };\n return {\n label: t(\"predict.event.status.pending\"),\n color: \"bg-warning-100/50 text-warning\",\n };\n }, [markets, t]);\n\n const handleMarketClick = (market: StandardMarket) => {\n setManualSelectedMarket(market);\n };\n\n const handleBack = () => {\n setManualSelectedMarket(null);\n };\n\n const handleYesClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"yes\");\n }\n };\n\n const handleNoClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"no\");\n }\n };\n\n const handleSelect = () => {\n if (onSelect) {\n onSelect(event);\n }\n };\n\n const displayedMarkets = openMarkets.slice(0, 2);\n const hasMoreMarkets = openMarkets.length > 2;\n\n return (\n <div\n className=\"flex h-full w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 transition-all duration-300 cursor-pointer hover:border-primary hover:ring-2 hover:ring-primary/20 focus-within:border-primary focus-within:bg-content2 focus-within:ring-2 focus-within:ring-primary/20 @5xl:gap-y-3 @5xl:p-4\"\n onClick={handleSelect}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: image, title, status */}\n <div className=\"flex items-center gap-4\">\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"md\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 @5xl:h-12 @5xl:w-12\"\n />\n <StyledTooltip content={event.title} placement=\"bottom\">\n <p className=\"flex-1 min-w-0 h-10 @5xl:h-12 text-sm font-semibold @5xl:text-base line-clamp-2\">\n {event.title}\n </p>\n </StyledTooltip>\n\n {isSingleMarket ? (\n <GaugeChartUI value={getYesCents(markets[0]) ?? 50} />\n ) : (\n eventStatus.label !== t(\"predict.event.status.live\") && (\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm @5xl:px-4 @5xl:py-2 ${eventStatus.color}`}\n >\n <span>{eventStatus.label}</span>\n </div>\n )\n )}\n </div>\n\n {/* Selected state: show selected market (only for multiple markets) */}\n {selectedMarket && !isSingleMarket && (\n <button\n type=\"button\"\n className=\"flex min-h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <span className=\"text-left text-xs text-foreground @5xl:text-sm line-clamp-1\">\n {selectedMarket.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-foreground @5xl:text-lg\">\n {getYesPercent(selectedMarket)}\n </span>\n <ChevronUpIcon className=\"w-3 h-3 text-default-500 @5xl:w-4 @5xl:h-4\" />\n </div>\n </button>\n )}\n\n {/* Unselected state: show max 2 markets (only for multiple markets) */}\n {!selectedMarket && !isSingleMarket && displayedMarkets.length > 0 && (\n <div className=\"flex w-full flex-col gap-y-0.5 text-xs @5xl:gap-y-1 @5xl:text-sm\">\n {displayedMarkets.map((market) => (\n <button\n type=\"button\"\n key={market.ticker}\n className=\"flex min-h-8 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleMarketClick(market);\n }}\n >\n <span className=\"text-left text-xs text-foreground @5xl:text-sm line-clamp-1\">\n {market.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-xs text-foreground @5xl:text-base\">\n {getYesPercent(market)}\n </span>\n <div className=\"flex h-full items-center gap-x-3 rounded-lg p-1 @5xl:p-1.5 bg-gradient-to-r from-primary-50/20 via-primary-50/20 to-secondary-50/20\">\n <span className=\"text-primary\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"text-default-400\">/</span>\n <span className=\"text-secondary\">\n {t(\"predict.market.no\")}\n </span>\n </div>\n </div>\n </button>\n ))}\n {hasMoreMarkets && (\n <span className=\"text-xxs text-default-500 @5xl:text-xs\">\n {t(\"predict.event.moreMarkets\", {\n count: openMarkets.length - 2,\n })}\n </span>\n )}\n </div>\n )}\n\n {/* Selected state: show Yes/No buttons */}\n {selectedMarket && (\n <div\n className={`flex items-center gap-x-2 text-sm @5xl:text-base ${isSingleMarket ? \"mt-3\" : \"\"}`}\n >\n <Button\n color=\"primary\"\n fullWidth\n className=\"group/yes bg-primary-100 text-primary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleYesClick}\n >\n <span className=\"group-hover/yes:hidden\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"hidden group-hover/yes:inline\">\n {getYesPercent(selectedMarket)}\n </span>\n </Button>\n <Button\n color=\"secondary\"\n fullWidth\n className=\"group/no bg-secondary-100 text-secondary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleNoClick}\n >\n <span className=\"group-hover/no:hidden\">\n {t(\"predict.market.no\")}\n </span>\n <span className=\"hidden group-hover/no:inline\">\n {getNoPercent(selectedMarket)}\n </span>\n </Button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n {!selectedMarket || isSingleMarket ? (\n <div className=\"flex items-center justify-between gap-x-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-xxs text-default-600 hover:text-foreground @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleSelect();\n }}\n >\n <span>{t(\"predict.event.showMore\")}</span>\n <ChevronRightIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n </button>\n <span className=\"text-xxs text-default-600 @5xl:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center cursor-pointer gap-x-1 text-xxs text-default-600 hover:text-foreground @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n <span>{t(\"predict.event.back\")}</span>\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useRef, type CSSProperties } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { EventItemUI } from \"./event-item.ui\";\n\n// Tailwind viewport breakpoints\nconst SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Gap between cards in px (matches Tailwind gap-4) */\nconst GAP = 16;\n\n/** Row heights per breakpoint (card height + bottom gap) */\nconst ROW_HEIGHT_XS = 192;\nconst ROW_HEIGHT_SM = 228;\nconst ROW_HEIGHT_LG = 244;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= SM) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n if (width >= MD) return ROW_HEIGHT_SM;\n return ROW_HEIGHT_XS;\n}\n\n// ---------------------------------------------------------------------------\n// EventsUI — virtual grid with infinite loading\n// ---------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n /** Events data to render */\n events: StandardEvent[];\n /** Whether there is more data to load */\n hasMore?: boolean;\n /** Callback to fetch more data */\n onFetchMore?: () => void;\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n}: EventsUIProps) {\n // --- container dimensions ---\n const containerRef = useRef<HTMLDivElement>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n // --- layout calculations ---\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const totalRowCount = hasMore ? dataRowCount + 1 : dataRowCount;\n\n // --- infinite loader ---\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={rowHeight}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n gap: GAP,\n onSelect,\n onSelectOutcome,\n }}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row component — renders a single row of N columns\n// ---------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: StandardEvent[];\n columnCount: number;\n dataRowCount: number;\n gap: number;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n gap,\n onSelect,\n onSelectOutcome,\n}: RowComponentProps<EventGridRowData>) {\n // Loading indicator for the sentinel row beyond loaded data\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n const innerStyle: CSSProperties = {\n display: \"flex\",\n gap,\n height: `calc(100% - ${gap}px)`,\n };\n\n return (\n <div style={style}>\n <div style={innerStyle}>\n {rowEvents.map((event) => (\n <div key={event.ticker} style={{ flex: 1, minWidth: 0 }}>\n <EventItemUI\n event={event}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n ))}\n {/* Spacers to keep equal-width columns on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { useEvents, type UseEventsParams } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport interface EventsWidgetProps extends UseEventsParams {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\nexport function EventsWidget({\n onSelect,\n onSelectOutcome,\n ...queryParams\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEvents({ limit: DEFAULT_PAGE_SIZE, ...queryParams });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n CategoriesWidget,\n type CategorySelection,\n} from \"../categories/categories.widget\";\nimport { EventsWidget } from \"./events.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({ onSelect, onSelectOutcome }: EventsPageProps) {\n const [selection, setSelection] = useState<CategorySelection>({\n category: null,\n tags: null,\n });\n\n const handleSelect = useCallback((s: CategorySelection) => {\n setSelection(s);\n }, []);\n\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n {/* Category + tag filter bar */}\n <CategoriesWidget onSelect={handleSelect} />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n category={selection.category}\n tags={selection.tags}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport { useOrderQuery } from \"../../hooks/useOrderQuery\";\nimport type {\n StandardMarket,\n OrderResponse,\n MarketAccountInfo,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Trade outcome - yes or no */\nexport type TradeOutcome = \"yes\" | \"no\";\n\n/** Trade side - buy or sell */\nexport type TradeSide = \"buy\" | \"sell\";\n\nexport interface UseTradeFormParams {\n /** Market to trade in */\n market: StandardMarket;\n /** Chain network to use (default: 'solana') */\n chain?: string;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Initial trade side */\n initialSide?: TradeSide;\n}\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\nexport interface UseTradeFormResult {\n // -- State ------------------------------------------------------------------\n /** Current outcome (yes/no) */\n outcome: TradeOutcome;\n /** Current side (buy/sell) */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n\n // -- Derived ----------------------------------------------------------------\n /** Number of shares (buy: amount / price, sell: quantity) */\n shares: number;\n /** Estimated cost in dollars */\n estimatedCost: number;\n /** Potential payout in dollars */\n potentialPayout: number;\n /** Potential profit in dollars */\n potentialProfit: number;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Best bid price from order book (cents) */\n bestBid: number | null;\n /** Best ask price from order book (cents) */\n bestAsk: number | null;\n /** Current order response from the API (includes quote + transaction) */\n order: OrderResponse | null;\n /** Price impact percentage */\n priceImpact: number | null;\n\n // -- Balances ---------------------------------------------------------------\n /** USDC balance in dollars (for buy side) */\n usdcBalance: number | null;\n /** Outcome token balance in token units (for sell side) */\n outcomeTokenBalance: number | null;\n /** Yes token balance (shares held) */\n yesTokenBalance: number | null;\n /** No token balance (shares held) */\n noTokenBalance: number | null;\n /** Whether balance is being fetched */\n isBalanceLoading: boolean;\n\n // -- Status -----------------------------------------------------------------\n /** Whether order/quote is being fetched */\n isQuoteLoading: boolean;\n /** Whether a transaction is being signed/sent */\n isSubmitting: boolean;\n /** Order/quote fetch error (if any) */\n quoteError: Error | null;\n /** Transaction hash after successful send */\n txHash: string | null;\n /** Form validation result */\n validation: TradeFormValidation;\n\n // -- Actions ----------------------------------------------------------------\n /** Set outcome */\n setOutcome: (outcome: TradeOutcome) => void;\n /** Set side */\n setSide: (side: TradeSide) => void;\n /** Set quantity (minimum ORDER_MIN_QUANTITY) */\n setQuantity: (quantity: number) => void;\n /** Submit the swap */\n submit: () => void;\n /** Reset form to initial values */\n reset: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get mint address for the specified outcome from market accounts.\n * `accounts` is keyed by collateral token mint (e.g. USDC mint), not by chain.\n */\nfunction getMintAddress(\n accounts: Record<string, MarketAccountInfo>,\n collateralMint: string,\n outcome: TradeOutcome,\n): string | null {\n const accountInfo = accounts[collateralMint];\n if (!accountInfo) return null;\n return outcome === \"yes\" ? accountInfo.yesMint : accountInfo.noMint;\n}\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/** Fire a celebration confetti burst 🎉 */\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n\n // Center burst\n confetti({\n ...defaults,\n particleCount: 80,\n origin: { x: 0.5, y: 0.4 },\n });\n\n // Left side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.3, y: 0.6 },\n });\n }, 150);\n\n // Right side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.7, y: 0.6 },\n });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n\n // Auth & wallet from wallet-connector\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n\n // Form state\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n\n // Get the outcome mint address (accounts are keyed by collateral mint, e.g. USDC)\n const outcomeMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, outcome),\n [market.accounts, outcome],\n );\n\n // Determine input/output mints based on side\n const { inputMint, outputMint } = useMemo(() => {\n if (side === \"buy\") {\n // Buying outcome tokens: USDC -> Outcome Mint\n return { inputMint: USDC_MINT, outputMint: outcomeMint };\n }\n // Selling outcome tokens: Outcome Mint -> USDC\n return { inputMint: outcomeMint, outputMint: USDC_MINT };\n }, [side, outcomeMint]);\n\n // Quote query (enabled only when we have valid mints and quantity)\n const quoteEnabled =\n Boolean(inputMint) && Boolean(outputMint) && quantity > 0;\n\n // Current price per share (0–1, in dollars)\n const pricePerShare = useMemo(() => {\n if (outcome === \"yes\") {\n return Number(market.yesAsk ?? 0.5);\n }\n return Number(market.noAsk ?? 0.5);\n }, [outcome, market.yesAsk, market.noAsk]);\n\n // For buy: quantity = dollar amount → convert to shares\n // For sell: quantity = number of shares\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return pricePerShare > 0 ? quantity / pricePerShare : 0;\n }\n return quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit (6 decimals) for the inputMint\n // Buy: inputMint = USDC → amount = dollar amount × 10^6\n // Sell: inputMint = outcome token → amount = shares × 10^6\n const amount = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return Math.round(quantity * 1_000_000);\n }, [quantity]);\n\n // Order query – returns quote data + base64 transaction when userPublicKey is provided\n const {\n data: order,\n isLoading: isQuoteLoading,\n error: quoteError,\n refetch: refetchOrder,\n } = useOrderQuery(\n {\n userPublicKey: userPublicKey ?? undefined,\n inputMint: inputMint ?? \"\",\n outputMint: outputMint ?? \"\",\n amount,\n slippageBps: 100, // 1% slippage\n },\n {\n enabled: quoteEnabled,\n },\n );\n\n // Wallet balance query – poll every 10s when authenticated\n const {\n data: walletPortfolios,\n isLoading: isBalanceLoading,\n refetch: refetchBalance,\n } = useWalletPortfoliosQuery(\n {\n chain: Chain.SOLANA,\n address: userPublicKey ?? \"\",\n },\n {\n enabled: isAuthenticated && Boolean(userPublicKey),\n refetchInterval: 10_000,\n },\n );\n\n // USDC balance in dollars (amount string from portfolio)\n const usdcBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios) return null;\n const usdcPortfolio = walletPortfolios.portfolios.find(\n (p) => p.address === USDC_MINT,\n );\n return usdcPortfolio ? parseFloat(usdcPortfolio.amount) : 0;\n }, [walletPortfolios]);\n\n // Outcome token balance (shares the user holds for selected outcome)\n const outcomeTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !outcomeMint) return null;\n const outcomePortfolio = walletPortfolios.portfolios.find(\n (p) => p.address === outcomeMint,\n );\n return outcomePortfolio ? parseFloat(outcomePortfolio.amount) : 0;\n }, [walletPortfolios, outcomeMint]);\n\n // Yes / No token balances (for displaying under each button on sell side)\n const yesMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"yes\"),\n [market.accounts],\n );\n const noMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"no\"),\n [market.accounts],\n );\n\n const yesTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !yesMint) return null;\n const p = walletPortfolios.portfolios.find((t) => t.address === yesMint);\n return p ? parseFloat(p.amount) : 0;\n }, [walletPortfolios, yesMint]);\n\n const noTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !noMint) return null;\n const p = walletPortfolios.portfolios.find((t) => t.address === noMint);\n return p ? parseFloat(p.amount) : 0;\n }, [walletPortfolios, noMint]);\n\n // Order book query for best bid/ask\n const { data: orderBook } = useOrderBookQuery(market.ticker, {\n refetchInterval: 5000,\n });\n\n // Best bid/ask from order book\n const bestBid = useMemo(() => {\n const bids = outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n return bids?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n const bestAsk = useMemo(() => {\n const asks = outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n return asks?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n // Price impact from order\n const priceImpact = useMemo(() => {\n if (!order?.priceImpactPct) return null;\n return parseFloat(order.priceImpactPct);\n }, [order]);\n\n // Cost calculation (in dollars)\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (order) {\n // Order inAmount is in lamports (6 decimals), convert to dollars\n return parseInt(order.inAmount) / 1_000_000;\n }\n // Fallback estimate\n if (side === \"buy\") {\n // Buy: user inputs dollar amount, that IS the cost\n return quantity;\n }\n // Sell: shares × bid price\n const bidPrice =\n outcome === \"yes\"\n ? Number(market.yesBid ?? 0)\n : Number(market.noBid ?? 0);\n return quantity * bidPrice;\n }, [order, side, outcome, quantity, market.yesBid, market.noBid]);\n\n // Potential payout (in dollars) if prediction is correct\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n // Each share pays $1 if correct; shares = amount / pricePerShare\n return shares * 1; // shares × $1\n }\n // Selling: receive the premium upfront (estimatedCost is what you get)\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n // Profit = payout - cost (in dollars)\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter – clears quantity on switch\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n // Quantity setter – allows NaN (empty input)\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n // Buy side: keep up to 2 decimal places (dollar amount)\n // Sell side: integer only (contracts)\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Refetch order when quantity changes\n useEffect(() => {\n if (quoteEnabled) {\n refetchOrder();\n }\n }, [quantity, outcome, side, quoteEnabled, refetchOrder]);\n\n // Validation – form-level checks including balance, auth is handled by useAuthCallback\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n\n if (market.status !== \"active\") {\n errors.push(\"Market is not active\");\n }\n\n // Balance check: buy side requires enough USDC\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n\n // Balance check: sell side requires enough shares\n if (\n side === \"sell\" &&\n outcomeTokenBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > outcomeTokenBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n\n return { isValid: errors.length === 0, errors };\n }, [quantity, market.status, side, usdcBalance, outcomeTokenBalance]);\n\n // Transaction hash after successful send\n const [txHash, setTxHash] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Submit: get order (with transaction) → sign → send\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet ||\n isBalanceLoading\n ) {\n console.warn(\"[TradeForm] submit blocked by guard:\", {\n validationFailed: !validation.isValid,\n notAuthenticated: !isAuthenticated,\n noPublicKey: !userPublicKey,\n noWallet: !solanaWallet,\n balanceLoading: isBalanceLoading,\n });\n return;\n }\n\n setTxHash(null);\n setIsSubmitting(true);\n\n try {\n // Use cached order or fetch a fresh one\n let currentOrder = order;\n if (!currentOrder?.transaction) {\n console.warn(\"[TradeForm] no cached order with tx, refetching…\");\n const result = await refetchOrder();\n currentOrder = result.data;\n }\n\n if (!currentOrder?.transaction) {\n console.error(\n \"[TradeForm] unable to obtain order transaction, aborting\",\n );\n return;\n }\n\n // Decode the base64-encoded transaction\n const txBytes = Uint8Array.from(atob(currentOrder.transaction), (c) =>\n c.charCodeAt(0),\n );\n\n // Sign and send the transaction via wallet adapter\n const hash = await solanaWallet.sendTransaction(txBytes);\n console.warn(\"[TradeForm] transaction sent:\", hash);\n setTxHash(hash);\n\n // 🎉 Success feedback\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n\n // Reset quantity input\n setQuantityRaw(NaN);\n\n // Refresh wallet balance after successful transaction\n refetchBalance();\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n } finally {\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n order,\n isBalanceLoading,\n refetchOrder,\n refetchBalance,\n t,\n ]);\n\n // Reset\n const reset = useCallback(() => {\n setOutcome(initialOutcome);\n setSideRaw(initialSide);\n setQuantityRaw(NaN);\n setTxHash(null);\n }, [initialOutcome, initialSide]);\n\n return {\n outcome,\n side,\n quantity,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n isAuthenticated,\n bestBid,\n bestAsk,\n order: order ?? null,\n priceImpact,\n usdcBalance,\n outcomeTokenBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isQuoteLoading,\n isSubmitting,\n quoteError: quoteError ?? null,\n txHash,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n reset,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Tabs, Tab, StyledNumberInput } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n /** Event data */\n event?: StandardEvent;\n /** Market data */\n market: StandardMarket;\n /** Current outcome */\n outcome: TradeOutcome;\n /** Current side */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n /** Estimated cost in cents */\n estimatedCost: number;\n /** Potential payout in cents */\n potentialPayout: number;\n /** Potential profit in cents */\n potentialProfit: number;\n /** Whether swap is being submitted */\n isSubmitting: boolean;\n /** USDC balance in dollars (null if not loaded) */\n usdcBalance: number | null;\n /** Yes token balance (shares held, for sell side) */\n yesTokenBalance: number | null;\n /** No token balance (shares held, for sell side) */\n noTokenBalance: number | null;\n /** Whether balance is loading */\n isBalanceLoading: boolean;\n /** Whether the form is valid */\n isValid: boolean;\n /** Validation error messages */\n validationErrors: string[];\n /** Set outcome */\n onOutcomeChange: (outcome: TradeOutcome) => void;\n /** Set side */\n onSideChange: (side: TradeSide) => void;\n /** Set quantity */\n onQuantityChange: (quantity: number) => void;\n /** Submit swap */\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n outcome,\n side,\n quantity,\n potentialProfit,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n onOutcomeChange,\n onSideChange,\n onQuantityChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n\n // Button label\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n return `${sideLabel} ${outcomeLabel}`;\n }, [isSubmitting, side, outcome, t]);\n\n // Button color\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4\">\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"}\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {outcome === \"yes\" ? market.yesSubTitle : market.noSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Side tabs: Buy / Sell */}\n <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs>\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance = o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {Math.round(Number(price) * 100)}¢\n </span>\n ) : null;\n })()}\n </button>\n {/* Holdings display (sell side, selected outcome only) */}\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* USDC balance (buy side only) */}\n {side === \"buy\" && (\n <div className=\"flex items-center justify-end gap-x-1 text-xs text-default-500\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-4 w-4 rounded-full object-cover\"\n />\n <span>{t(\"predict.trade.balance\")}:</span>\n <span className=\"font-medium text-foreground\">\n {isBalanceLoading\n ? \"–\"\n : usdcBalance != null\n ? `$${usdcBalance.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n )}\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.amount\")\n : t(\"predict.trade.contracts\")}\n </span>\n <StyledNumberInput\n key={side}\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\n }\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Quick amount buttons */}\n <div className=\"flex gap-x-2 justify-end\">\n {side === \"buy\" ? (\n <>\n {[1, 5, 10, 100].map((amt) => (\n <button\n key={amt}\n type=\"button\"\n onClick={() =>\n onQuantityChange(\n Math.round(\n ((isNaN(quantity) ? 0 : quantity) + amt) * 100,\n ) / 100,\n )\n }\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n +{amt}$\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max balance */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n ) : (\n <>\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n /* TODO: set to pct% of holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Payout / Receive display */}\n {!isNaN(quantity) && quantity > 0 && (\n <div className=\"flex flex-col items-end gap-y-0.5\">\n <span className=\"text-sm text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.potentialWin\")\n : t(\"predict.trade.estimatedReceive\")}\n </span>\n <span className=\"text-xl font-semibold text-bullish\">\n ${(side === \"buy\" ? potentialProfit : estimatedCost).toFixed(2)}\n </span>\n </div>\n )}\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!isValid || isSubmitting}\n isLoading={isSubmitting}\n onPress={onSubmit}\n >\n {submitLabel}\n </Button>\n </div>\n );\n}\n","import { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n useTradeForm,\n type TradeSide,\n type TradeOutcome,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n /** Event data */\n event?: StandardEvent;\n /** Market to trade */\n market: StandardMarket;\n /** Initial trade side */\n initialSide?: TradeSide;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Chain network (default: 'solana') */\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n // Wrap submit with auth check — triggers sign-in if not authenticated\n const authenticatedSubmit = useAuthCallback(submit);\n\n return (\n <TradeFormUI\n event={event}\n market={market}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n/** Repeatable skeleton row for market list */\nfunction MarketRow() {\n return (\n <div className=\"flex items-center gap-x-3 px-2 py-3 lg:gap-x-4\">\n <Skeleton className=\"h-4 flex-1 rounded-md\" />\n <Skeleton className=\"h-5 w-10 shrink-0 rounded-md\" />\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </div>\n );\n}\n\nexport interface EventDetailSkeletonProps {\n /** Number of market rows */\n marketCount?: number;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n}: EventDetailSkeletonProps) {\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl animate-pulse\">\n {/* Header: avatar + title */}\n <div className=\"flex items-center gap-x-3 lg:gap-x-4\">\n <Skeleton className=\"h-14 w-14 shrink-0 rounded-lg lg:h-18 lg:w-18\" />\n <div className=\"flex flex-col gap-y-1.5 min-w-0 flex-1\">\n <Skeleton className=\"h-3 w-24 rounded-md lg:w-32\" />\n <Skeleton className=\"h-5 w-48 rounded-md lg:h-6 lg:w-72\" />\n </div>\n </div>\n\n {/* Chart placeholder */}\n <Skeleton className=\"h-[200px] w-full rounded-xl lg:h-[280px]\" />\n\n {/* Volume + range bar */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n <div className=\"flex gap-x-1\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-10 rounded-md\" />\n ))}\n </div>\n </div>\n\n {/* Market rows */}\n <div className=\"flex flex-col divide-y divide-default-200\">\n {Array.from({ length: marketCount }).map((_, i) => (\n <MarketRow key={i} />\n ))}\n </div>\n </div>\n );\n}\n\n/** Compact skeleton for the sidebar trade form area */\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4 animate-pulse\">\n {/* Header */}\n <div className=\"flex items-center gap-x-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-col gap-y-1 flex-1\">\n <Skeleton className=\"h-3 w-28 rounded-md\" />\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n </div>\n </div>\n {/* Tabs */}\n <div className=\"flex gap-x-4\">\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n {/* Outcome buttons */}\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n </div>\n {/* Input */}\n <Skeleton className=\"h-14 w-full rounded-lg\" />\n {/* Submit */}\n <Skeleton className=\"h-12 w-full rounded-lg\" />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useSeriesByTickerQuery } from \"../../hooks/useSeriesQuery\";\nimport type { CandlesticksResponse } from \"../../types\";\n\nexport interface UseEventDetailParams {\n eventId: string;\n /** Market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n candlestickMarketTickers?: string[];\n /** Chart time range (1d / 1w / 1m / all). Determines both the query window and candlestick granularity. */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const { candlestickMarketTickers, chartRange = DEFAULT_CHART_RANGE } = params;\n\n // Derive candlestick granularity and query time window from chart range\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs so it doesn't change on every render; recompute when range changes\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n [chartRange],\n );\n\n const client = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventByIdQuery({ id: params.eventId, withNestedMarkets: true });\n\n // For ALL range, start from the earliest market openTime; otherwise use duration offset\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n // Find the earliest openTime across all markets\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => m.openTime));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const {\n data: series,\n isLoading: isSeriesLoading,\n error: seriesError,\n } = useSeriesByTickerQuery(event?.seriesTicker ?? \"\", {\n enabled: !!event?.seriesTicker,\n });\n\n // Build a list of market tickers to fetch candlesticks for\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketTickers && candlestickMarketTickers.length > 0\n ? candlestickMarketTickers\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((ticker) => event.markets!.find((m) => m.ticker === ticker))\n .filter((m) => m !== undefined)\n : [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.ticker);\n }, [candlestickMarketTickers, event?.markets]);\n\n // Query candlesticks for each market in parallel\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((ticker) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(client, {\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((ticker, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) {\n errors.set(ticker, error);\n }\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n // Build a map of ticker -> candlesticks\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((ticker, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) {\n map.set(ticker, data);\n }\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n seriesError,\n /** Derived candlestick granularity (for chart formatting) */\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n","import { useMemo } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { StandardMarket } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHolding {\n /** Number of Yes outcome shares held */\n yesShares: number;\n /** Number of No outcome shares held */\n noShares: number;\n}\n\n/** Map of market ticker → holdings */\nexport type MarketsHoldingsMap = Map<string, MarketHolding>;\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/**\n * Fetches wallet portfolio and computes Yes / No token holdings\n * for each market. React Query deduplicates the wallet query\n * automatically.\n */\nexport function useMarketsHoldings(markets: StandardMarket[]): {\n holdings: MarketsHoldingsMap;\n isLoading: boolean;\n} {\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = status === \"authenticated\";\n const address = solanaWallet?.address;\n\n const { data: walletPortfolios, isLoading } = useWalletPortfoliosQuery(\n { chain: Chain.SOLANA, address: address ?? \"\" },\n {\n enabled: isAuthenticated && Boolean(address),\n refetchInterval: 10_000,\n },\n );\n\n const holdings = useMemo<MarketsHoldingsMap>(() => {\n const map = new Map<string, MarketHolding>();\n if (!walletPortfolios?.portfolios || markets.length === 0) return map;\n\n // Build a lookup: mint address → token amount\n const balanceByMint = new Map<string, number>();\n for (const p of walletPortfolios.portfolios) {\n balanceByMint.set(p.address, parseFloat(p.amount));\n }\n\n for (const market of markets) {\n const accountInfo = market.accounts[USDC_MINT];\n if (!accountInfo) continue;\n\n const yesShares = balanceByMint.get(accountInfo.yesMint) ?? 0;\n const noShares = balanceByMint.get(accountInfo.noMint) ?? 0;\n\n if (yesShares > 0 || noShares > 0) {\n map.set(market.ticker, { yesShares, noShares });\n }\n }\n\n return map;\n }, [walletPortfolios, markets]);\n\n return { holdings, isLoading };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n CHART_RANGE_SAMPLE_INTERVAL,\n ChartRange,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket, CandlesticksResponse } from \"../../types\";\n\n// Breathing dot rendered at the last data point of each line\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n {/* Pulsing outer ring */}\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n {/* Solid inner dot */}\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\n// Chart colors for different markets\nconst CHART_COLORS = [\n { stroke: \"hsl(var(--heroui-primary))\", id: \"colorMarket0\" },\n { stroke: \"hsl(var(--heroui-secondary))\", id: \"colorMarket1\" },\n { stroke: \"hsl(var(--heroui-success))\", id: \"colorMarket2\" },\n { stroke: \"hsl(var(--heroui-warning))\", id: \"colorMarket3\" },\n];\n\n// Format timestamp based on chart range\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n // Show time: \"14:30\"\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n // Show date with time: \"Jan 5 14:00\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ALL:\n default:\n // Show date only: \"Jan 5\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nexport type MarketDataPoint = {\n date: string;\n timestamp: number;\n [key: string]: number | string; // Dynamic keys for market values\n};\n\nexport type CurrentMarketData = {\n timestamp: number;\n date: string;\n markets: Array<{\n id: string;\n label: string;\n value: number;\n color: string;\n }>;\n};\n\nexport interface EventCandlesticksProps {\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Markets to display (used for labels) */\n markets?: StandardMarket[];\n /** Loading state */\n isLoading?: boolean;\n /** Chart time range (determines X-axis formatting) */\n chartRange?: ChartRangeType;\n /** Callback when hovered data changes */\n onDataChange?: (data: CurrentMarketData | null) => void;\n}\n\n// Transform candlesticks into chart data with sampling\nfunction transformCandlesticks(\n candlesticks: Map<string, CandlesticksResponse>,\n marketTickers: string[],\n chartRange: ChartRangeType,\n): MarketDataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n\n // Build per-market timestamp → value maps (using end_period_ts directly)\n const perMarketMaps: Map<string, Map<number, number>> = new Map();\n\n candlesticks.forEach((response, marketTicker) => {\n const map = new Map<number, number>();\n const points = response.candlesticks ?? [];\n points.forEach((point) => {\n // Align to sample interval boundary, keep the last value per bucket\n const bucket =\n point.end_period_ts - (point.end_period_ts % sampleInterval);\n map.set(bucket, point.yes_ask.close);\n });\n perMarketMaps.set(marketTicker, map);\n });\n\n // Collect all unique sampled timestamps (union across all markets)\n const allTimestamps = new Set<number>();\n for (const map of perMarketMaps.values()) {\n for (const ts of map.keys()) {\n allTimestamps.add(ts);\n }\n }\n\n // Sort timestamps\n const sortedTimestamps = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Create data points for all timestamps, forward-filling missing values\n const lastValues = new Map<string, number>();\n\n return sortedTimestamps.map((timestamp) => {\n const date = new Date(timestamp * 1000);\n const dataPoint: MarketDataPoint = {\n date: date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n timestamp,\n };\n\n marketTickers.forEach((marketTicker) => {\n const value = perMarketMaps.get(marketTicker)?.get(timestamp);\n if (value !== undefined) {\n dataPoint[marketTicker] = Math.round(value * 100) / 100;\n lastValues.set(marketTicker, dataPoint[marketTicker] as number);\n } else {\n // Use the most recent previous value if available, otherwise leave empty\n const lastValue = lastValues.get(marketTicker);\n if (lastValue !== undefined) {\n dataPoint[marketTicker] = lastValue;\n }\n }\n });\n\n return dataPoint;\n });\n}\n\nexport function EventCandlesticks({\n candlesticks,\n markets = [],\n isLoading,\n chartRange = ChartRange.ALL,\n onDataChange,\n}: EventCandlesticksProps) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n // Use ref to store callback to avoid infinite loops\n const onDataChangeRef = useRef(onDataChange);\n useEffect(() => {\n onDataChangeRef.current = onDataChange;\n });\n\n // Get market tickers that have candlestick data\n const marketTickers = useMemo(() => {\n if (!candlesticks) return [];\n return Array.from(candlesticks.keys()).slice(0, 4); // Max 4 markets\n }, [candlesticks]);\n\n // Transform data for chart\n const chartData = useMemo(() => {\n if (!candlesticks || candlesticks.size === 0) return [];\n return transformCandlesticks(candlesticks, marketTickers, chartRange);\n }, [candlesticks, marketTickers, chartRange]);\n\n // Calculate Y-axis domain based on actual data values\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0 || marketTickers.length === 0) {\n return [0, 100] as [number, number];\n }\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n chartData.forEach((dataPoint) => {\n marketTickers.forEach((marketTicker) => {\n const value = dataPoint[marketTicker] as number;\n if (value !== undefined) {\n minValue = Math.min(minValue, value);\n maxValue = Math.max(maxValue, value);\n }\n });\n });\n\n // Handle edge cases\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n // Add padding (10% of range) to keep curves in the middle\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5); // At least 5% padding\n\n const domainMin = Math.max(0, Math.floor(minValue - padding));\n const domainMax = Math.min(100, Math.ceil(maxValue + padding));\n\n return [domainMin, domainMax] as [number, number];\n }, [chartData, marketTickers]);\n\n // Get data at specific index or latest\n const getDataAtIndex = useCallback(\n (index: number | null): CurrentMarketData | null => {\n if (chartData.length === 0) return null;\n\n const dataPoint =\n index !== null ? chartData[index] : chartData[chartData.length - 1];\n if (!dataPoint) return null;\n\n return {\n timestamp: dataPoint.timestamp,\n date: dataPoint.date,\n markets: marketTickers.map((marketTicker, idx) => {\n const market = markets.find((m) => m.ticker === marketTicker);\n return {\n id: marketTicker,\n label: market?.yesSubTitle || `Market ${idx + 1}`,\n value: (dataPoint[marketTicker] as number) ?? 0,\n color: CHART_COLORS[idx % CHART_COLORS.length].stroke,\n };\n }),\n };\n },\n [chartData, marketTickers, markets],\n );\n\n // Notify parent of initial data\n useEffect(() => {\n if (onDataChangeRef.current && chartData.length > 0) {\n onDataChangeRef.current(getDataAtIndex(null));\n }\n }, [chartData, getDataAtIndex]);\n\n // Update parent when active index changes\n useEffect(() => {\n if (onDataChangeRef.current) {\n onDataChangeRef.current(getDataAtIndex(activeIndex));\n }\n }, [activeIndex, getDataAtIndex]);\n\n const handleMouseMove = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state: any) => {\n if (typeof state?.activeTooltipIndex === \"number\") {\n setActiveIndex(state.activeTooltipIndex);\n }\n },\n [],\n );\n\n const handleMouseLeave = useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n // Show loading or empty state\n if (isLoading) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">Loading chart...</div>\n </div>\n );\n }\n\n if (chartData.length === 0) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">No price history data</div>\n </div>\n );\n }\n\n return (\n <div className=\"h-[200px] w-full lg:h-[300px]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n // Calculate sample interval: show ~5-8 labels max\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n // Always show first and last, sample the rest\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 0;\n\n if (!isFirst && !isLast && !isSampled) {\n return null;\n }\n\n return (\n <text\n x={x}\n y={y + 10}\n textAnchor=\"middle\"\n fill=\"hsl(var(--heroui-default-500))\"\n fontSize={10}\n >\n {formatTimestamp(payload.value, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{ fontSize: 10, fill: \"hsl(var(--heroui-default-500))\" }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n contentStyle={{\n backgroundColor: \"hsl(var(--heroui-content1))\",\n border: \"1px solid hsl(var(--heroui-default-200))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n }}\n labelFormatter={(value: number) =>\n formatTimestamp(value, chartRange)\n }\n formatter={(value: number, name: string) => {\n const market = markets.find((m) => m.ticker === name);\n const label = market?.yesSubTitle || name;\n return [`${value.toFixed(2)}%`, label];\n }}\n />\n {marketTickers.map((marketTicker, index) => (\n <Line\n key={marketTicker}\n type=\"monotone\"\n dataKey={marketTicker}\n stroke={CHART_COLORS[index % CHART_COLORS.length].stroke}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${marketTicker}-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// Export helper for getting latest data (for initial state)\nexport function getLatestEventData(): CurrentMarketData {\n return {\n timestamp: Date.now() / 1000,\n date: new Date().toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n markets: [],\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useMarketCandlesticksQuery } from \"../../hooks/usePriceHistoryQuery\";\n\nexport interface UseMarketCandlesticksParams {\n /** Market ticker */\n marketTicker: string;\n /** Market open time (unix timestamp), used as start for \"ALL\" range */\n openTime?: number;\n /** Selected chart range */\n chartRange?: ChartRangeType;\n}\n\nexport function useMarketCandlesticks({\n marketTicker,\n openTime,\n chartRange = DEFAULT_CHART_RANGE,\n}: UseMarketCandlesticksParams) {\n const periodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs per range change\n const endTs = useMemo(() => Math.floor(Date.now() / 1000), [chartRange]);\n\n const startTs = useMemo(() => {\n if (rangeDuration != null) return endTs - rangeDuration;\n // ALL: start from market open time\n return openTime ?? endTs;\n }, [endTs, rangeDuration, openTime]);\n\n const {\n data: candlesticks,\n isLoading,\n isFetching,\n error,\n } = useMarketCandlesticksQuery(\n {\n ticker: marketTicker,\n startTs,\n endTs,\n periodInterval,\n },\n { enabled: !!marketTicker },\n );\n\n return {\n candlesticks,\n /** true on initial load (no cached data) */\n isLoading,\n /** true whenever a request is in-flight (including range switches with stale data) */\n isFetching,\n error,\n periodInterval,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n ChartRange,\n CHART_RANGE_SAMPLE_INTERVAL,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CHART_COLOR = \"hsl(var(--heroui-primary))\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DataPoint {\n timestamp: number;\n date: string;\n value: number;\n volume: number;\n}\n\nexport interface EventMarketCandlesticksUIProps {\n /** Candlestick data for the market */\n candlesticks?: CandlesticksResponse;\n /** Whether data is loading */\n isLoading?: boolean;\n /** Current chart range */\n chartRange: ChartRangeType;\n /** Callback when range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Breathing dot at the last data point\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ALL:\n default:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nfunction formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(0);\n}\n\nfunction transformCandlesticks(\n candlesticks: CandlesticksResponse,\n chartRange: ChartRangeType,\n): DataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n const points = candlesticks.candlesticks ?? [];\n\n // Bucket by sample interval, keep last close & sum volume per bucket\n const bucketMap = new Map<number, { close: number; volume: number }>();\n for (const point of points) {\n const bucket = point.end_period_ts - (point.end_period_ts % sampleInterval);\n const existing = bucketMap.get(bucket);\n bucketMap.set(bucket, {\n close: point.yes_ask.close,\n volume: (existing?.volume ?? 0) + (point.volume ?? 0),\n });\n }\n\n // Sort by timestamp\n const sorted = Array.from(bucketMap.entries()).sort((a, b) => a[0] - b[0]);\n\n return sorted.map(([timestamp, { close, volume }]) => ({\n timestamp,\n date: new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n value: Math.round(close * 100) / 100,\n volume,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketCandlesticksUI({\n candlesticks,\n isLoading,\n chartRange,\n onRangeChange,\n}: EventMarketCandlesticksUIProps) {\n const chartData = useMemo(() => {\n if (!candlesticks) return [];\n return transformCandlesticks(candlesticks, chartRange);\n }, [candlesticks, chartRange]);\n\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0) return [0, 100] as [number, number];\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n for (const dp of chartData) {\n if (dp.value < minValue) minValue = dp.value;\n if (dp.value > maxValue) maxValue = dp.value;\n }\n\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5);\n\n const domainMin = Math.max(0, Math.floor(minValue - padding));\n const domainMax = Math.min(100, Math.ceil(maxValue + padding));\n\n return [domainMin, domainMax] as [number, number];\n }, [chartData]);\n\n // ---------- Loading ----------\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">Loading chart...</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Empty ----------\n if (chartData.length === 0) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">No price history data</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Chart ----------\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 0;\n\n if (!isFirst && !isLast && !isSampled) {\n return null;\n }\n\n return (\n <text\n x={x}\n y={y + 10}\n textAnchor=\"middle\"\n fill=\"hsl(var(--heroui-default-500))\"\n fontSize={10}\n >\n {formatTimestamp(payload.value, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{\n fontSize: 10,\n fill: \"hsl(var(--heroui-default-500))\",\n }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n cursor={{ stroke: \"hsl(var(--heroui-default-300))\" }}\n content={({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const dp = payload[0].payload as DataPoint;\n const cents = Math.round(dp.value);\n return (\n <div className=\"rounded-lg border border-default-200 bg-content1 px-3 py-2 shadow-md\">\n <div className=\"text-lg font-semibold text-primary\">\n Yes {cents}¢\n </div>\n <div className=\"text-sm text-neutral\">\n Vol {formatCompact(dp.volume)} ·{\" \"}\n {formatTimestamp(dp.timestamp, chartRange)}\n </div>\n </div>\n );\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"value\"\n stroke={CHART_COLOR}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Range selector\n// ---------------------------------------------------------------------------\n\nfunction RangeSelector({\n chartRange,\n onRangeChange,\n}: {\n chartRange: ChartRangeType;\n onRangeChange?: (range: ChartRangeType) => void;\n}) {\n return (\n <div className=\"flex items-center justify-end gap-x-1\">\n {RANGE_OPTIONS.map((opt) => {\n const isActive = chartRange === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n onClick={() => onRangeChange?.(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\nexport interface UseMarketOrderbookParams {\n /** Market ticker to fetch orderbook for */\n marketTicker: string;\n}\n\nexport interface ProcessedOrderbook {\n /** Yes side bids (sorted descending by price) */\n yesBids: OrderbookLevel[];\n /** Yes side asks (sorted ascending by price) */\n yesAsks: OrderbookLevel[];\n /** No side bids (sorted descending by price) */\n noBids: OrderbookLevel[];\n /** No side asks (sorted ascending by price) */\n noAsks: OrderbookLevel[];\n /** Best yes bid price */\n bestYesBid: number | null;\n /** Best yes ask price */\n bestYesAsk: number | null;\n /** Best no bid price */\n bestNoBid: number | null;\n /** Best no ask price */\n bestNoAsk: number | null;\n /** Orderbook sequence number */\n sequence: number | null;\n}\n\nexport function useMarketOrderbook({ marketTicker }: UseMarketOrderbookParams) {\n const {\n data: orderbook,\n isLoading: isOrderbookLoading,\n error: orderbookError,\n } = useOrderBookQuery(marketTicker, {\n enabled: !!marketTicker,\n });\n\n const processedOrderbook = useMemo<ProcessedOrderbook | null>(() => {\n if (!orderbook) return null;\n\n const { yesBids, yesAsks, noBids, noAsks } = orderbook;\n\n return {\n yesBids,\n yesAsks,\n noBids,\n noAsks,\n bestYesBid: yesBids.length > 0 ? yesBids[0].price : null,\n bestYesAsk: yesAsks.length > 0 ? yesAsks[0].price : null,\n bestNoBid: noBids.length > 0 ? noBids[0].price : null,\n bestNoAsk: noAsks.length > 0 ? noAsks[0].price : null,\n sequence: orderbook.sequence ?? null,\n };\n }, [orderbook]);\n\n return {\n orderbook: processedOrderbook,\n isOrderbookLoading,\n orderbookError,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketOrderbookUIProps {\n /** Bid levels (sorted descending by price) */\n bids: OrderbookLevel[];\n /** Ask levels (sorted ascending by price) */\n asks: OrderbookLevel[];\n /** Whether data is loading */\n isLoading?: boolean;\n /** Max number of levels per side to display */\n maxLevels?: number;\n /** Callback when a price level row is clicked */\n onPriceClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}\n\ninterface OrderbookRow extends OrderbookLevel {\n /** Cumulative quantity up to this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the max cumulative across both sides */\n depth: number;\n /** Total value = price × quantity */\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[],\n maxLevels: number,\n): OrderbookRow[] {\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n return sliced.map((level) => {\n cumulative += level.quantity;\n return {\n ...level,\n cumulative,\n depth: 0,\n total: level.price * level.quantity,\n };\n });\n}\n\nfunction applyDepth(rows: OrderbookRow[], maxCum: number) {\n for (const row of rows) {\n row.depth = maxCum > 0 ? row.cumulative / maxCum : 0;\n }\n}\n\n/** Format price as percentage (0.94 → \"94¢\") */\nfunction formatPrice(price: number): string {\n const cents = Math.round(price * 100);\n return `${cents}¢`;\n}\n\n/** Format quantity with compact notation */\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/** Format total value (price × quantity, as USD-like value) */\nfunction formatTotal(total: number): string {\n if (total >= 1_000_000) return `$${(total / 1_000_000).toFixed(2)}M`;\n if (total >= 1_000) return `$${(total / 1_000).toFixed(2)}K`;\n if (total >= 1) return `$${total.toFixed(2)}`;\n return `$${total.toFixed(4)}`;\n}\n\nfunction RowItem({\n row,\n side,\n showType = false,\n onClick,\n}: {\n row: OrderbookRow;\n side: \"bid\" | \"ask\";\n /** Only show the type label on designated rows */\n showType?: boolean;\n onClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}) {\n const { t } = useTranslation();\n const isAsk = side === \"ask\";\n const barColor = isAsk ? \"bg-bullish/10\" : \"bg-bearish/10\";\n const typeColor = isAsk ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <button\n type=\"button\"\n className=\"relative grid w-full grid-cols-4 px-2 py-2.5 text-xs cursor-pointer hover:bg-default-100 transition-colors\"\n onClick={() => onClick?.(row.price, side)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${barColor} transition-[width] duration-200`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Type – only shown on the row nearest the spread */}\n <span\n className={`relative z-10 font-mono font-medium ${typeColor} text-left`}\n >\n {showType\n ? isAsk\n ? t(\"predict.trade.bestAsk\")\n : t(\"predict.trade.bestBid\")\n : \"\"}\n </span>\n {/* Price */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatPrice(row.price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatQty(row.quantity)}\n </span>\n {/* Total */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatTotal(row.total)}\n </span>\n </button>\n );\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n // Stagger widths for a more natural look\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\", \"50%\", \"70%\", \"40%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col\">\n {/* Header skeleton */}\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n </div>\n {/* Ask rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`ask-${i}`} index={i} />\n ))}\n {/* Spread */}\n <div className=\"flex justify-center border-y border-default-200 px-2 py-2.5\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-default-100\" />\n </div>\n {/* Bid rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`bid-${i}`} index={i + 3} />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_LEVELS = 8;\n\nexport function EventMarketOrderbookUI({\n bids,\n asks,\n isLoading = false,\n maxLevels = DEFAULT_MAX_LEVELS,\n onPriceClick,\n}: EventMarketOrderbookUIProps) {\n const { t } = useTranslation();\n\n const { bidRows, askRows, spread, spreadPercent } = useMemo(() => {\n const bidRows = buildRows(bids, maxLevels);\n const askRows = buildRows(asks, maxLevels);\n\n // Use the same max cumulative across both sides for comparable depth bars\n const maxCum = Math.max(\n bidRows[bidRows.length - 1]?.cumulative ?? 0,\n askRows[askRows.length - 1]?.cumulative ?? 0,\n );\n applyDepth(bidRows, maxCum);\n applyDepth(askRows, maxCum);\n\n const bestBid = bidRows[0]?.price ?? null;\n const bestAsk = askRows[0]?.price ?? null;\n\n let spread: number | null = null;\n let spreadPercent: number | null = null;\n if (bestBid != null && bestAsk != null) {\n spread = bestAsk - bestBid;\n const mid = (bestBid + bestAsk) / 2;\n if (mid > 0) {\n spreadPercent = Math.round((spread / mid) * 10000) / 100;\n }\n }\n\n return { bidRows, askRows, spread, spreadPercent };\n }, [bids, asks, maxLevels]);\n\n if (isLoading) {\n return <Skeleton />;\n }\n\n const isEmpty = bidRows.length === 0 && askRows.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Column headers */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span />\n <span className=\"text-right\">{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest price is nearest the spread) */}\n <div className=\"flex flex-col-reverse\">\n {askRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"ask\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread != null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 px-2 py-2.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {formatPrice(spread)}\n </span>\n {spreadPercent != null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bidRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"bid\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Tabs, Tab } from \"@liberfi.io/ui\";\nimport { DEFAULT_CHART_RANGE, type ChartRangeType } from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { useMarketCandlesticks } from \"./event-market-candlesticks.script\";\nimport { EventMarketCandlesticksUI } from \"./event-market-candlesticks.ui\";\nimport { useMarketOrderbook } from \"./event-market-orderbook.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\n\ntype MarketDetailTab = \"trade-yes\" | \"trade-no\" | \"graph\";\n\nexport interface EventMarketDetailWidgetProps {\n market: StandardMarket;\n /** Callback when an orderbook row is clicked – propagates market, outcome & side */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventMarketDetailWidget({\n market,\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n const { orderbook, isOrderbookLoading } = useMarketOrderbook({\n marketTicker: market.ticker,\n });\n\n const { candlesticks, isFetching: isCandlesticksLoading } =\n useMarketCandlesticks({\n marketTicker: market.ticker,\n openTime: market.openTime,\n chartRange,\n });\n\n // Map orderbook price click → trade action\n // ask row click → user wants to buy; bid row click → user wants to sell\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"graph\" title={t(\"predict.market.graph\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.yesBids ?? []}\n asks={orderbook?.yesAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.noBids ?? []}\n asks={orderbook?.noAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"graph\" && (\n <EventMarketCandlesticksUI\n candlesticks={candlesticks}\n isLoading={isCandlesticksLoading}\n chartRange={chartRange}\n onRangeChange={setChartRange}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Chip, ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\nimport type { MarketsHoldingsMap } from \"../../hooks/useMarketsHoldings\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\n\nconst DEFAULT_VISIBLE_COUNT = 4;\n\nexport interface EventMarketsUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Render expanded detail content for a market */\n renderMarketDetail?: (market: StandardMarket) => ReactNode;\n /** Callback when a market Yes/No button is clicked */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n /** Per-market token holdings for the current user */\n marketHoldings?: MarketsHoldingsMap;\n}\n\n/** Parse ask price in dollars (0–1) → cents (0–100), null if absent */\nfunction getMarketPrices(market: StandardMarket) {\n const yesCents = market.yesAsk\n ? Math.round(parseFloat(market.yesAsk) * 100)\n : null;\n const noCents = market.noAsk\n ? Math.round(parseFloat(market.noAsk) * 100)\n : null;\n return { yesCents, noCents };\n}\n\nexport function EventMarketsUI({\n markets,\n renderMarketDetail,\n onTradeAction,\n marketHoldings,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedTicker, setExpandedTicker] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (ticker: string) => {\n setExpandedTicker((prev) => (prev === ticker ? null : ticker));\n };\n\n return (\n <div className=\"flex flex-col divide-y divide-default-200\">\n {visibleMarkets.map((market) => {\n const { yesCents, noCents } = getMarketPrices(market);\n const isExpanded = expandedTicker === market.ticker;\n\n return (\n <div key={market.ticker} className=\"flex flex-col\">\n <div\n className=\"flex items-center gap-x-3 px-2 py-3 transition-colors hover:bg-content2 lg:gap-x-4 cursor-pointer\"\n onClick={() => toggleExpand(market.ticker)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpand(market.ticker);\n }\n }}\n >\n {/* Col 1: Title + Holdings tags */}\n <div className=\"flex flex-col gap-y-1 min-w-0 flex-1\">\n <span className=\"text-sm font-medium truncate lg:text-base\">\n {market.yesSubTitle}\n </span>\n {(() => {\n const holding = marketHoldings?.get(market.ticker);\n if (!holding) return null;\n const { yesShares, noShares } = holding;\n if (yesShares <= 0 && noShares <= 0) return null;\n return (\n <div className=\"flex items-center gap-x-1.5\">\n {yesShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"primary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesYes\", {\n shares:\n yesShares % 1 === 0\n ? yesShares\n : yesShares.toFixed(2),\n })}\n </Chip>\n )}\n {noShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"secondary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesNo\", {\n shares:\n noShares % 1 === 0\n ? noShares\n : noShares.toFixed(2),\n })}\n </Chip>\n )}\n </div>\n );\n })()}\n </div>\n\n {/* Col 2: Yes Percentage */}\n {(() => {\n const hasYes = yesCents != null;\n const hasNo = noCents != null;\n\n if (hasYes && !hasNo && yesCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"< 1%\"}\n </span>\n );\n }\n if (hasNo && !hasYes && noCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"> 99%\"}\n </span>\n );\n }\n if (!hasYes && !hasNo) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n 0%\n </span>\n );\n }\n return (\n <span className=\"text-lg font-bold shrink-0 text-center lg:text-xl\">\n {`${yesCents}%`}\n </span>\n );\n })()}\n\n {/* Col 3: Yes / No Buttons */}\n <div className=\"flex items-center gap-x-2 flex-1 justify-end\">\n <Button\n size=\"sm\"\n color=\"primary\"\n className=\"w-20 bg-primary-100 text-primary\"\n onPress={() => onTradeAction?.(market, \"yes\", \"buy\")}\n >\n {yesCents != null\n ? t(\"predict.market.action.yes\", { price: yesCents })\n : t(\"predict.market.yes\")}\n </Button>\n <Button\n size=\"sm\"\n color=\"secondary\"\n className=\"w-20 bg-secondary-100 text-secondary\"\n onPress={() => onTradeAction?.(market, \"no\", \"buy\")}\n >\n {noCents != null\n ? t(\"predict.market.action.no\", { price: noCents })\n : t(\"predict.market.no\")}\n </Button>\n </div>\n\n {/* Expand/Collapse indicator */}\n {isExpanded ? (\n <ChevronUpIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n )}\n </div>\n\n {/* Expanded detail content */}\n {isExpanded && renderMarketDetail && (\n <div className=\"max-h-100 overflow-y-auto px-2 pb-3\">\n {renderMarketDetail(market)}\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex items-center justify-center gap-x-1.5 px-2 py-2.5 text-sm text-default-500 transition-colors cursor-pointer hover:text-primary\"\n >\n {showAll ? (\n <>\n <span>{t(\"predict.event.rules.collapse\")}</span>\n <ChevronUpIcon className=\"h-4 w-4\" />\n </>\n ) : (\n <>\n <span>\n {t(\"predict.event.moreMarkets\", {\n count: markets.length - DEFAULT_VISIBLE_COUNT,\n })}\n </span>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Select, SelectItem } from \"@liberfi.io/ui\";\nimport type {\n StandardEvent,\n StandardMarket,\n SeriesResponse,\n} from \"../../types\";\n\nexport interface EventRulesUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Event data */\n event: StandardEvent;\n /** Series data */\n series?: SeriesResponse;\n}\n\nconst CLOSED_STATUSES = new Set([\"closed\", \"determined\", \"finalized\"]);\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\ninterface TimelineItem {\n label: string;\n value: string;\n isActive: boolean;\n}\n\nfunction EventTimeline({ market }: { market: StandardMarket }) {\n const isClosed = CLOSED_STATUSES.has(market.status);\n\n const items: TimelineItem[] = useMemo(() => {\n const openItem: TimelineItem = {\n label: \"Market Open\",\n value: formatTimestamp(market.openTime),\n isActive: true,\n };\n\n const closeItem: TimelineItem = {\n label: \"Market Closes\",\n value: isClosed\n ? formatTimestamp(market.closeTime)\n : \"After the outcome occurs\",\n isActive: isClosed,\n };\n\n const payoutItem: TimelineItem = {\n label: \"Projected Payout\",\n value: \"30 minutes after closing\",\n isActive: market.status === \"finalized\",\n };\n\n return [openItem, closeItem, payoutItem];\n }, [market.openTime, market.closeTime, market.status, isClosed]);\n\n const closeDescription = useMemo(() => {\n if (isClosed) return null;\n\n if (market.canCloseEarly && market.earlyCloseCondition) {\n return `${market.earlyCloseCondition} Otherwise, it closes by ${formatTimestamp(market.expirationTime)}.`;\n }\n\n return `This market closes by ${formatTimestamp(market.expirationTime)}.`;\n }, [\n isClosed,\n market.canCloseEarly,\n market.earlyCloseCondition,\n market.expirationTime,\n ]);\n\n return (\n <div className=\"flex flex-col\">\n {items.map((item, index) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n {/* Timeline indicator */}\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-default-300 bg-transparent\"\n }`}\n />\n {index < items.length - 1 && (\n <div className=\"w-px flex-1 bg-default-200\" />\n )}\n </div>\n {/* Content */}\n <div\n className={`flex flex-col ${index < items.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-default-500 lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n {closeDescription && (\n <p className=\"text-xs text-default-500 mt-3 lg:text-sm\">\n {closeDescription}\n </p>\n )}\n </div>\n );\n}\n\nexport function EventRulesUI({ markets, event, series }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [selectedMarketTicker, setSelectedMarketTicker] = useState<\n string | null\n >(null);\n\n const marketsWithRules = markets.filter((m) => m.rulesPrimary);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.ticker === selectedMarketTicker) ??\n marketsWithRules[0];\n if (!selectedMarket?.rulesPrimary) return null;\n\n return (\n <div className=\"flex flex-col gap-y-2\">\n <span className=\"text-sm font-medium lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n {marketsWithRules.length > 1 && (\n <Select\n size=\"sm\"\n aria-label=\"Select market rules\"\n className=\"max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={new Set([selectedMarket.ticker])}\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length > 0) {\n setSelectedMarketTicker(selected[0]);\n }\n }}\n >\n {marketsWithRules.map((market) => (\n <SelectItem key={market.ticker} textValue={market.yesSubTitle}>\n <span className=\"text-xs truncate\">{market.yesSubTitle}</span>\n </SelectItem>\n ))}\n </Select>\n )}\n <div className=\"text-xs text-foreground lg:text-sm\">\n {selectedMarket.rulesPrimary}\n </div>\n\n {/* Timeline and payout */}\n <span className=\"text-xs font-medium text-default-500 mt-2 lg:text-sm\">\n Timeline and payout\n </span>\n <EventTimeline market={selectedMarket} />\n\n {/* Tickers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-default-400 mt-2 lg:text-xs\">\n {series?.ticker && (\n <span>\n <span className=\"text-default-500\">Series:</span>{\" \"}\n <span className=\"text-foreground\">{series.ticker}</span>\n </span>\n )}\n {event.ticker && (\n <span>\n <span className=\"text-default-500\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.ticker}</span>\n </span>\n )}\n <span>\n <span className=\"text-default-500\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.ticker}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Select, SelectItem, SelectSection } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n ChartRange,\n type ChartRangeType,\n type CandlestickPeriodType,\n} from \"../../consts\";\nimport { useMarketsHoldings } from \"../../hooks/useMarketsHoldings\";\nimport type {\n StandardEvent,\n StandardMarket,\n CandlesticksResponse,\n SeriesResponse,\n} from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventCandlesticks,\n getLatestEventData,\n type CurrentMarketData,\n} from \"./event-candlesticks.ui\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventMarketsUI } from \"./event-markets.ui\";\nimport { EventRulesUI } from \"./event-rules.ui\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n];\n\nexport interface EventDetailUIProps {\n event: StandardEvent;\n /** Series data for the event */\n series?: SeriesResponse;\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Currently selected chart range */\n chartRange?: ChartRangeType;\n /** Derived candlestick period interval (for chart formatting) */\n periodInterval?: CandlestickPeriodType;\n /** Whether candlesticks are loading */\n isCandlesticksLoading?: boolean;\n /** Map of market ticker to candlestick error */\n candlestickErrors?: Map<string, Error>;\n /** Callback when chart range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n /** Selected market tickers for candlestick chart */\n selectedMarketTickers?: string[];\n /** Callback when selected markets change */\n onMarketSelectionChange?: (marketTickers: string[]) => void;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailUI({\n event,\n series,\n candlesticks,\n chartRange = ChartRange.ONE_DAY,\n periodInterval,\n isCandlesticksLoading,\n onRangeChange,\n selectedMarketTickers,\n onMarketSelectionChange,\n onTradeAction,\n}: EventDetailUIProps) {\n const { t } = useTranslation();\n const [currentData, setCurrentData] = useState<CurrentMarketData | null>(\n getLatestEventData(),\n );\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n // Hysteresis: require scrolling 20px past sentinel to enter compact,\n // but exit compact as soon as sentinel is back in viewport.\n // This breaks the feedback loop where header height change\n // could toggle the sentinel's visibility back and forth.\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n // Use capture to also detect scroll events from non-window scroll containers\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event.markets],\n );\n\n // Fetch per-market yes/no token holdings for the connected wallet\n const { holdings: marketHoldings } = useMarketsHoldings(markets);\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n const formattedEndDate = useMemo(() => {\n if (!event.strikeDate) return null;\n const date = new Date(event.strikeDate * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n return `${month} ${day}, ${year}`;\n }, [event.strikeDate]);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel element to detect scroll */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Event header - sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0\">\n {!isCompact &&\n (series?.category || (series?.tags && series.tags.length > 0)) && (\n <span className=\"text-xs text-default-500 lg:text-sm truncate\">\n {series.category}\n {series.category && series.tags?.length > 0 && \" · \"}\n {series.tags?.join(\", \")}\n </span>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Chart section */}\n <div className=\"flex flex-col gap-y-4\">\n <div className=\"flex flex-col\">\n {/* Market legend */}\n {currentData && currentData.markets.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs lg:text-sm\">\n {currentData.markets.map((market) => (\n <div key={market.id} className=\"flex items-center gap-x-2\">\n <div\n className=\"h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: market.color }}\n />\n <span className=\"text-default-600\">{market.label}</span>\n </div>\n ))}\n </div>\n )}\n\n <EventCandlesticks\n candlesticks={candlesticks}\n chartRange={chartRange}\n markets={markets}\n isLoading={isCandlesticksLoading}\n onDataChange={(data) => setCurrentData(data)}\n />\n\n {/* Volume, period selector and market selector */}\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 mt-2\">\n <div className=\"flex items-center gap-x-3 text-xs text-default-500 lg:text-sm\">\n <span>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n {formattedEndDate && (\n <>\n <span className=\"text-default-300\">·</span>\n <span>\n {t(\"predict.event.endDate\", { date: formattedEndDate })}\n </span>\n </>\n )}\n </div>\n\n <div className=\"flex items-center gap-x-1\">\n {RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onRangeChange?.(option.value)}\n className={`px-2 lg:px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n chartRange === option.value\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n {markets.length > 1 && (\n <Select\n size=\"sm\"\n selectionMode=\"multiple\"\n placeholder=\"Markets\"\n aria-label=\"Select markets\"\n className=\"min-w-28 max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={\n selectedMarketTickers\n ? new Set(selectedMarketTickers)\n : undefined\n }\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length <= MAX_PRICE_HISTORY_MARKETS) {\n onMarketSelectionChange?.(selected);\n }\n }}\n >\n <SelectSection\n title={`Pick up to ${MAX_PRICE_HISTORY_MARKETS} markets`}\n classNames={{\n heading: \"text-xs text-default-400 px-2 py-1\",\n }}\n >\n {markets.map((market) => (\n <SelectItem\n key={market.ticker}\n textValue={market.yesSubTitle}\n >\n <span className=\"text-xs truncate\">\n {market.yesSubTitle}\n </span>\n </SelectItem>\n ))}\n </SelectSection>\n </Select>\n )}\n </div>\n </div>\n </div>\n\n {/* Markets */}\n <EventMarketsUI\n markets={markets}\n onTradeAction={onTradeAction}\n marketHoldings={marketHoldings}\n renderMarketDetail={(market) => (\n <EventMarketDetailWidget\n market={market}\n onTradeAction={onTradeAction}\n />\n )}\n />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} series={series} />\n </div>\n );\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\";\nimport {\n DEFAULT_CHART_RANGE,\n ChartRange,\n MAX_PRICE_HISTORY_MARKETS,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { useEventDetail } from \"./event-detail.scripts\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ------------------------------------------------------------\nexport interface EventDetailWidgetProps {\n eventId: string;\n /** Initial market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n initialMarketTickers?: string[];\n /** Initial chart range. Default is \"1d\" (1 day). */\n initialChartRange?: ChartRangeType;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailWidget({\n eventId,\n initialMarketTickers,\n initialChartRange = DEFAULT_CHART_RANGE,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(initialChartRange);\n const [selectedMarketTickers, setSelectedMarketTickers] = useState<\n string[] | undefined\n >(initialMarketTickers);\n\n const {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n periodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n } = useEventDetail({\n eventId,\n candlestickMarketTickers: selectedMarketTickers,\n chartRange,\n });\n\n // Set default selected markets once when event first loads\n const marketsInitializedRef = useRef(!!initialMarketTickers);\n useEffect(() => {\n if (event?.markets && !marketsInitializedRef.current) {\n marketsInitializedRef.current = true;\n const defaultMarketTickers = [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((m) => m.ticker);\n setSelectedMarketTickers(defaultMarketTickers);\n }\n }, [event?.markets]);\n\n // Memoize handlers\n const handleRangeChange = useMemo(\n () => (newRange: ChartRangeType) => {\n setChartRange(newRange);\n },\n [],\n );\n\n const handleMarketSelectionChange = useMemo(\n () => (marketTickers: string[]) => {\n setSelectedMarketTickers(marketTickers);\n },\n [],\n );\n\n if (isEventLoading || isSeriesLoading) {\n return <EventDetailSkeleton />;\n }\n\n if (eventError || !event) {\n return (\n <div className=\"flex w-full items-center justify-center py-20 text-danger\">\n {eventError?.message || \"Event not found\"}\n </div>\n );\n }\n\n return (\n <EventDetailUI\n event={event}\n series={series}\n candlesticks={candlesticks}\n chartRange={chartRange}\n periodInterval={periodInterval}\n isCandlesticksLoading={isCandlesticksLoading}\n candlestickErrors={candlestickErrors}\n onRangeChange={handleRangeChange}\n selectedMarketTickers={selectedMarketTickers}\n onMarketSelectionChange={handleMarketSelectionChange}\n onTradeAction={onTradeAction}\n />\n );\n}\n\n// Re-export for convenience\nexport { ChartRange, type ChartRangeType };\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport type { StandardMarket } from \"../../types\";\nimport {\n type TradeOutcome,\n type TradeSide,\n} from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport {\n EventDetailWidget,\n type EventDetailWidgetProps,\n} from \"./event-detail.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventDetailPageProps\n extends Omit<EventDetailWidgetProps, \"eventId\" | \"onTradeAction\"> {\n /** Event ticker ID */\n eventId: string;\n /** Chain network for trading (default: 'solana') */\n chain?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventId,\n chain,\n ...widgetProps\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n // Fetch event to get the list of markets (react-query deduplicates with EventDetailWidget)\n const { data: event, isLoading: isEventLoading } = useEventByIdQuery({\n id: eventId,\n withNestedMarkets: true,\n });\n\n // Sort markets by yesAsk descending (same order as EventDetailUI)\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event?.markets],\n );\n\n // Trade action state – tracks which market / outcome / side were selected\n const [tradeSelection, setTradeSelection] = useState<{\n market: StandardMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n /** Monotonic counter so we can key-remount the form on each action */\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: StandardMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n // On mobile, also open the trade drawer\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n // Selected market for the trade form — prefer trade-action selection, fallback to top market\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -------------------------------------------------------------------------\n // Loading skeleton\n // -------------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n // -------------------------------------------------------------------------\n // Mobile layout: full-width detail + floating trade button + drawer\n // -------------------------------------------------------------------------\n // Common key to force TradeFormWidget remount when trade action changes\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.ticker}-${tradeSelection.version}`\n : (selectedMarket?.ticker ?? \"default\");\n\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Floating trade button */}\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n {/* Trade form drawer */}\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -------------------------------------------------------------------------\n // Desktop layout: detail on the left + trade form fixed on the right\n // -------------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Main content */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Sidebar – sticky trade form */}\n {selectedMarket && (\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4\">\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n </div>\n </aside>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderBookParams {\n /** Market ticker */\n marketTicker: string;\n /** Maximum number of levels to display per side */\n maxLevels?: number;\n /** Polling interval in milliseconds (0 to disable) */\n refetchInterval?: number;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport interface OrderBookRow extends OrderbookLevel {\n /** Cumulative quantity up to (and including) this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the maximum cumulative quantity */\n depth: number;\n}\n\nexport interface UseOrderBookResult {\n /** Bid rows sorted from highest to lowest price */\n bids: OrderBookRow[];\n /** Ask rows sorted from lowest to highest price */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread as percentage of midpoint */\n spreadPercent: number | null;\n /** Midpoint price in cents */\n midpoint: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[] | undefined,\n maxLevels: number,\n): OrderBookRow[] {\n if (!levels) return [];\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n const rows: OrderBookRow[] = sliced.map((level) => {\n cumulative += level.quantity;\n return { ...level, cumulative, depth: 0 };\n });\n\n // Calculate depth ratio\n const maxCum = rows[rows.length - 1]?.cumulative ?? 1;\n for (const row of rows) {\n row.depth = row.cumulative / maxCum;\n }\n\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useOrderBook({\n marketTicker,\n maxLevels = 10,\n refetchInterval = 5000,\n outcome = \"yes\",\n}: UseOrderBookParams): UseOrderBookResult {\n const {\n data: orderBook,\n isLoading,\n isFetching,\n } = useOrderBookQuery(marketTicker, {\n refetchInterval: refetchInterval || undefined,\n });\n\n // Select bids and asks based on outcome\n const rawBids = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n }, [orderBook, outcome]);\n\n const rawAsks = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n }, [orderBook, outcome]);\n\n const bids = useMemo(\n () => buildRows(rawBids, maxLevels),\n [rawBids, maxLevels],\n );\n\n const asks = useMemo(\n () => buildRows(rawAsks, maxLevels),\n [rawAsks, maxLevels],\n );\n\n // Calculate spread\n const spread = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return asks[0].price - bids[0].price;\n }, [bids, asks]);\n\n const midpoint = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return (bids[0].price + asks[0].price) / 2;\n }, [bids, asks]);\n\n const spreadPercent = useMemo(() => {\n if (spread === null || midpoint === null || midpoint === 0) return null;\n return Math.round((spread / midpoint) * 10000) / 100;\n }, [spread, midpoint]);\n\n return {\n bids,\n asks,\n spread,\n spreadPercent,\n midpoint,\n isLoading,\n isFetching,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderBookRow } from \"./order-book.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OrderBookUIProps {\n /** Bid rows (highest to lowest) */\n bids: OrderBookRow[];\n /** Ask rows (lowest to highest) */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread percentage */\n spreadPercent: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction OrderBookRowItem({\n row,\n side,\n onClick,\n}: {\n row: OrderBookRow;\n side: \"bid\" | \"ask\";\n onClick?: (price: number) => void;\n}) {\n const isBid = side === \"bid\";\n const barColor = isBid ? \"bg-primary/10\" : \"bg-danger/10\";\n const textColor = isBid ? \"text-primary\" : \"text-danger\";\n\n return (\n <button\n type=\"button\"\n className=\"relative flex w-full items-center justify-between px-3 py-1 text-xs hover:bg-default-100 cursor-pointer\"\n onClick={() => onClick?.(row.price)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 ${isBid ? \"right-0\" : \"left-0\"} ${barColor}`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Content */}\n <span className={`relative z-10 font-medium ${textColor}`}>\n {row.price}¢\n </span>\n <span className=\"relative z-10 text-default-600\">{row.quantity}</span>\n <span className=\"relative z-10 text-default-400\">{row.cumulative}</span>\n </button>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col gap-y-1 py-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className=\"mx-3 h-4 animate-pulse rounded bg-default-100\"\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercent,\n isLoading,\n onPriceClick,\n}: OrderBookUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </div>\n <Skeleton />\n <Skeleton />\n </div>\n );\n }\n\n const isEmpty = bids.length === 0 && asks.length === 0;\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </span>\n </div>\n\n {isEmpty ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.orderBook.empty\")}\n </div>\n ) : (\n <>\n {/* Column headers */}\n <div className=\"flex items-center justify-between px-3 py-1 text-xxs text-default-400\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span>{t(\"predict.orderBook.qty\")}</span>\n <span>{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest is at bottom, near spread) */}\n <div className=\"flex flex-col-reverse\">\n {asks.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"ask\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread !== null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 py-1.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {spread}¢\n </span>\n {spreadPercent !== null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bids.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"bid\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { useOrderBook } from \"./order-book.script\";\nimport { OrderBookUI } from \"./order-book.ui\";\n\nexport interface OrderBookWidgetProps {\n /** Market ticker */\n marketTicker: string;\n /** Maximum levels per side (default 10) */\n maxLevels?: number;\n /** Polling interval in ms (default 5000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport function OrderBookWidget({\n marketTicker,\n maxLevels,\n refetchInterval,\n onPriceClick,\n outcome,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercent, isLoading } = useOrderBook({\n marketTicker,\n maxLevels,\n refetchInterval,\n outcome,\n });\n\n return (\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercent={spreadPercent}\n isLoading={isLoading}\n onPriceClick={onPriceClick}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. There are no \"open orders\" in the\n * traditional sense.\n *\n * For tracking swap/order status, use `useOrderStatusQuery` with the order signature\n * returned from `useCreateSwapMutation`.\n */\nimport { useState, useCallback } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOpenOrdersParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Order type - new API uses swap model\n */\nexport interface Order {\n id: string;\n marketId: string;\n side: \"buy\" | \"sell\";\n outcome: \"yes\" | \"no\";\n type: \"limit\" | \"market\";\n price: number;\n quantity: number;\n filledQuantity: number;\n status: \"open\" | \"partial\" | \"filled\" | \"cancelled\";\n createdAt: string;\n}\n\nexport interface UseOpenOrdersResult {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** ID of the order currently being cancelled (null if none) */\n cancellingOrderId: string | null;\n /** Cancel an order by id */\n cancelOrder: (orderId: string) => void;\n /** Error from the most recent cancel attempt */\n cancelError: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API uses a swap-based model.\n * Use `useOrderStatusQuery` to track swap status instead.\n */\nexport function useOpenOrders(\n _params: UseOpenOrdersParams = {},\n): UseOpenOrdersResult {\n const [cancellingOrderId, setCancellingOrderId] = useState<string | null>(\n null,\n );\n const [cancelError] = useState<Error | null>(null);\n\n // No-op cancel function - API no longer supports this\n const cancelOrder = useCallback((_orderId: string) => {\n console.warn(\n \"useOpenOrders.cancelOrder is deprecated. Use swap-based order model instead.\",\n );\n setCancellingOrderId(null);\n }, []);\n\n return {\n orders: [],\n isLoading: false,\n isFetching: false,\n cancellingOrderId,\n cancelOrder,\n cancelError,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport type { Order } from \"./open-orders.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OpenOrdersUIProps {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** ID of the order currently being cancelled */\n cancellingOrderId: string | null;\n /** Cancel an order */\n onCancel: (orderId: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OpenOrdersUI({\n orders,\n isLoading,\n cancellingOrderId,\n onCancel,\n}: OpenOrdersUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n orders.map((order) => ({\n key: order.id,\n side: order.side,\n outcome: order.outcome,\n type: order.type,\n price: order.price,\n filled: `${order.filledQuantity}/${order.quantity}`,\n status: order.status,\n createdAt: formatDate(order.createdAt),\n isCancelling: order.id === cancellingOrderId,\n id: order.id,\n })),\n [orders, cancellingOrderId],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n {orders.length > 0 && (\n <span className=\"ml-1 text-default-400\">({orders.length})</span>\n )}\n </div>\n\n {orders.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.openOrders.empty\")}\n </div>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Open orders\"\n className=\"min-w-[600px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.openOrders.side\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.openOrders.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Type\" width={60}>\n {t(\"predict.openOrders.type\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.openOrders.price\")}\n </TableColumn>\n <TableColumn textValue=\"Filled\" width={80}>\n {t(\"predict.openOrders.filled\")}\n </TableColumn>\n <TableColumn textValue=\"Status\" width={70}>\n {t(\"predict.openOrders.status\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.openOrders.time\")}\n </TableColumn>\n <TableColumn textValue=\"Action\" width={80} align=\"end\">\n {\" \"}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.side === \"buy\" ? \"text-primary\" : \"text-danger\"\n }`}\n >\n {row.side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.type}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.filled}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.status}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"danger\"\n isLoading={row.isCancelling}\n onPress={() => onCancel(row.id)}\n >\n {t(\"predict.openOrders.cancel\")}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. See open-orders.script.tsx for alternatives.\n */\nimport { useOpenOrders } from \"./open-orders.script\";\nimport { OpenOrdersUI } from \"./open-orders.ui\";\n\nexport interface OpenOrdersWidgetProps {\n /** Polling interval in ms (default 10000, 0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated This widget is deprecated. Use swap-based order model instead.\n */\nexport function OpenOrdersWidget({\n refetchInterval,\n}: OpenOrdersWidgetProps = {}) {\n const { orders, isLoading, cancellingOrderId, cancelOrder } = useOpenOrders({\n refetchInterval,\n });\n\n return (\n <OpenOrdersUI\n orders={orders}\n isLoading={isLoading}\n cancellingOrderId={cancellingOrderId}\n onCancel={cancelOrder}\n />\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type {\n SingleTradeResponse,\n TradesQueryParams,\n MultiTradeResponse,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeHistoryParams {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size */\n pageSize?: number;\n}\n\nexport interface UseTradeHistoryResult {\n /** Current page of trades */\n trades: SingleTradeResponse[];\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Page size */\n pageSize: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Navigate to a specific page */\n goToPage: (page: number) => void;\n /** Go to the next page */\n nextPage: () => void;\n /** Go to the previous page */\n prevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeHistory({\n ticker,\n pageSize = DEFAULT_PAGE_SIZE,\n}: UseTradeHistoryParams = {}): UseTradeHistoryResult {\n const [page, setPage] = useState(1);\n const [cursors, setCursors] = useState<(string | undefined)[]>([undefined]);\n\n const currentCursor = cursors[page - 1];\n\n const queryParams = useMemo<TradesQueryParams>(\n () => ({\n ...(ticker ? { ticker } : {}),\n limit: pageSize,\n ...(currentCursor ? { cursor: currentCursor } : {}),\n }),\n [ticker, pageSize, currentCursor],\n );\n\n const { data, isLoading, isFetching } = useTradesQuery(queryParams);\n\n const response = data as MultiTradeResponse | undefined;\n\n const trades = response?.trades ?? [];\n const hasNextPage = !!response?.cursor;\n const hasPrevPage = page > 1;\n\n const goToPage = useCallback(\n (p: number) => {\n if (p >= 1 && p <= cursors.length) setPage(p);\n },\n [cursors.length],\n );\n\n const nextPage = useCallback(() => {\n if (hasNextPage && response?.cursor) {\n setCursors((prev) => {\n const newCursors = [...prev];\n if (newCursors.length === page) {\n newCursors.push(response.cursor!);\n }\n return newCursors;\n });\n setPage((prev) => prev + 1);\n }\n }, [hasNextPage, response?.cursor, page]);\n\n const prevPage = useCallback(() => {\n if (hasPrevPage) setPage((prev) => prev - 1);\n }, [hasPrevPage]);\n\n return {\n trades,\n isLoading,\n isFetching,\n page,\n pageSize,\n hasNextPage,\n hasPrevPage,\n goToPage,\n nextPage,\n prevPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"@liberfi.io/ui\";\nimport type { SingleTradeResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeHistoryUIProps {\n /** List of trades for current page */\n trades: SingleTradeResponse[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Go to next page */\n onNextPage: () => void;\n /** Go to previous page */\n onPrevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(timestamp: number): string {\n const d = new Date(timestamp * 1000);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeHistoryUI({\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n onNextPage,\n onPrevPage,\n}: TradeHistoryUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n trades.map((trade) => ({\n key: trade.tradeId,\n ticker: trade.ticker,\n takerSide: trade.takerSide,\n price: trade.price,\n yesPrice: trade.yesPrice,\n noPrice: trade.noPrice,\n count: trade.count,\n createdAt: formatDate(trade.createdTime),\n })),\n [trades],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n ) : (\n <>\n <div\n className={`w-full overflow-x-auto ${isFetching ? \"opacity-60\" : \"\"}`}\n >\n <StyledTable\n radius=\"none\"\n aria-label=\"Trade history\"\n className=\"min-w-[480px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.tradeHistory.side\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={80}>\n {t(\"predict.tradeHistory.price\")}\n </TableColumn>\n <TableColumn textValue=\"Yes\" width={60}>\n {t(\"predict.trade.yes\")}\n </TableColumn>\n <TableColumn textValue=\"No\" width={60}>\n {t(\"predict.trade.no\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={60}>\n {t(\"predict.tradeHistory.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.tradeHistory.time\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.takerSide === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.takerSide === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-primary\">\n {row.yesPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-secondary\">\n {row.noPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.count}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Pagination */}\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasPrevPage}\n onPress={onPrevPage}\n startContent={<ChevronLeftIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.prev\")}\n </Button>\n <span className=\"text-xs text-default-500\">\n {t(\"predict.pagination.page\", { page })}\n </span>\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasNextPage}\n onPress={onNextPage}\n endContent={<ChevronRightIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.next\")}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useTradeHistory } from \"./trade-history.script\";\nimport { TradeHistoryUI } from \"./trade-history.ui\";\n\nexport interface TradeHistoryWidgetProps {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n pageSize?: number;\n}\n\nexport function TradeHistoryWidget({\n ticker,\n pageSize,\n}: TradeHistoryWidgetProps = {}) {\n const {\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n nextPage,\n prevPage,\n } = useTradeHistory({ ticker, pageSize });\n\n return (\n <TradeHistoryUI\n trades={trades}\n isLoading={isLoading}\n isFetching={isFetching}\n page={page}\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onNextPage={nextPage}\n onPrevPage={prevPage}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. To track positions, you need to query user's token\n * balances for outcome mint addresses and calculate positions manually.\n *\n * Use `useOutcomeMintsQuery` and `useMarketsBatchQuery` to build positions\n * from on-chain data.\n */\nimport { useMemo } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePositionsParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Position type - not provided by new API\n */\nexport interface Position {\n id: string;\n marketId: string;\n marketTitle: string;\n outcome: \"yes\" | \"no\";\n quantity: number;\n avgPrice: number;\n avgCostBasis: number;\n currentPrice: number;\n unrealizedPnl: number;\n realizedPnl: number;\n}\n\nexport interface PositionsSummary {\n /** Total market value in cents */\n totalValue: number;\n /** Total unrealised PnL in cents */\n totalUnrealizedPnl: number;\n /** Total realised PnL in cents */\n totalRealizedPnl: number;\n /** Number of positions */\n count: number;\n}\n\nexport interface UsePositionsResult {\n /** Positions list */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Aggregated summary across all positions */\n summary: PositionsSummary;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API does not provide\n * positions data. Use on-chain token balance queries instead.\n */\nexport function usePositions(\n _params: UsePositionsParams = {},\n): UsePositionsResult {\n // Return empty positions - API no longer supports this\n const summary = useMemo<PositionsSummary>(\n () => ({\n totalValue: 0,\n totalUnrealizedPnl: 0,\n totalRealizedPnl: 0,\n count: 0,\n }),\n [],\n );\n\n return {\n positions: [],\n isLoading: false,\n isFetching: false,\n summary,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { Position, PositionsSummary } from \"./positions.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PositionsUIProps {\n /** List of positions */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Aggregated summary */\n summary: PositionsSummary;\n /** Callback when a position's sell button is clicked */\n onSell?: (position: Position) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst fmtCents = (cents: number) => formatAmountUSDCompact(cents / 100);\n\nfunction PnlText({ value }: { value: number }) {\n if (value === 0) {\n return <span className=\"text-default-500\">{fmtCents(0)}</span>;\n }\n const isPositive = value > 0;\n return (\n <span className={isPositive ? \"text-success\" : \"text-danger\"}>\n {isPositive ? \"+\" : \"\"}\n {fmtCents(value)}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PositionsUI({\n positions,\n isLoading,\n summary,\n onSell,\n}: PositionsUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n positions.map((pos) => ({\n key: `${pos.marketId}-${pos.outcome}`,\n marketTitle: pos.marketTitle,\n outcome: pos.outcome,\n quantity: pos.quantity,\n avgCost: pos.avgCostBasis,\n currentPrice: pos.currentPrice,\n value: pos.currentPrice * pos.quantity,\n unrealizedPnl: pos.unrealizedPnl,\n position: pos,\n })),\n [positions],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.positions.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.positions.title\")}\n {positions.length > 0 && (\n <span className=\"ml-1 text-default-400\">({positions.length})</span>\n )}\n </span>\n </div>\n\n {positions.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.positions.empty\")}\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Positions\"\n className=\"min-w-[640px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Market\" width={200}>\n {t(\"predict.positions.market\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.positions.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={50}>\n {t(\"predict.positions.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Avg Cost\" width={70}>\n {t(\"predict.positions.avgCost\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.positions.currentPrice\")}\n </TableColumn>\n <TableColumn textValue=\"Value\" width={80}>\n {t(\"predict.positions.value\")}\n </TableColumn>\n <TableColumn textValue=\"PnL\" width={80}>\n {t(\"predict.positions.pnl\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow\n key={row.key}\n className={\n onSell ? \"cursor-pointer hover:bg-default-50\" : \"\"\n }\n onClick={() => onSell?.(row.position)}\n >\n <TableCell>\n <span className=\"text-xs font-medium line-clamp-1\">\n {row.marketTitle}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.quantity}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.avgCost}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.currentPrice}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{fmtCents(row.value)}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">\n <PnlText value={row.unrealizedPnl} />\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Summary footer */}\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2 text-xs\">\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.totalValue\")}:{\" \"}\n <span className=\"font-medium text-foreground\">\n {fmtCents(summary.totalValue)}\n </span>\n </span>\n </div>\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.unrealizedPnl\")}:{\" \"}\n <PnlText value={summary.totalUnrealizedPnl} />\n </span>\n <span className=\"text-default-500\">\n {t(\"predict.positions.realizedPnl\")}:{\" \"}\n <PnlText value={summary.totalRealizedPnl} />\n </span>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. See positions.script.tsx for alternatives.\n */\nimport { usePositions, type Position } from \"./positions.script\";\nimport { PositionsUI } from \"./positions.ui\";\n\nexport interface PositionsWidgetProps {\n /** Polling interval in ms (default 15000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a position's sell action is triggered */\n onSell?: (position: Position) => void;\n}\n\n/**\n * @deprecated This widget is deprecated. Use on-chain token balance queries instead.\n */\nexport function PositionsWidget({\n refetchInterval,\n onSell,\n}: PositionsWidgetProps = {}) {\n const { positions, isLoading, summary } = usePositions({ refetchInterval });\n\n return (\n <PositionsUI\n positions={positions}\n isLoading={isLoading}\n summary={summary}\n onSell={onSell}\n />\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { PredictContext } from \"../contexts\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /** The predict API client instance */\n client: IPredictClient;\n /** WebSocket client instance (optional, enables WebSocket features) */\n wsClient?: IPredictWsClient | null;\n}>;\n\nexport function PredictProvider({\n client,\n wsClient = null,\n children,\n}: PredictProviderProps) {\n const value = useMemo(\n () => ({\n client,\n wsClient,\n }),\n [client, wsClient],\n );\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/contexts/PredictContext.tsx","../src/hooks/usePredictContext.ts","../src/hooks/usePredictClient.ts","../src/hooks/useEventsQuery.ts","../src/hooks/useEventsInfiniteQuery.ts","../src/hooks/useEventByIdQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useMarketByIdQuery.ts","../src/hooks/useMarketByMintQuery.ts","../src/hooks/useMarketsBatchQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/usePriceHistoryQuery.ts","../src/hooks/useForecastHistoryQuery.ts","../src/hooks/useLiveDataQuery.ts","../src/hooks/useSeriesQuery.ts","../src/hooks/useCategoriesQuery.ts","../src/hooks/useSearchQuery.ts","../src/hooks/useOutcomeMintsQuery.ts","../src/hooks/useQuoteQuery.ts","../src/hooks/useSwapMutation.ts","../src/hooks/useOrderQuery.ts","../src/hooks/useIntentQuery.ts","../src/hooks/usePredictionMarketMutation.ts","../src/hooks/useTokensQuery.ts","../src/hooks/useVenuesQuery.ts","../src/client/ws.ts","../src/hooks/useWsConnection.ts","../src/hooks/useWsClient.ts","../src/hooks/usePricesSubscription.ts","../src/hooks/useTradesSubscription.ts","../src/hooks/useOrderbookSubscription.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/consts/index.ts","../src/components/events/events.script.tsx","../src/components/events/events.skeleton.tsx","../src/components/events/gauge-chart.ui.tsx","../src/components/events/event-item.ui.tsx","../src/components/events/events.ui.tsx","../src/components/events/events.widget.tsx","../src/components/events/events.page.tsx","../src/components/trade-form/trade-form.script.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/hooks/useMarketsHoldings.ts","../src/components/event-detail/event-candlesticks.ui.tsx","../src/components/event-detail/event-market-candlesticks.script.ts","../src/components/event-detail/event-market-candlesticks.ui.tsx","../src/components/event-detail/event-market-orderbook.script.ts","../src/components/event-detail/event-market-orderbook.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-markets.ui.tsx","../src/components/event-detail/event-rules.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/order-book/order-book.script.tsx","../src/components/order-book/order-book.ui.tsx","../src/components/order-book/order-book.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/providers/PredictProvider.tsx","../src/client/base.ts","../src/client/dflow.ts"],"names":["version_default","PredictContext","createContext","usePredictContext","context","useContext","usePredictClient","client","eventsQueryKey","params","fetchEvents","useEventsQuery","queryOptions","useQuery","eventsInfiniteQueryKey","useEventsInfiniteQuery","options","useInfiniteQuery","pageParam","lastPage","eventByIdQueryKey","fetchEventById","useEventByIdQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","marketByIdQueryKey","fetchMarketById","useMarketByIdQuery","marketByMintQueryKey","mintAddress","fetchMarketByMint","useMarketByMintQuery","marketsBatchQueryKey","request","fetchMarketsBatch","useMarketsBatchQuery","orderBookQueryKey","marketTicker","fetchOrderBook","useOrderBookQuery","orderBookByMintQueryKey","fetchOrderBookByMint","useOrderBookByMintQuery","tradesQueryKey","fetchTrades","useTradesQuery","tradesByMintQueryKey","fetchTradesByMint","useTradesByMintQuery","eventCandlesticksQueryKey","fetchEventCandlesticks","ticker","rest","useEventCandlesticksQuery","marketCandlesticksQueryKey","fetchMarketCandlesticks","useMarketCandlesticksQuery","marketCandlesticksByMintQueryKey","fetchMarketCandlesticksByMint","useMarketCandlesticksByMintQuery","usePriceHistoryQuery","forecastPercentileHistoryQueryKey","fetchForecastPercentileHistory","useForecastPercentileHistoryQuery","forecastPercentileHistoryByMintQueryKey","fetchForecastPercentileHistoryByMint","useForecastPercentileHistoryByMintQuery","liveDataQueryKey","fetchLiveData","useLiveDataQuery","liveDataByEventQueryKey","fetchLiveDataByEvent","useLiveDataByEventQuery","liveDataByMintQueryKey","fetchLiveDataByMint","useLiveDataByMintQuery","seriesQueryKey","fetchSeries","useSeriesQuery","seriesByTickerQueryKey","seriesTicker","fetchSeriesByTicker","useSeriesByTickerQuery","tagsByCategoriesQueryKey","fetchTagsByCategories","useTagsByCategoriesQuery","filtersBySportsQueryKey","fetchFiltersBySports","useFiltersBySportsQuery","useCategoriesQuery","searchQueryKey","fetchSearch","useSearchQuery","outcomeMintsQueryKey","fetchOutcomeMints","useOutcomeMintsQuery","filterOutcomeMints","useFilterOutcomeMintsMutation","useMutation","quoteQueryKey","fetchQuote","useQuoteQuery","createSwap","useCreateSwapMutation","createSwapInstructions","useCreateSwapInstructionsMutation","orderQueryKey","fetchOrder","useOrderQuery","orderStatusQueryKey","fetchOrderStatus","useOrderStatusQuery","intentQuoteQueryKey","fetchIntentQuote","useIntentQuoteQuery","submitIntentSwap","useSubmitIntentSwapMutation","initPredictionMarket","useInitPredictionMarketMutation","tokensQueryKey","fetchTokens","useTokensQuery","tokensWithDecimalsQueryKey","fetchTokensWithDecimals","useTokensWithDecimalsQuery","venuesQueryKey","fetchVenues","useVenuesQuery","DflowPredictWsClient","config","event","error","onUpdate","removeListener","callback","listeners","index","key","channel","subscription","status","data","listener","message","type","dataMsg","delay","createDflowPredictWsClient","useWsConnection","wsEndpoint","autoConnect","autoReconnect","enabled","setStatus","useState","setError","clientRef","useRef","useEffect","unsubStatus","newStatus","unsubError","err","unsubConnect","connect","useCallback","disconnect","useWsClient","wsClient","wsStatus","setWsStatus","usePricesSubscription","all","tickers","prices","setPrices","isSubscribed","setIsSubscribed","onUpdateRef","unsubscribe","update","prev","next","useTradesSubscription","maxHistory","trades","setTrades","trade","clearHistory","useOrderbookSubscription","orderbooks","setOrderbooks","getOrderbook","CATEGORY_ORDER","useEventsCategories","tagsData","isLoading","isError","useMemo","orderIndex","cat","idx","category","tags","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","className","t","useTranslation","handleSelectAll","jsxs","cn","jsx","HorizontalScrollContainer","Chip","tag","label","isSelected","onPress","variant","CategoriesSkeleton","count","_","i","Skeleton","CategoriesWidget","onSelect","setSelectedCategory","setSelectedTag","handleCategorySelect","c","handleTagSelect","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","useEvents","restParams","needsSeriesLookup","seriesData","isSeriesFetching","isSeriesError","seriesError","derivedSeriesTickers","s","mergedParams","infiniteData","isEventsLoading","isEventsFetching","isFetchingMore","hasMore","fetchMore","refetch","page","isSeriesResolving","EventItemSkeleton","EventsSkeleton","GaugeChartUI","value","showLabel","normalized","EventItemUI","onSelectOutcome","manualSelectedMarket","setManualSelectedMarket","rawMarkets","markets","openMarkets","market","isSingleMarket","selectedMarket","formattedVolume","formatAmountUSDCompact","getYesCents","getNoCents","getYesPercent","yesCents","noCents","formatPercent","getNoPercent","cents","eventStatus","hasActiveMarket","m","handleMarketClick","handleBack","handleYesClick","handleNoClick","handleSelect","displayedMarkets","hasMoreMarkets","Avatar","StyledTooltip","e","ChevronUpIcon","Button","ChevronRightIcon","ChevronLeftIcon","SM","MD","LG","XL","GAP","ROW_HEIGHT_XS","ROW_HEIGHT_SM","ROW_HEIGHT_LG","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","containerRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","List","EventGridRow","style","gap","Spinner","startIdx","rowEvents","emptySlots","innerStyle","EventsWidget","queryParams","isFetching","EventsPage","selection","setSelection","getMintAddress","accounts","collateralMint","outcome","accountInfo","USDC_MINT","SOLANA_TOKENS","fireCelebration","defaults","confetti","useTradeForm","_chain","initialOutcome","initialSide","authStatus","useAuth","solanaWallet","useWallets","w","ChainNamespace","isAuthenticated","userPublicKey","setOutcome","side","setSideRaw","quantity","setQuantityRaw","outcomeMint","inputMint","outputMint","quoteEnabled","pricePerShare","shares","amount","order","isQuoteLoading","quoteError","refetchOrder","walletPortfolios","isBalanceLoading","refetchBalance","useWalletPortfoliosQuery","Chain","usdcBalance","usdcPortfolio","p","outcomeTokenBalance","outcomePortfolio","yesMint","noMint","yesTokenBalance","noTokenBalance","orderBook","bestBid","bestAsk","priceImpact","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","setQuantity","v","clamped","rounded","validation","errors","txHash","setTxHash","isSubmitting","setIsSubmitting","submit","currentOrder","txBytes","hash","toast","reset","USDC_LOGO","TradeFormUI","isValid","onOutcomeChange","onSideChange","onQuantityChange","onSubmit","submitLabel","sideLabel","outcomeLabel","submitColor","Tabs","Tab","o","holdingBalance","price","StyledNumberInput","Fragment","amt","pct","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","MarketRow","EventDetailSkeleton","marketCount","TradeFormSkeleton","useEventDetail","candlestickMarketTickers","chartRange","candlestickPeriodInterval","rangeDuration","candlestickEndTs","isEventLoading","eventError","candlestickStartTs","series","isSeriesLoading","marketsToQuery","candlestickQueries","useQueries","isCandlesticksLoading","q","candlestickErrors","candlesticks","map","useMarketsHoldings","address","balanceByMint","yesShares","noShares","BreathingDot","props","cx","cy","dataLength","stroke","CHART_COLORS","formatTimestamp","timestamp","date","transformCandlesticks","marketTickers","sampleInterval","perMarketMaps","response","point","bucket","allTimestamps","ts","sortedTimestamps","lastValues","dataPoint","lastValue","EventCandlesticks","onDataChange","activeIndex","setActiveIndex","onDataChangeRef","chartData","yAxisDomain","minValue","maxValue","range","padding","domainMin","domainMax","getDataAtIndex","handleMouseMove","state","handleMouseLeave","ResponsiveContainer","LineChart","XAxis","x","y","payload","totalPoints","sampleIntervalX","isFirst","isLast","isSampled","CartesianGrid","YAxis","Tooltip","name","Line","dotProps","getLatestEventData","useMarketCandlesticks","openTime","periodInterval","endTs","startTs","CHART_COLOR","RANGE_OPTIONS","formatCompact","n","points","bucketMap","existing","close","volume","EventMarketCandlesticksUI","onRangeChange","dp","RangeSelector","active","opt","isActive","useMarketOrderbook","orderbook","isOrderbookLoading","orderbookError","yesBids","yesAsks","noBids","noAsks","buildRows","levels","maxLevels","sliced","cumulative","level","applyDepth","rows","maxCum","row","formatPrice","formatQty","qty","formatTotal","total","RowItem","showType","onClick","isAsk","barColor","typeColor","SkeletonRow","widths","DEFAULT_MAX_LEVELS","EventMarketOrderbookUI","bids","asks","onPriceClick","bidRows","askRows","spread","spreadPercent","mid","EventMarketDetailWidget","onTradeAction","activeTab","setActiveTab","setChartRange","handleYesPriceClick","_price","bookSide","handleNoPriceClick","DEFAULT_VISIBLE_COUNT","getMarketPrices","EventMarketsUI","renderMarketDetail","marketHoldings","showAll","setShowAll","expandedTicker","setExpandedTicker","visibleMarkets","toggleExpand","isExpanded","holding","hasYes","hasNo","ChevronDownIcon","CLOSED_STATUSES","month","day","year","hours","minutes","EventTimeline","isClosed","items","openItem","closeItem","payoutItem","closeDescription","item","EventRulesUI","selectedMarketTicker","setSelectedMarketTicker","marketsWithRules","Select","keys","selected","SelectItem","EventDetailUI","selectedMarketTickers","onMarketSelectionChange","currentData","setCurrentData","isCompact","setIsCompact","sentinelRef","sentinel","compact","rafId","bottom","shouldBeCompact","onScroll","formattedEndDate","option","SelectSection","EventDetailWidget","eventId","initialMarketTickers","initialChartRange","setSelectedMarketTickers","marketsInitializedRef","defaultMarketTickers","handleRangeChange","newRange","handleMarketSelectionChange","EventDetailPage","widgetProps","isMobile","useScreen","isOpen","onOpen","onClose","useDisclosure","tradeSelection","setTradeSelection","handleTradeAction","tradeFormKey","Drawer","DrawerContent","DrawerBody","useOrderBook","refetchInterval","rawBids","rawAsks","midpoint","OrderBookRowItem","isBid","textColor","OrderBookUI","isEmpty","OrderBookWidget","useOpenOrders","_params","cancellingOrderId","setCancellingOrderId","cancelError","cancelOrder","_orderId","formatDate","iso","OpenOrdersUI","orders","onCancel","StyledTable","TableHeader","TableColumn","TableBody","TableRow","TableCell","OpenOrdersWidget","useTradeHistory","pageSize","setPage","cursors","setCursors","currentCursor","hasNextPage","hasPrevPage","goToPage","nextPage","newCursors","prevPage","TradeHistoryUI","onNextPage","onPrevPage","TradeHistoryWidget","usePositions","summary","fmtCents","PnlText","isPositive","PositionsUI","positions","onSell","pos","PositionsWidget","PredictProvider","children","buildQuery","provider","qs","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","httpPost","parseSide","raw","sort","priceStr","normalizeOrderbook","DflowPredictClient","withNestedMarkets","marketId","eventTicker"],"mappings":"mpBAOI,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,mBAAA,CAAsB,MAAA,CAAO,mBAAA,EAAuB,EAAC,CAC5D,MAAA,CAAO,mBAAA,CAAoB,wBAAwB,CAAA,CAAI,UAGzD,IAAOA,EAAAA,CAAQ,SCDR,IAAMC,EAAAA,CAAiBC,mBAAAA,CAC5B,EACF,ECVO,SAASC,EAAAA,EAAoB,CAClC,IAAMC,CAAAA,CAAUC,gBAAAA,CAAWJ,EAAc,CAAA,CACzC,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAE3E,OAAOA,CACT,CCPO,SAASE,CAAAA,EAAmB,CACjC,GAAM,CAAE,MAAA,CAAAC,CAAO,CAAA,CAAIJ,EAAAA,EAAkB,CACrC,OAAOI,CACT,CCIO,SAASC,EAAAA,CAAeC,CAAAA,CAAsC,CACnE,OAAO,CAAC,SAAA,CAAW,QAAA,CAAUA,CAAAA,EAAU,EAAE,CAC3C,CAEA,eAAsBC,EAAAA,CACpBH,EACAE,CAAAA,CACiC,CACjC,OAAO,MAAMF,CAAAA,CAAO,SAAA,CAAUE,CAAM,CACtC,CAEO,SAASE,EAAAA,CACdF,CAAAA,CACAG,CAAAA,CAQI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUL,EAAAA,CAAeC,CAAM,CAAA,CAC/B,OAAA,CAAS,SAAYC,EAAAA,CAAYH,CAAAA,CAAQE,CAAM,CAAA,CAC/C,GAAGG,CACL,CAAC,CACH,CC7BO,SAASE,EAAAA,CACdL,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,WAAYA,CAAAA,EAAU,EAAE,CACvD,CAEO,SAASM,EAAAA,CACdN,CAAAA,CAA2C,EAAC,CAC5CO,CAAAA,CASI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,GAAiB,CAEhC,OAAOW,2BAAAA,CAAiB,CACtB,QAAA,CAAUH,EAAAA,CAAuBL,CAAM,CAAA,CACvC,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAS,CAAU,CAAA,GAC1BR,EAAAA,CAAYH,CAAAA,CAAQ,CAClB,GAAGE,CAAAA,CACH,GAAIS,CAAAA,GAAc,MAAA,CAAY,CAAE,MAAA,CAAQA,CAAU,CAAA,CAAI,EACxD,CAAC,CAAA,CACH,gBAAA,CAAkB,MAAA,CAClB,gBAAA,CAAmBC,GAEVA,CAAAA,CAAS,MAAA,EAAU,MAAA,CAE5B,GAAGH,CACL,CAAC,CACH,CCjCO,SAASI,EAAAA,CAAkBX,CAAAA,CAA4C,CAC5E,OAAO,CAAC,SAAA,CAAW,OAAA,CAAS,MAAA,CAAQA,CAAAA,CAAO,EAAA,CAAIA,CAAAA,CAAO,iBAAiB,CACzE,CAEA,eAAsBY,EAAAA,CACpBd,CAAAA,CACAE,CAAAA,CACwB,CACxB,OAAO,MAAMF,CAAAA,CAAO,YAAA,CAAaE,CAAAA,CAAO,EAAA,CAAIA,CAAAA,CAAO,iBAAiB,CACtE,CAEO,SAASa,EAAAA,CACdb,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,EAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUO,EAAAA,CAAkBX,CAAM,EAClC,OAAA,CAAS,SAAYY,EAAAA,CAAed,CAAAA,CAAQE,CAAM,CAAA,CAClD,GAAGO,CACL,CAAC,CACH,CC1BO,SAASO,EAAAA,CAAgBd,CAAAA,CAAuC,CACrE,OAAO,CAAC,SAAA,CAAW,SAAA,CAAWA,CAAAA,EAAU,EAAE,CAC5C,CAEA,eAAsBe,EAAAA,CACpBjB,CAAAA,CACAE,CAAAA,CACkC,CAClC,OAAO,MAAMF,CAAAA,CAAO,UAAA,CAAWE,CAAM,CACvC,CAEO,SAASgB,EAAAA,CACdhB,EACAG,CAAAA,CAQI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUU,EAAAA,CAAgBd,CAAM,CAAA,CAChC,OAAA,CAAS,SAAYe,EAAAA,CAAajB,CAAAA,CAAQE,CAAM,CAAA,CAChD,GAAGG,CACL,CAAC,CACH,CC7BO,SAASc,EAAAA,CACdjB,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,MAAA,CAAQA,CAAAA,CAAO,EAAE,CAChD,CAEA,eAAsBkB,EAAAA,CACpBpB,CAAAA,CACAE,CAAAA,CACyB,CACzB,OAAO,MAAMF,EAAO,aAAA,CAAcE,CAAAA,CAAO,EAAE,CAC7C,CAEO,SAASmB,EAAAA,CACdnB,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUa,EAAAA,CAAmBjB,CAAM,CAAA,CACnC,OAAA,CAAS,SAAYkB,EAAAA,CAAgBpB,CAAAA,CAAQE,CAAM,CAAA,CACnD,GAAGO,CACL,CAAC,CACH,CC3BO,SAASa,EAAAA,CAAqBC,CAAAA,CAAgC,CACnE,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,QAAA,CAAUA,CAAW,CACpD,CAEA,eAAsBC,EAAAA,CACpBxB,CAAAA,CACAuB,CAAAA,CACyB,CACzB,OAAO,MAAMvB,CAAAA,CAAO,eAAA,CAAgBuB,CAAW,CACjD,CAEO,SAASE,EAAAA,CACdF,CAAAA,CACAd,CAAAA,CAGI,GACJ,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUgB,EAAAA,CAAqBC,CAAW,CAAA,CAC1C,OAAA,CAAS,SAAYC,EAAAA,CAAkBxB,CAAAA,CAAQuB,CAAW,CAAA,CAC1D,GAAGd,CACL,CAAC,CACH,CCpBO,SAASiB,EAAAA,CAAqBC,CAAAA,CAAyC,CAC5E,OAAO,CAAC,UAAW,SAAA,CAAW,OAAA,CAASA,CAAO,CAChD,CAEA,eAAsBC,EAAAA,CACpB5B,CAAAA,CACA2B,CAAAA,CACkC,CAClC,OAAO,MAAM3B,CAAAA,CAAO,eAAA,CAAgB2B,CAAO,CAC7C,CAEO,SAASE,EAAAA,CACdF,CAAAA,CACAlB,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUoB,EAAAA,CAAqBC,CAAO,CAAA,CACtC,OAAA,CAAS,SAAYC,EAAAA,CAAkB5B,CAAAA,CAAQ2B,CAAO,CAAA,CACtD,OAAA,CAAS,CAAA,EAAQA,CAAAA,CAAQ,OAAA,EAAS,MAAA,EAAUA,CAAAA,CAAQ,KAAA,EAAO,MAAA,CAAA,CAC3D,GAAGlB,CACL,CAAC,CACH,CCtCO,SAASqB,EAAAA,CAAkBC,CAAAA,CAAiC,CACjE,OAAO,CAAC,SAAA,CAAW,WAAA,CAAaA,CAAY,CAC9C,CAEA,eAAsBC,EAAAA,CACpBhC,CAAAA,CACA+B,CAAAA,CAC4B,CAC5B,OAAO,MAAM/B,EAAO,YAAA,CAAa+B,CAAY,CAC/C,CAEO,SAASE,EAAAA,CACdF,CAAAA,CACAtB,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUwB,EAAAA,CAAkBC,CAAY,CAAA,CACxC,OAAA,CAAS,SAAYC,EAAAA,CAAehC,EAAQ+B,CAAY,CAAA,CACxD,GAAGtB,CACL,CAAC,CACH,CAGO,SAASyB,EAAAA,CAAwBX,CAAAA,CAAgC,CACtE,OAAO,CAAC,SAAA,CAAW,WAAA,CAAa,QAAA,CAAUA,CAAW,CACvD,CAEA,eAAsBY,EAAAA,CACpBnC,CAAAA,CACAuB,CAAAA,CAC4B,CAC5B,OAAO,MAAMvB,CAAAA,CAAO,kBAAA,CAAmBuB,CAAW,CACpD,CAEO,SAASa,EAAAA,CACdb,EACAd,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU4B,EAAAA,CAAwBX,CAAW,CAAA,CAC7C,OAAA,CAAS,SAAYY,EAAAA,CAAqBnC,CAAAA,CAAQuB,CAAW,CAAA,CAC7D,GAAGd,CACL,CAAC,CACH,CC9CO,SAAS4B,EAAAA,CAAenC,CAAAA,CAAuC,CACpE,OAAO,CAAC,SAAA,CAAW,QAAA,CAAUA,CAAAA,EAAU,EAAE,CAC3C,CAEA,eAAsBoC,EAAAA,CACpBtC,CAAAA,CACAE,CAAAA,CAC6B,CAC7B,OAAO,MAAMF,EAAO,SAAA,CAAUE,CAAM,CACtC,CAEO,SAASqC,EAAAA,CACdrC,CAAAA,CACAG,CAAAA,CAGI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,oBAAS,CACd,QAAA,CAAU+B,EAAAA,CAAenC,CAAM,CAAA,CAC/B,OAAA,CAAS,SAAYoC,EAAAA,CAAYtC,CAAAA,CAAQE,CAAM,CAAA,CAC/C,GAAGG,CACL,CAAC,CACH,CAGO,SAASmC,EAAAA,CACdtC,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,QAAA,CAAUA,CAAM,CAC/C,CAEA,eAAsBuC,EAAAA,CACpBzC,CAAAA,CACAE,CAAAA,CAC6B,CAC7B,OAAO,MAAMF,CAAAA,CAAO,eAAA,CAAgBE,CAAM,CAC5C,CAEO,SAASwC,EAAAA,CACdxC,CAAAA,CACAG,CAAAA,CAGI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,GACf,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUkC,EAAAA,CAAqBtC,CAAM,CAAA,CACrC,OAAA,CAAS,SAAYuC,EAAAA,CAAkBzC,CAAAA,CAAQE,CAAM,CAAA,CACrD,GAAGG,CACL,CAAC,CACH,CC7CO,SAASsC,EAAAA,CACdzC,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,cAAA,CAAgB,OAAA,CAASA,CAAM,CACpD,CAEA,eAAsB0C,EAAAA,CACpB5C,CAAAA,CACAE,CAAAA,CAC+B,CAC/B,GAAM,CAAE,MAAA,CAAA2C,CAAAA,CAAQ,GAAGC,CAAK,CAAA,CAAI5C,CAAAA,CAC5B,OAAO,MAAMF,CAAAA,CAAO,qBAAqB6C,CAAAA,CAAQC,CAAI,CACvD,CAEO,SAASC,EAAAA,CACd7C,CAAAA,CACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,oBAAS,CACd,QAAA,CAAUqC,EAAAA,CAA0BzC,CAAM,CAAA,CAC1C,OAAA,CAAS,SAAY0C,EAAAA,CAAuB5C,CAAAA,CAAQE,CAAM,CAAA,CAC1D,GAAGO,CACL,CAAC,CACH,CAWO,SAASuC,EAAAA,CACd9C,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,cAAA,CAAgB,QAAA,CAAUA,CAAM,CACrD,CAEA,eAAsB+C,EAAAA,CACpBjD,CAAAA,CACAE,CAAAA,CAC+B,CAC/B,GAAM,CAAE,MAAA,CAAA2C,CAAAA,CAAQ,GAAGC,CAAK,CAAA,CAAI5C,CAAAA,CAC5B,OAAO,MAAMF,CAAAA,CAAO,qBAAA,CAAsB6C,CAAAA,CAAQC,CAAI,CACxD,CAEO,SAASI,EAAAA,CACdhD,EACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU0C,EAAAA,CAA2B9C,CAAM,CAAA,CAC3C,OAAA,CAAS,SAAY+C,EAAAA,CAAwBjD,CAAAA,CAAQE,CAAM,CAAA,CAC3D,GAAGO,CACL,CAAC,CACH,CAYO,SAAS0C,EAAAA,CACdjD,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,eAAgB,QAAA,CAAU,QAAA,CAAUA,CAAM,CAC/D,CAEA,eAAsBkD,EAAAA,CACpBpD,CAAAA,CACAE,CAAAA,CAC+B,CAC/B,GAAM,CAAE,WAAA,CAAAqB,CAAAA,CAAa,GAAGuB,CAAK,EAAI5C,CAAAA,CACjC,OAAO,MAAMF,CAAAA,CAAO,2BAAA,CAA4BuB,CAAAA,CAAauB,CAAI,CACnE,CAEO,SAASO,EAAAA,CACdnD,CAAAA,CACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU6C,EAAAA,CAAiCjD,CAAM,CAAA,CACjD,OAAA,CAAS,SAAYkD,EAAAA,CAA8BpD,CAAAA,CAAQE,CAAM,CAAA,CACjE,GAAGO,CACL,CAAC,CACH,CAIO,IAAM6C,EAAAA,CAAuBJ,GC/H7B,SAASK,EAAAA,CACdrD,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,UAAA,CAAY,mBAAA,CAAqBA,CAAM,CAC5D,CAEA,eAAsBsD,EAAAA,CACpBxD,CAAAA,CACAE,CAAAA,CAC4C,CAC5C,OAAO,MAAMF,CAAAA,CAAO,iCAAA,CAAkCE,CAAM,CAC9D,CAEO,SAASuD,EAAAA,CACdvD,CAAAA,CACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUiD,GAAkCrD,CAAM,CAAA,CAClD,OAAA,CAAS,SAAYsD,EAAAA,CAA+BxD,CAAAA,CAAQE,CAAM,CAAA,CAClE,GAAGO,CACL,CAAC,CACH,CAMO,SAASiD,EAAAA,CACdxD,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,UAAA,CAAY,mBAAA,CAAqB,QAAA,CAAUA,CAAM,CACtE,CAEA,eAAsByD,EAAAA,CACpB3D,CAAAA,CACAE,CAAAA,CAC4C,CAC5C,OAAO,MAAMF,EAAO,uCAAA,CAAwCE,CAAM,CACpE,CAEO,SAAS0D,EAAAA,CACd1D,CAAAA,CACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,oBAAS,CACd,QAAA,CAAUoD,EAAAA,CAAwCxD,CAAM,CAAA,CACxD,OAAA,CAAS,SAAYyD,EAAAA,CAAqC3D,CAAAA,CAAQE,CAAM,CAAA,CACxE,GAAGO,CACL,CAAC,CACH,CCnEO,SAASoD,EAAAA,CAAiB3D,CAAAA,CAAwC,CACvE,OAAO,CAAC,SAAA,CAAW,UAAA,CAAYA,CAAM,CACvC,CAEA,eAAsB4D,EAAAA,CACpB9D,EACAE,CAAAA,CAC2B,CAC3B,OAAO,MAAMF,CAAAA,CAAO,WAAA,CAAYE,CAAM,CACxC,CAEO,SAAS6D,EAAAA,CACd7D,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUuD,EAAAA,CAAiB3D,CAAM,CAAA,CACjC,OAAA,CAAS,SAAY4D,EAAAA,CAAc9D,CAAAA,CAAQE,CAAM,CAAA,CACjD,OAAA,CAASA,EAAO,YAAA,CAAa,MAAA,CAAS,CAAA,CACtC,GAAGO,CACL,CAAC,CACH,CAMO,SAASuD,EAAAA,CACd9D,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,UAAA,CAAY,UAAWA,CAAM,CAClD,CAEA,eAAsB+D,EAAAA,CACpBjE,CAAAA,CACAE,CAAAA,CAC2B,CAC3B,OAAO,MAAMF,CAAAA,CAAO,kBAAA,CAAmBE,CAAM,CAC/C,CAEO,SAASgE,GACdhE,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU0D,EAAAA,CAAwB9D,CAAM,CAAA,CACxC,QAAS,SAAY+D,EAAAA,CAAqBjE,CAAAA,CAAQE,CAAM,CAAA,CACxD,OAAA,CAAS,CAAA,CAAQA,CAAAA,CAAO,WAAA,CACxB,GAAGO,CACL,CAAC,CACH,CAMO,SAAS0D,EAAAA,CACdjE,EACW,CACX,OAAO,CAAC,SAAA,CAAW,UAAA,CAAY,QAAA,CAAUA,CAAM,CACjD,CAEA,eAAsBkE,EAAAA,CACpBpE,CAAAA,CACAE,CAAAA,CAC2B,CAC3B,OAAO,MAAMF,EAAO,iBAAA,CAAkBE,CAAM,CAC9C,CAEO,SAASmE,EAAAA,CACdnE,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,oBAAS,CACd,QAAA,CAAU6D,EAAAA,CAAuBjE,CAAM,CAAA,CACvC,OAAA,CAAS,SAAYkE,EAAAA,CAAoBpE,CAAAA,CAAQE,CAAM,CAAA,CACvD,OAAA,CAAS,CAAA,CAAQA,CAAAA,CAAO,WAAA,CACxB,GAAGO,CACL,CAAC,CACH,CC5FO,SAAS6D,EAAAA,CAAepE,CAAAA,CAAuC,CACpE,OAAO,CAAC,SAAA,CAAW,QAAA,CAAUA,CAAAA,EAAU,EAAE,CAC3C,CAEA,eAAsBqE,EAAAA,CACpBvE,CAAAA,CACAE,CAAAA,CAC6B,CAC7B,OAAO,MAAMF,CAAAA,CAAO,SAAA,CAAUE,CAAM,CACtC,CAEO,SAASsE,GACdtE,CAAAA,CACAG,CAAAA,CAGI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUgE,EAAAA,CAAepE,CAAM,CAAA,CAC/B,QAAS,SAAYqE,EAAAA,CAAYvE,CAAAA,CAAQE,CAAM,CAAA,CAC/C,GAAGG,CACL,CAAC,CACH,CAMO,SAASoE,EAAAA,CAAuBC,CAAAA,CAAiC,CACtE,OAAO,CAAC,UAAW,QAAA,CAAU,UAAA,CAAYA,CAAY,CACvD,CAEA,eAAsBC,EAAAA,CACpB3E,CAAAA,CACA0E,CAAAA,CACyB,CACzB,OAAO,MAAM1E,CAAAA,CAAO,iBAAA,CAAkB0E,CAAY,CACpD,CAEO,SAASE,EAAAA,CACdF,CAAAA,CACAjE,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUmE,EAAAA,CAAuBC,CAAY,CAAA,CAC7C,OAAA,CAAS,SAAYC,EAAAA,CAAoB3E,CAAAA,CAAQ0E,CAAY,CAAA,CAC7D,GAAGjE,CACL,CAAC,CACH,CCvDO,SAASoE,EAAAA,EAAsC,CACpD,OAAO,CAAC,SAAA,CAAW,MAAA,CAAQ,cAAc,CAC3C,CAEA,eAAsBC,EAAAA,CACpB9E,CAAAA,CACmC,CACnC,OAAO,MAAMA,CAAAA,CAAO,qBACtB,CAEO,SAAS+E,EAAAA,CACdtE,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUuE,EAAAA,GACV,OAAA,CAAS,SAAYC,EAAAA,CAAsB9E,CAAM,CAAA,CACjD,GAAGS,CACL,CAAC,CACH,CAMO,SAASuE,EAAAA,EAAqC,CACnD,OAAO,CAAC,SAAA,CAAW,UAAW,UAAU,CAC1C,CAEA,eAAsBC,EAAAA,CACpBjF,CAAAA,CACkC,CAClC,OAAO,MAAMA,CAAAA,CAAO,kBAAA,EACtB,CAEO,SAASkF,EAAAA,CACdzE,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU0E,EAAAA,EAAwB,CAClC,OAAA,CAAS,SAAYC,EAAAA,CAAqBjF,CAAM,EAChD,GAAGS,CACL,CAAC,CACH,CAIO,IAAM0E,EAAAA,CAAqBJ,GCpE3B,SAASK,EAAAA,CAAelF,CAAAA,CAAsC,CACnE,OAAO,CAAC,SAAA,CAAW,QAAA,CAAUA,CAAM,CACrC,CAEA,eAAsBmF,EAAAA,CACpBrF,CAAAA,CACAE,CAAAA,CACyB,CACzB,OAAO,MAAMF,CAAAA,CAAO,MAAA,CAAOE,CAAM,CACnC,CAEO,SAASoF,EAAAA,CACdpF,CAAAA,CACAG,CAAAA,CAGI,EAAC,CACL,CACA,IAAML,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU8E,GAAelF,CAAM,CAAA,CAC/B,OAAA,CAAS,SAAYmF,EAAAA,CAAYrF,CAAAA,CAAQE,CAAM,CAAA,CAC/C,GAAGG,CACL,CAAC,CACH,CCbO,SAASkF,EAAAA,CACdrF,CAAAA,CACW,CACX,OAAO,CAAC,SAAA,CAAW,cAAA,CAAgBA,CAAAA,EAAU,EAAE,CACjD,CAEA,eAAsBsF,GACpBxF,CAAAA,CACAE,CAAAA,CAC+B,CAC/B,OAAO,MAAMF,CAAAA,CAAO,eAAA,CAAgBE,CAAM,CAC5C,CAEO,SAASuF,EAAAA,CACdvF,CAAAA,CACAO,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUiF,EAAAA,CAAqBrF,CAAM,CAAA,CACrC,OAAA,CAAS,SAAYsF,EAAAA,CAAkBxF,CAAAA,CAAQE,CAAM,EACrD,GAAGO,CACL,CAAC,CACH,CAMA,eAAsBiF,EAAAA,CACpB1F,CAAAA,CACA2B,CAAAA,CACqC,CACrC,OAAO,MAAM3B,CAAAA,CAAO,kBAAA,CAAmB2B,CAAO,CAChD,CAEO,SAASgE,EAAAA,CACdlF,CAAAA,CAOI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAO6F,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOjE,CAAAA,EACjB+D,GAAmB1F,CAAAA,CAAQ2B,CAAO,CAAA,CACpC,GAAGlB,CACL,CAAC,CACH,CCvEO,SAASoF,EAAAA,CAAc3F,CAAAA,CAAqC,CACjE,OAAO,CAAC,SAAA,CAAW,OAAA,CAASA,CAAM,CACpC,CAEA,eAAsB4F,EAAAA,CACpB9F,CAAAA,CACAE,CAAAA,CACwB,CACxB,OAAO,MAAMF,CAAAA,CAAO,QAAA,CAASE,CAAM,CACrC,CAEO,SAAS6F,EAAAA,CACd7F,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUuF,GAAc3F,CAAM,CAAA,CAC9B,OAAA,CAAS,SAAY4F,EAAAA,CAAW9F,CAAAA,CAAQE,CAAM,CAAA,CAC9C,QAAS,CAAA,EACPA,CAAAA,CAAO,SAAA,EAAaA,CAAAA,CAAO,UAAA,EAAcA,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAA,CAG3D,UAAW,GAAA,CACX,MAAA,CAAQ,GAAA,CACR,GAAGO,CACL,CAAC,CACH,CCzBA,eAAsBuF,EAAAA,CACpBhG,CAAAA,CACA2B,CAAAA,CACuB,CACvB,OAAO,MAAM3B,CAAAA,CAAO,UAAA,CAAW2B,CAAO,CACxC,CAEO,SAASsE,EAAAA,CACdxF,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,GACf,OAAO6F,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOjE,CAAAA,EAA6BqE,EAAAA,CAAWhG,CAAAA,CAAQ2B,CAAO,CAAA,CAC1E,GAAGlB,CACL,CAAC,CACH,CAMA,eAAsByF,GACpBlG,CAAAA,CACA2B,CAAAA,CACmC,CACnC,OAAO,MAAM3B,CAAAA,CAAO,sBAAA,CAAuB2B,CAAO,CACpD,CAEO,SAASwE,EAAAA,CACd1F,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAO6F,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOjE,CAAAA,EACjBuE,EAAAA,CAAuBlG,CAAAA,CAAQ2B,CAAO,CAAA,CACxC,GAAGlB,CACL,CAAC,CACH,CC1CO,SAAS2F,EAAAA,CAAclG,CAAAA,CAAqC,CACjE,OAAO,CAAC,SAAA,CAAW,OAAA,CAASA,CAAM,CACpC,CAEA,eAAsBmG,EAAAA,CACpBrG,CAAAA,CACAE,CAAAA,CACwB,CACxB,OAAO,MAAMF,CAAAA,CAAO,QAAA,CAASE,CAAM,CACrC,CAEO,SAASoG,EAAAA,CACdpG,CAAAA,CACAO,CAAAA,CAGI,GACJ,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU8F,EAAAA,CAAclG,CAAM,CAAA,CAC9B,OAAA,CAAS,SAAYmG,EAAAA,CAAWrG,CAAAA,CAAQE,CAAM,CAAA,CAC9C,OAAA,CAAS,CAAA,EACPA,CAAAA,CAAO,SAAA,EAAaA,CAAAA,CAAO,UAAA,EAAcA,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAA,CAG3D,SAAA,CAAW,GAAA,CACX,MAAA,CAAQ,GAAA,CACR,GAAGO,CACL,CAAC,CACH,CAMO,SAAS8F,EAAAA,CAAoBrG,CAAAA,CAA2C,CAC7E,OAAO,CAAC,SAAA,CAAW,OAAA,CAAS,QAAA,CAAUA,CAAAA,CAAO,SAAS,CACxD,CAEA,eAAsBsG,GACpBxG,CAAAA,CACAE,CAAAA,CAC8B,CAC9B,OAAO,MAAMF,CAAAA,CAAO,cAAA,CAAeE,CAAM,CAC3C,CAEO,SAASuG,EAAAA,CACdvG,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUiG,EAAAA,CAAoBrG,CAAM,CAAA,CACpC,OAAA,CAAS,SAAYsG,EAAAA,CAAiBxG,CAAAA,CAAQE,CAAM,EACpD,OAAA,CAAS,CAAA,CAAQA,CAAAA,CAAO,SAAA,CAExB,eAAA,CAAiBO,CAAAA,CAAQ,eAAA,EAAmB,GAAA,CAC5C,GAAGA,CACL,CAAC,CACH,CC1DO,SAASiG,EAAAA,CAAoBxG,CAAAA,CAA2C,CAC7E,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,OAAA,CAASA,CAAM,CAC9C,CAEA,eAAsByG,EAAAA,CACpB3G,EACAE,CAAAA,CAC8B,CAC9B,OAAO,MAAMF,CAAAA,CAAO,cAAA,CAAeE,CAAM,CAC3C,CAEO,SAAS0G,EAAAA,CACd1G,CAAAA,CACAO,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAUoG,EAAAA,CAAoBxG,CAAM,CAAA,CACpC,OAAA,CAAS,SAAYyG,EAAAA,CAAiB3G,CAAAA,CAAQE,CAAM,CAAA,CACpD,OAAA,CAAS,GACPA,CAAAA,CAAO,SAAA,EAAaA,CAAAA,CAAO,UAAA,EAAcA,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAA,CAG3D,SAAA,CAAW,GAAA,CACX,MAAA,CAAQ,GAAA,CACR,GAAGO,CACL,CAAC,CACH,CAMA,eAAsBoG,EAAAA,CACpB7G,CAAAA,CACA2B,CAAAA,CAC6B,CAC7B,OAAO,MAAM3B,CAAAA,CAAO,gBAAA,CAAiB2B,CAAO,CAC9C,CAEO,SAASmF,EAAAA,CACdrG,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAO6F,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAOjE,CAAAA,EACjBkF,EAAAA,CAAiB7G,CAAAA,CAAQ2B,CAAO,CAAA,CAClC,GAAGlB,CACL,CAAC,CACH,CC9DA,eAAsBsG,EAAAA,CACpB/G,CAAAA,CACAE,CAAAA,CACuC,CACvC,OAAO,MAAMF,CAAAA,CAAO,oBAAA,CAAqBE,CAAM,CACjD,CAEO,SAAS8G,EAAAA,CACdvG,CAAAA,CAOI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAO6F,sBAAAA,CAAY,CACjB,UAAA,CAAY,MAAO1F,GACjB6G,EAAAA,CAAqB/G,CAAAA,CAAQE,CAAM,CAAA,CACrC,GAAGO,CACL,CAAC,CACH,CCvBO,SAASwG,EAAAA,EAA4B,CAC1C,OAAO,CAAC,SAAA,CAAW,QAAQ,CAC7B,CAEA,eAAsBC,EAAAA,CACpBlH,CAAAA,CAC4B,CAC5B,OAAO,MAAMA,CAAAA,CAAO,SAAA,EACtB,CAEO,SAASmH,GACd1G,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU2G,EAAAA,EAAe,CACzB,OAAA,CAAS,SAAYC,GAAYlH,CAAM,CAAA,CAEvC,SAAA,CAAW,GAAA,CAAS,GAAA,CACpB,MAAA,CAAQ,IAAA,CAAU,GAAA,CAClB,GAAGS,CACL,CAAC,CACH,CAMO,SAAS2G,EAAAA,EAAwC,CACtD,OAAO,CAAC,SAAA,CAAW,QAAA,CAAU,UAAU,CACzC,CAEA,eAAsBC,EAAAA,CACpBrH,CAAAA,CACwC,CACxC,OAAO,MAAMA,CAAAA,CAAO,qBAAA,EACtB,CAEO,SAASsH,EAAAA,CACd7G,CAAAA,CAQI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,QAAA,CAAU8G,EAAAA,EAA2B,CACrC,OAAA,CAAS,SAAYC,EAAAA,CAAwBrH,CAAM,CAAA,CAEnD,SAAA,CAAW,GAAA,CAAS,GAAA,CACpB,MAAA,CAAQ,IAAA,CAAU,GAAA,CAClB,GAAGS,CACL,CAAC,CACH,CCjEO,SAAS8G,EAAAA,EAA4B,CAC1C,OAAO,CAAC,SAAA,CAAW,QAAQ,CAC7B,CAEA,eAAsBC,EAAAA,CACpBxH,CAAAA,CAC4B,CAC5B,OAAO,MAAMA,EAAO,SAAA,EACtB,CAEO,SAASyH,EAAAA,CACdhH,CAAAA,CAGI,EAAC,CACL,CACA,IAAMT,CAAAA,CAASD,CAAAA,EAAiB,CAChC,OAAOO,mBAAAA,CAAS,CACd,SAAUiH,EAAAA,EAAe,CACzB,OAAA,CAAS,SAAYC,EAAAA,CAAYxH,CAAM,CAAA,CAEvC,SAAA,CAAW,GAAA,CAAS,GAAA,CACpB,MAAA,CAAQ,IAAA,CAAU,GAAA,CAClB,GAAGS,CACL,CAAC,CACH,CCkJO,IAAMiH,EAAAA,CAAN,KAAuD,CACpD,EAAA,CAAuB,IAAA,CACd,MACA,aAAA,CACA,qBAAA,CACA,oBAAA,CACA,YAAA,CAET,MAAA,CAA6B,cAAA,CAC7B,iBAAA,CAAoB,CAAA,CACpB,gBAAA,CAAyD,IAAA,CACzD,cAAA,CAAwD,IAAA,CACxD,eAAA,CAAkB,IAAA,CAGlB,SAAA,CAA4B,CAClC,QAAS,EAAC,CACV,UAAA,CAAY,EAAC,CACb,YAAA,CAAc,EAAC,CACf,KAAA,CAAO,EAAC,CACR,KAAA,CAAO,EAAC,CACR,KAAA,CAAO,GACP,SAAA,CAAW,EAAC,CACZ,MAAA,CAAQ,EAAC,CACT,UAAA,CAAY,EAAC,CACb,YAAA,CAAc,EAChB,CAAA,CAGQ,aAAA,CAAmC,CACzC,MAAA,CAAQ,CAAE,GAAA,CAAK,KAAA,CAAO,OAAA,CAAS,IAAI,GAAM,CAAA,CACzC,MAAA,CAAQ,CAAE,GAAA,CAAK,KAAA,CAAO,OAAA,CAAS,IAAI,GAAM,CAAA,CACzC,SAAA,CAAW,CAAE,IAAK,KAAA,CAAO,OAAA,CAAS,IAAI,GAAM,CAC9C,CAAA,CAEA,WAAA,CAAYC,CAAAA,CAAwB,CAClC,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAAO,KAAA,CACpB,IAAA,CAAK,aAAA,CAAgBA,CAAAA,CAAO,eAAiB,IAAA,CAC7C,IAAA,CAAK,qBAAA,CACHA,CAAAA,CAAO,qBAAA,EAAyB,GAAA,CAClC,IAAA,CAAK,oBAAA,CACHA,CAAAA,CAAO,oBAAA,EAAwB,GAAA,CACjC,IAAA,CAAK,YAAA,CAAeA,CAAAA,CAAO,YAAA,EAAgB,GAAA,CAEvCA,EAAO,WAAA,GAAgB,KAAA,EACzB,IAAA,CAAK,OAAA,GAET,CASA,OAAA,EAAgB,CACd,GACE,EAAA,IAAA,CAAK,EAAA,GACJ,IAAA,CAAK,EAAA,CAAG,UAAA,GAAe,SAAA,CAAU,IAAA,EAChC,KAAK,EAAA,CAAG,UAAA,GAAe,SAAA,CAAU,UAAA,CAAA,CAAA,CAKrC,CAAA,IAAA,CAAK,eAAA,CAAkB,IAAA,CACvB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,CAE3B,GAAI,CACF,IAAA,CAAK,EAAA,CAAK,IAAI,UAAU,IAAA,CAAK,KAAK,CAAA,CAElC,IAAA,CAAK,EAAA,CAAG,MAAA,CAAS,IAAM,CACrB,IAAA,CAAK,iBAAA,CAAoB,CAAA,CACzB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,CAC1B,IAAA,CAAK,KAAK,SAAA,CAAW,KAAA,CAAS,CAAA,CAG9B,IAAA,CAAK,oBAAA,EAAqB,CAG1B,IAAA,CAAK,iBAAA,GACP,CAAA,CAEA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAaC,CAAAA,EAAU,CAC7B,IAAA,CAAK,cAAcA,CAAAA,CAAM,IAAI,EAC/B,CAAA,CAEA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAWA,CAAAA,EAAU,CAC3B,IAAMC,CAAAA,CAAQ,IAAI,KAAA,CAAM,iBAAiB,CAAA,CAEzC,IAAA,CAAK,KAAK,OAAA,CAASA,CAAK,EAC1B,CAAA,CAEA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAWD,CAAAA,EAAU,CAC3B,IAAA,CAAK,gBAAA,EAAiB,CACtB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,CAC7B,KAAK,IAAA,CAAK,YAAA,CAAc,CAAE,IAAA,CAAMA,CAAAA,CAAM,IAAA,CAAM,MAAA,CAAQA,CAAAA,CAAM,MAAO,CAAC,CAAA,CAG9D,IAAA,CAAK,eAAA,EAAmB,IAAA,CAAK,aAAA,EAC/B,IAAA,CAAK,oBAET,EACF,CAAA,MAASC,CAAAA,CAAO,CAKd,IAAA,CAAK,IAAA,CACH,OAAA,CACAA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAC1D,CAAA,CAEI,IAAA,CAAK,eAAA,EAAmB,IAAA,CAAK,aAAA,EAC/B,IAAA,CAAK,iBAAA,GAET,CAAA,CACF,CAKA,UAAA,EAAmB,CACjB,IAAA,CAAK,eAAA,CAAkB,KAAA,CACvB,IAAA,CAAK,kBAAiB,CAElB,IAAA,CAAK,gBAAA,GACP,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA,CAClC,IAAA,CAAK,iBAAmB,IAAA,CAAA,CAGtB,IAAA,CAAK,EAAA,GACP,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM,CACd,IAAA,CAAK,GAAK,IAAA,CAAA,CAGZ,IAAA,CAAK,SAAA,CAAU,cAAc,EAC/B,CAKA,WAAA,EAAuB,CACrB,OAAO,IAAA,CAAK,EAAA,GAAO,IAAA,EAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,GAAe,SAAA,CAAU,IAC9D,CAKA,SAAA,EAAgC,CAC9B,OAAO,IAAA,CAAK,MACd,CAOA,eAAA,CACEpH,CAAAA,CACAqH,CAAAA,CACY,CACZ,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAUrH,CAAO,CAAA,CACvC,IAAMsH,CAAAA,CAAiB,IAAA,CAAK,EAAA,CAAG,OAAA,CAASD,CAAQ,CAAA,CAChD,OAAO,IAAM,CACXC,CAAAA,EAAe,CACf,IAAA,CAAK,kBAAA,CAAmB,QAAA,CAAUtH,CAAO,EAC3C,CACF,CAGA,eAAA,CACEA,CAAAA,CACAqH,CAAAA,CACY,CACZ,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAUrH,CAAO,CAAA,CACvC,IAAMsH,CAAAA,CAAiB,IAAA,CAAK,EAAA,CAAG,OAAA,CAASD,CAAQ,EAChD,OAAO,IAAM,CACXC,CAAAA,EAAe,CACf,IAAA,CAAK,kBAAA,CAAmB,QAAA,CAAUtH,CAAO,EAC3C,CACF,CAGA,kBAAA,CACEA,CAAAA,CACAqH,CAAAA,CACY,CACZ,KAAK,gBAAA,CAAiB,WAAA,CAAarH,CAAO,CAAA,CAC1C,IAAMsH,CAAAA,CAAiB,IAAA,CAAK,EAAA,CAAG,WAAA,CAAaD,CAAQ,CAAA,CACpD,OAAO,IAAM,CACXC,CAAAA,EAAe,CACf,KAAK,kBAAA,CAAmB,WAAA,CAAatH,CAAO,EAC9C,CACF,CAGA,cAAA,CAAeuH,CAAAA,CAA4D,CACzE,OAAO,IAAA,CAAK,EAAA,CAAG,QAAA,CAAUA,CAAQ,CACnC,CASA,GACEJ,CAAAA,CACAI,CAAAA,CACY,CAEZ,OADkB,IAAA,CAAK,SAAA,CAAUJ,CAAK,CAAA,CAC5B,IAAA,CAAKI,CAAkC,CAAA,CAG1C,IAAM,CACX,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAOI,CAAQ,EAC1B,CACF,CAKA,GAAA,CACEJ,CAAAA,CACAI,CAAAA,CACM,CACN,IAAMC,CAAAA,CAAY,IAAA,CAAK,SAAA,CAAUL,CAAK,CAAA,CAChCM,CAAAA,CAAQD,CAAAA,CAAU,OAAA,CAAQD,CAAkC,CAAA,CAC9DE,CAAAA,GAAU,EAAA,EACZD,CAAAA,CAAU,MAAA,CAAOC,CAAAA,CAAO,CAAC,EAE7B,CAKA,kBAAA,CAAmBN,CAAAA,CAA2B,CAC5C,GAAIA,CAAAA,CACD,IAAA,CAAK,SAAA,CAAUA,CAAK,CAAA,CAAgB,MAAA,CAAS,CAAA,CAAA,KAE9C,IAAA,IAAWO,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CACzC,IAAA,CAAK,SAAA,CAAUA,CAAkB,CAAA,CAAgB,MAAA,CAAS,EAGjE,CAMQ,gBAAA,CACNC,CAAAA,CACA3H,CAAAA,CACM,CACN,IAAM4H,CAAAA,CAAe,IAAA,CAAK,aAAA,CAAcD,CAAO,CAAA,CAE/C,GAAI3H,CAAAA,CAAQ,GAAA,CACV4H,CAAAA,CAAa,GAAA,CAAM,IAAA,CACnBA,EAAa,OAAA,CAAQ,KAAA,EAAM,CAAA,KAAA,GAClB5H,CAAAA,CAAQ,OAAA,EAAWA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,CAAG,CACxD4H,CAAAA,CAAa,GAAA,CAAM,KAAA,CACnB,IAAA,IAAWxF,CAAAA,IAAUpC,CAAAA,CAAQ,QAC3B4H,CAAAA,CAAa,OAAA,CAAQ,GAAA,CAAIxF,CAAM,EAEnC,CAEA,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAauF,CAAAA,CAAS3H,CAAO,EACrD,CAEQ,kBAAA,CACN2H,CAAAA,CACA3H,CAAAA,CACM,CACN,IAAM4H,CAAAA,CAAe,IAAA,CAAK,aAAA,CAAcD,CAAO,CAAA,CAE/C,GAAI3H,CAAAA,CAAQ,GAAA,CACV4H,CAAAA,CAAa,GAAA,CAAM,KAAA,CACnBA,CAAAA,CAAa,OAAA,CAAQ,KAAA,EAAM,CAAA,KAAA,GAClB5H,EAAQ,OAAA,EAAWA,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAA,CACrD,IAAA,IAAWoC,CAAAA,IAAUpC,CAAAA,CAAQ,QAC3B4H,CAAAA,CAAa,OAAA,CAAQ,MAAA,CAAOxF,CAAM,CAAA,CAItC,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAeuF,EAAS3H,CAAO,EACvD,CAEQ,SAAA,CAAU6H,CAAAA,CAAkC,CAC9C,IAAA,CAAK,MAAA,GAAWA,CAAAA,GAClB,IAAA,CAAK,MAAA,CAASA,CAAAA,CACd,IAAA,CAAK,IAAA,CAAK,QAAA,CAAUA,CAAM,GAE9B,CAEQ,IAAA,CACNV,CAAAA,CACAW,CAAAA,CACM,CACN,IAAMN,CAAAA,CAAY,IAAA,CAAK,SAAA,CAAUL,CAAK,CAAA,CACtC,IAAA,IAAWY,CAAAA,IAAYP,CAAAA,CACrB,GAAI,CACFO,EAASD,CAAI,EACf,CAAA,KAAgB,CAKhB,CAEJ,CAEQ,IAAA,CAAKE,CAAAA,CAAmC,CAC9C,GAAI,CAAC,IAAA,CAAK,EAAA,EAAM,IAAA,CAAK,EAAA,CAAG,UAAA,GAAe,UAAU,IAAA,CAI/C,OAAO,MAAA,CAGT,GAAI,CACF,OAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,CAAO,CAAC,CAAA,CAC7B,CAAA,CACT,CAAA,KAAgB,CAEd,OAAO,MACT,CACF,CAEQ,gBAAA,CACNC,CAAAA,CACAN,CAAAA,CACA3H,CAAAA,CACM,CACN,IAAA,CAAK,IAAA,CAAK,CACR,IAAA,CAAAiI,CAAAA,CACA,OAAA,CAAAN,CAAAA,CACA,GAAA,CAAK3H,EAAQ,GAAA,CACb,OAAA,CAASA,CAAAA,CAAQ,OACnB,CAAC,EACH,CAEQ,aAAA,CAAc8H,CAAAA,CAAoB,CACxC,GAAI,CACF,IAAME,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAMF,CAAI,CAAA,CAE/B,OAAQE,CAAAA,CAAQ,IAAA,EACd,KAAK,QAAA,CACH,IAAA,CAAK,IAAA,CAAK,OAAA,CAASA,CAAwB,CAAA,CAC3C,MACF,KAAK,OAAA,CACH,IAAA,CAAK,KAAK,OAAA,CAASA,CAAwB,CAAA,CAC3C,MACF,KAAK,WAAA,CACH,IAAA,CAAK,IAAA,CAAK,WAAA,CAAaA,CAA4B,CAAA,CACnD,MACF,KAAK,QAAA,CAEH,MACF,KAAK,aACH,IAAA,CAAK,IAAA,CAAK,YAAA,CAAc,CACtB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,GAAA,CAAKA,CAAAA,CAAQ,GAAA,CACb,OAAA,CAASA,CAAAA,CAAQ,OACnB,CAAC,CAAA,CACD,MACF,KAAK,cAAA,CACH,IAAA,CAAK,IAAA,CAAK,cAAA,CAAgB,CACxB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,GAAA,CAAKA,CAAAA,CAAQ,GAAA,CACb,OAAA,CAASA,CAAAA,CAAQ,OACnB,CAAC,CAAA,CACD,MACF,KAAK,MAAA,CAEH,MACF,KAAK,OAAA,CAKH,IAAA,CAAK,IAAA,CAAK,OAAA,CAAS,IAAI,KAAA,CAAMA,CAAAA,CAAQ,OAAO,CAAC,CAAA,CAC7C,MACF,QAEE,GAAI,SAAA,GAAaA,CAAAA,CAAS,CACxB,IAAME,CAAAA,CAAUF,CAAAA,CAChB,OAAQE,CAAAA,CAAQ,OAAA,EACd,KAAK,QAAA,CACH,IAAA,CAAK,IAAA,CAAK,OAAA,CAASA,CAAwB,EAC3C,MACF,KAAK,QAAA,CACH,IAAA,CAAK,IAAA,CAAK,OAAA,CAASA,CAAwB,CAAA,CAC3C,MACF,KAAK,WAAA,CACH,IAAA,CAAK,IAAA,CAAK,WAAA,CAAaA,CAA4B,CAAA,CACnD,KACJ,CACF,CACJ,CACF,CAAA,KAAgB,CAEhB,CACF,CAEQ,iBAAA,EAA0B,CAChC,GAAI,IAAA,CAAK,gBAAA,CACP,OAGF,IAAMC,CAAAA,CAAQ,IAAA,CAAK,IACjB,IAAA,CAAK,qBAAA,CAAwB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,iBAAiB,CAAA,CAC/D,IAAA,CAAK,oBACP,CAAA,CAEA,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,CAC7B,IAAA,CAAK,KAAK,cAAA,CAAgB,CAAE,OAAA,CAAS,IAAA,CAAK,iBAAA,CAAoB,CAAA,CAAG,KAAA,CAAAA,CAAM,CAAC,CAAA,CAExE,IAAA,CAAK,gBAAA,CAAmB,UAAA,CAAW,IAAM,CACvC,IAAA,CAAK,gBAAA,CAAmB,KACxB,IAAA,CAAK,iBAAA,EAAA,CACL,IAAA,CAAK,OAAA,GACP,CAAA,CAAGA,CAAK,EACV,CAEQ,oBAAA,EAA6B,CACnC,IAAA,IAAWR,CAAAA,IAAW,CAAC,QAAA,CAAU,QAAA,CAAU,WAAW,CAAA,CAAkB,CACtE,IAAMC,CAAAA,CAAe,IAAA,CAAK,aAAA,CAAcD,CAAO,CAAA,CAE3CC,CAAAA,CAAa,GAAA,CACf,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAaD,CAAAA,CAAS,CAAE,GAAA,CAAK,IAAK,CAAC,CAAA,CAChDC,CAAAA,CAAa,OAAA,CAAQ,IAAA,CAAO,CAAA,EACrC,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAaD,CAAAA,CAAS,CAC1C,OAAA,CAAS,KAAA,CAAM,IAAA,CAAKC,CAAAA,CAAa,OAAO,CAC1C,CAAC,EAEL,CACF,CAEQ,iBAAA,EAA0B,CAChC,IAAA,CAAK,gBAAA,EAAiB,CAEtB,IAAA,CAAK,cAAA,CAAiB,WAAA,CAAY,IAAM,CACtC,IAAA,CAAK,IAAA,CAAK,CAAE,IAAA,CAAM,MAAO,CAAC,EAC5B,CAAA,CAAG,IAAA,CAAK,YAAY,EACtB,CAEQ,gBAAA,EAAyB,CAC3B,IAAA,CAAK,cAAA,GACP,aAAA,CAAc,IAAA,CAAK,cAAc,EACjC,IAAA,CAAK,cAAA,CAAiB,IAAA,EAE1B,CACF,EASO,SAASQ,EAAAA,CACdlB,CAAAA,CACsB,CACtB,OAAO,IAAID,EAAAA,CAAqBC,CAAM,CACxC,CC5lBO,SAASmB,GAAgB,CAC9B,UAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,OAAA,CAAAC,CAAAA,CAAU,IACZ,CAAA,CAAiD,CAC/C,GAAM,CAACZ,EAAQa,CAAS,CAAA,CAAIC,cAAAA,CAA6B,cAAc,CAAA,CACjE,CAACvB,CAAAA,CAAOwB,CAAQ,CAAA,CAAID,cAAAA,CAAuB,IAAI,CAAA,CAC/CE,CAAAA,CAAYC,YAAAA,CAAoC,IAAI,CAAA,CAG1DC,gBAAU,IAAM,CACd,GAAI,CAACN,CAAAA,CAAS,CACRI,CAAAA,CAAU,OAAA,GACZA,CAAAA,CAAU,OAAA,CAAQ,UAAA,EAAW,CAC7BA,CAAAA,CAAU,OAAA,CAAU,IAAA,CAAA,CAEtBH,CAAAA,CAAU,cAAc,CAAA,CACxB,MACF,CAQA,IAAMnJ,CAAAA,CAAS6I,EAAAA,CANgB,CAC7B,KAAA,CAAOE,CAAAA,CACP,WAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CACF,CAEgD,CAAA,CAChDK,CAAAA,CAAU,QAAUtJ,CAAAA,CAGpB,IAAMyJ,CAAAA,CAAczJ,CAAAA,CAAO,EAAA,CAAG,QAAA,CAAW0J,CAAAA,EAAc,CACrDP,CAAAA,CAAUO,CAAS,EACrB,CAAC,CAAA,CAGKC,CAAAA,CAAa3J,CAAAA,CAAO,EAAA,CAAG,QAAU4J,CAAAA,EAAQ,CAC7CP,CAAAA,CAASO,CAAG,EACd,CAAC,CAAA,CAGKC,CAAAA,CAAe7J,CAAAA,CAAO,EAAA,CAAG,SAAA,CAAW,IAAM,CAC9CqJ,CAAAA,CAAS,IAAI,EACf,CAAC,CAAA,CAGD,OAAO,IAAM,CACXI,CAAAA,EAAY,CACZE,CAAAA,EAAW,CACXE,CAAAA,EAAa,CACb7J,CAAAA,CAAO,UAAA,EAAW,CAClBsJ,CAAAA,CAAU,OAAA,CAAU,KACtB,CACF,CAAA,CAAG,CAACP,CAAAA,CAAYC,CAAAA,CAAaC,CAAAA,CAAeC,CAAO,CAAC,CAAA,CAEpD,IAAMY,CAAAA,CAAUC,iBAAAA,CAAY,IAAM,CAChCT,CAAAA,CAAU,OAAA,EAAS,OAAA,GACrB,CAAA,CAAG,EAAE,CAAA,CAECU,CAAAA,CAAaD,iBAAAA,CAAY,IAAM,CACnCT,CAAAA,CAAU,OAAA,EAAS,UAAA,GACrB,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CACL,MAAA,CAAQA,CAAAA,CAAU,OAAA,CAClB,MAAA,CAAAhB,CAAAA,CACA,WAAA,CAAaA,CAAAA,GAAW,YACxB,OAAA,CAAAwB,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,KAAA,CAAAnC,CACF,CACF,CCxFO,SAASoC,EAAAA,EAAiC,CAC/C,IAAMpK,CAAAA,CAAUC,gBAAAA,CAAWJ,EAAc,CAAA,CAEzC,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAGrE,GAAM,CAAE,QAAA,CAAAqK,CAAS,CAAA,CAAIrK,CAAAA,CAEf,CAACsK,CAAAA,CAAUC,CAAW,CAAA,CAAIhB,eAC9Bc,CAAAA,EAAU,SAAA,EAAU,EAAK,cAC3B,CAAA,CAEA,OAAAV,eAAAA,CAAU,IAAM,CACd,GAAI,CAACU,CAAAA,CAAU,CACbE,CAAAA,CAAY,cAAc,CAAA,CAC1B,MACF,CAGA,OAAAA,CAAAA,CAAYF,CAAAA,CAAS,SAAA,EAAW,CAAA,CAGZA,CAAAA,CAAS,cAAA,CAAeE,CAAW,CAEzD,CAAA,CAAG,CAACF,CAAQ,CAAC,CAAA,CAEN,CACL,QAAA,CAAAA,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,aAAA,CAAeA,CAAAA,GAAa,WAC9B,CACF,CCfO,SAASE,EAAAA,CAAsB,CACpC,MAAA,CAAArK,CAAAA,CACA,GAAA,CAAAsK,CAAAA,CAAM,KAAA,CACN,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,OAAA,CAAArB,CAAAA,CAAU,IAAA,CACV,QAAA,CAAApB,CACF,CAAA,CAA6D,CAC3D,GAAM,CAAC0C,CAAAA,CAAQC,CAAS,CAAA,CAAIrB,cAAAA,CAAiC,IAAI,GAAK,CAAA,CAChE,CAACsB,CAAAA,CAAcC,CAAe,CAAA,CAAIvB,cAAAA,CAAS,KAAK,CAAA,CAChDwB,CAAAA,CAAcrB,YAAAA,CAAOzB,CAAQ,CAAA,CAGnC,OAAA0B,eAAAA,CAAU,IAAM,CACdoB,CAAAA,CAAY,OAAA,CAAU9C,EACxB,CAAA,CAAG,CAACA,CAAQ,CAAC,EAGb0B,eAAAA,CAAU,IAAM,CACd,GAAI,CAACxJ,CAAAA,EAAU,CAACkJ,CAAAA,CAAS,CACvByB,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAGA,GAAI,CAACL,GAAOC,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAC7B,OAGF,IAAM9J,CAAAA,CAAU6J,CAAAA,CAAM,CAAE,GAAA,CAAK,IAAK,CAAA,CAAI,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAE1CM,CAAAA,CAAc7K,EAAO,eAAA,CAAgBS,CAAAA,CAAUqK,CAAAA,EAAW,CAC9DL,CAAAA,CAAWM,CAAAA,EAAS,CAClB,IAAMC,CAAAA,CAAO,IAAI,GAAA,CAAID,CAAI,CAAA,CACzB,OAAAC,CAAAA,CAAK,GAAA,CAAIF,EAAO,aAAA,CAAe,CAC7B,MAAA,CAAQA,CAAAA,CAAO,OAAA,CACf,MAAA,CAAQA,CAAAA,CAAO,OAAA,CACf,KAAA,CAAOA,CAAAA,CAAO,MAAA,CACd,KAAA,CAAOA,CAAAA,CAAO,MAAA,CACd,SAAA,CAAW,IAAA,CAAK,KAClB,CAAC,CAAA,CACME,CACT,CAAC,CAAA,CAEDJ,CAAAA,CAAY,OAAA,GAAUE,CAAM,EAC9B,CAAC,CAAA,CAED,OAAAH,CAAAA,CAAgB,IAAI,CAAA,CAEb,IAAM,CACXE,CAAAA,EAAY,CACZF,CAAAA,CAAgB,KAAK,EACvB,CACF,CAAA,CAAG,CAAC3K,CAAAA,CAAQsK,CAAAA,CAAKC,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAGrB,CAAO,CAAC,CAAA,CAErC,CACL,MAAA,CAAAsB,CAAAA,CACA,YAAA,CAAAE,CACF,CACF,CCnDO,SAASO,EAAAA,CAAsB,CACpC,MAAA,CAAAjL,CAAAA,CACA,GAAA,CAAAsK,CAAAA,CAAM,MACN,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,OAAA,CAAArB,CAAAA,CAAU,IAAA,CACV,UAAA,CAAAgC,EAAa,GAAA,CACb,QAAA,CAAApD,CACF,CAAA,CAA6D,CAC3D,GAAM,CAACqD,CAAAA,CAAQC,CAAS,CAAA,CAAIhC,cAAAA,CAAsB,EAAE,CAAA,CAC9C,CAACsB,CAAAA,CAAcC,CAAe,CAAA,CAAIvB,cAAAA,CAAS,KAAK,CAAA,CAChDwB,CAAAA,CAAcrB,YAAAA,CAAOzB,CAAQ,CAAA,CAGnC0B,eAAAA,CAAU,IAAM,CACdoB,CAAAA,CAAY,OAAA,CAAU9C,EACxB,CAAA,CAAG,CAACA,CAAQ,CAAC,CAAA,CAGb0B,eAAAA,CAAU,IAAM,CACd,GAAI,CAACxJ,CAAAA,EAAU,CAACkJ,CAAAA,CAAS,CACvByB,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAGA,GAAI,CAACL,CAAAA,EAAOC,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAC7B,OAGF,IAAM9J,CAAAA,CAAU6J,CAAAA,CAAM,CAAE,GAAA,CAAK,IAAK,CAAA,CAAI,CAAE,OAAA,CAAAC,CAAQ,EAE1CM,CAAAA,CAAc7K,CAAAA,CAAO,eAAA,CAAgBS,CAAAA,CAAUqK,CAAAA,EAAW,CAC9D,IAAMO,CAAAA,CAAmB,CACvB,OAAA,CAASP,CAAAA,CAAO,QAAA,CAChB,YAAA,CAAcA,CAAAA,CAAO,aAAA,CACrB,KAAA,CAAOA,EAAO,KAAA,CACd,KAAA,CAAOA,CAAAA,CAAO,KAAA,CACd,QAAA,CAAUA,CAAAA,CAAO,SAAA,CACjB,OAAA,CAASA,CAAAA,CAAO,QAAA,CAChB,SAAA,CAAWA,CAAAA,CAAO,UAAA,CAClB,WAAA,CAAaA,CAAAA,CAAO,YACtB,EAEAM,CAAAA,CAAWL,CAAAA,EAAS,CAClB,IAAMC,CAAAA,CAAO,CAACK,CAAAA,CAAO,GAAGN,CAAI,CAAA,CAC5B,OAAIC,CAAAA,CAAK,MAAA,CAASE,CAAAA,CACTF,CAAAA,CAAK,KAAA,CAAM,EAAGE,CAAU,CAAA,CAE1BF,CACT,CAAC,CAAA,CAEDJ,CAAAA,CAAY,OAAA,GAAUE,CAAM,EAC9B,CAAC,CAAA,CAED,OAAAH,CAAAA,CAAgB,IAAI,CAAA,CAEb,IAAM,CACXE,CAAAA,EAAY,CACZF,CAAAA,CAAgB,KAAK,EACvB,CACF,CAAA,CAAG,CAAC3K,CAAAA,CAAQsK,CAAAA,CAAKC,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAGrB,CAAAA,CAASgC,CAAU,CAAC,CAAA,CAExD,IAAMI,CAAAA,CAAevB,iBAAAA,CAAY,IAAM,CACrCqB,CAAAA,CAAU,EAAE,EACd,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CACL,OAAAD,CAAAA,CACA,YAAA,CAAAT,CAAAA,CACA,YAAA,CAAAY,CACF,CACF,CCxEO,SAASC,EAAAA,CAAyB,CACvC,MAAA,CAAAvL,CAAAA,CACA,GAAA,CAAAsK,CAAAA,CAAM,KAAA,CACN,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,OAAA,CAAArB,CAAAA,CAAU,IAAA,CACV,QAAA,CAAApB,CACF,CAAA,CAAmE,CACjE,GAAM,CAAC0D,CAAAA,CAAYC,CAAa,CAAA,CAAIrC,cAAAA,CAClC,IAAI,GACN,CAAA,CACM,CAACsB,CAAAA,CAAcC,CAAe,CAAA,CAAIvB,cAAAA,CAAS,KAAK,CAAA,CAChDwB,CAAAA,CAAcrB,YAAAA,CAAOzB,CAAQ,CAAA,CAGnC0B,eAAAA,CAAU,IAAM,CACdoB,CAAAA,CAAY,OAAA,CAAU9C,EACxB,CAAA,CAAG,CAACA,CAAQ,CAAC,CAAA,CAGb0B,gBAAU,IAAM,CACd,GAAI,CAACxJ,CAAAA,EAAU,CAACkJ,CAAAA,CAAS,CACvByB,CAAAA,CAAgB,KAAK,CAAA,CACrB,MACF,CAGA,GAAI,CAACL,CAAAA,EAAOC,EAAQ,MAAA,GAAW,CAAA,CAC7B,OAGF,IAAM9J,CAAAA,CAAU6J,CAAAA,CAAM,CAAE,GAAA,CAAK,IAAK,CAAA,CAAI,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAE1CM,CAAAA,CAAc7K,CAAAA,CAAO,kBAAA,CAAmBS,EAAUqK,CAAAA,EAAW,CACjEW,CAAAA,CAAeV,CAAAA,EAAS,CACtB,IAAMC,CAAAA,CAAO,IAAI,GAAA,CAAID,CAAI,CAAA,CACzB,OAAAC,CAAAA,CAAK,GAAA,CAAIF,CAAAA,CAAO,aAAA,CAAe,CAC7B,OAAA,CAASA,CAAAA,CAAO,QAAA,CAChB,OAAA,CAASA,CAAAA,CAAO,QAAA,CAChB,MAAA,CAAQA,CAAAA,CAAO,OAAA,CACf,MAAA,CAAQA,CAAAA,CAAO,OAAA,CACf,SAAA,CAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CACME,CACT,CAAC,CAAA,CAEDJ,CAAAA,CAAY,OAAA,GAAUE,CAAM,EAC9B,CAAC,CAAA,CAED,OAAAH,CAAAA,CAAgB,IAAI,CAAA,CAEb,IAAM,CACXE,GAAY,CACZF,CAAAA,CAAgB,KAAK,EACvB,CACF,CAAA,CAAG,CAAC3K,CAAAA,CAAQsK,CAAAA,CAAKC,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAGrB,CAAO,CAAC,CAAA,CAE5C,IAAMwC,CAAAA,CAAe3B,iBAAAA,CAClBlH,CAAAA,EAAmB2I,CAAAA,CAAW,GAAA,CAAI3I,CAAM,CAAA,CACzC,CAAC2I,CAAU,CACb,CAAA,CAEA,OAAO,CACL,UAAA,CAAAA,CAAAA,CACA,YAAA,CAAAd,EACA,YAAA,CAAAgB,CACF,CACF,CC3GA,IAAMC,EAAAA,CAA2B,CAC/B,UAAA,CACA,QAAA,CACA,SAAA,CACA,QAAA,CACA,SAAA,CACA,WAAA,CACA,UAAA,CACA,WAAA,CACA,YAAA,CACA,gBACF,CAAA,CA+CO,SAASC,EAAAA,EAAiD,CAC/D,GAAM,CACJ,IAAA,CAAMC,CAAAA,CACN,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAlE,CACF,CAAA,CAAI9C,EAAAA,GAeJ,OAAO,CAAE,IAAA,CAbIiH,aAAAA,CAAyB,IAAM,CAC1C,GAAI,CAACH,CAAAA,EAAU,gBAAA,CAAkB,OAAO,EAAC,CAEzC,IAAMI,CAAAA,CAAcC,CAAAA,EAAgB,CAClC,IAAMC,CAAAA,CAAMR,EAAAA,CAAe,OAAA,CAAQO,CAAG,CAAA,CACtC,OAAOC,CAAAA,GAAQ,EAAA,CAAKR,EAAAA,CAAe,MAAA,CAASQ,CAC9C,CAAA,CAEA,OAAO,MAAA,CAAO,OAAA,CAAQN,EAAS,gBAAgB,CAAA,CAC5C,GAAA,CAAI,CAAC,CAACO,CAAAA,CAAUC,CAAI,CAAA,IAAO,CAAE,QAAA,CAAAD,CAAAA,CAAU,IAAA,CAAAC,CAAK,CAAA,CAAE,CAAA,CAC9C,IAAA,CAAK,CAACC,CAAAA,CAAGC,CAAAA,GAAMN,CAAAA,CAAWK,CAAAA,CAAE,QAAQ,CAAA,CAAIL,CAAAA,CAAWM,CAAAA,CAAE,QAAQ,CAAC,CACnE,CAAA,CAAG,CAACV,CAAQ,CAAC,CAAA,CAEE,UAAAC,CAAAA,CAAW,OAAA,CAAAC,CAAAA,CAAS,KAAA,CAAOlE,CAAAA,EAAS,IAAK,CAC1D,CCzDO,SAAS2E,EAAAA,CAAa,CAC3B,WAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,CAAA,CAAAC,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAEvBC,CAAAA,CAAkBnD,iBAAAA,CAAY,IAAM,CACxC8C,CAAAA,CAAiB,IAAI,EACvB,CAAA,CAAG,CAACA,CAAgB,CAAC,EAErB,OACEM,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,KAAAA,CAAG,4BAAA,CAA8BL,CAAS,CAAA,CAExD,UAAAM,cAAAA,CAACC,4BAAAA,CAAA,CACC,QAAA,CAAAH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CAEb,UAAAE,cAAAA,CAACE,EAAAA,CAAA,CACC,KAAA,CAAOP,CAAAA,CAAE,6BAA6B,CAAA,CACtC,UAAA,CAAYN,CAAAA,GAAqB,IAAA,CACjC,OAAA,CAASQ,CAAAA,CACX,CAAA,CAGCT,CAAAA,CAAW,GAAA,CAAKP,CAAAA,EACfmB,eAACE,EAAAA,CAAA,CAEC,KAAA,CAAOrB,CAAAA,CAAI,QAAA,CACX,UAAA,CAAYQ,CAAAA,GAAqBR,CAAAA,CAAI,QAAA,CACrC,OAAA,CAAS,IAAMW,CAAAA,CAAiBX,CAAAA,CAAI,QAAQ,CAAA,CAAA,CAHvCA,CAAAA,CAAI,QAIX,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CAGCQ,CAAAA,EAAoBE,CAAAA,CAAW,MAAA,CAAS,CAAA,EACvCS,cAAAA,CAACC,4BAAAA,CAAA,CACC,QAAA,CAAAH,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CAEb,UAAAE,cAAAA,CAACE,EAAAA,CAAA,CACC,KAAA,CAAOP,CAAAA,CAAE,+BAA+B,CAAA,CACxC,UAAA,CAAYL,CAAAA,GAAgB,IAAA,CAC5B,OAAA,CAAS,IAAMG,CAAAA,CAAY,IAAI,CAAA,CAC/B,OAAA,CAAQ,YACV,CAAA,CAECF,CAAAA,CAAW,GAAA,CAAKY,CAAAA,EACfH,cAAAA,CAACE,EAAAA,CAAA,CAEC,KAAA,CAAOC,CAAAA,CACP,UAAA,CAAYb,CAAAA,GAAgBa,CAAAA,CAC5B,OAAA,CAAS,IAAMV,CAAAA,CAAYU,CAAG,EAC9B,OAAA,CAAQ,WAAA,CAAA,CAJHA,CAKP,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAaA,SAASD,EAAAA,CAAK,CAAE,KAAA,CAAAE,CAAAA,CAAO,UAAA,CAAAC,CAAAA,CAAY,QAAAC,CAAAA,CAAS,OAAA,CAAAC,CAAAA,CAAU,SAAU,CAAA,CAAc,CAC5E,OACEP,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASM,CAAAA,CACT,SAAA,CAAWP,KAAAA,CACT,qGAAA,CACA,2BACAQ,CAAAA,GAAY,SAAA,CACRF,CAAAA,CACE,iDAAA,CACA,8FAAA,CACFA,CAAAA,CACE,8CAAA,CACA,gGACR,CAAA,CAEC,QAAA,CAAAD,CAAAA,CACH,CAEJ,CAMO,SAASI,EAAAA,CAAmB,CAAE,MAAAC,CAAAA,CAAQ,CAAE,CAAA,CAAuB,CACpE,OACET,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQS,CAAM,CAAC,CAAA,CAAE,IAAI,CAACC,CAAAA,CAAGC,CAAAA,GACrCX,cAAAA,CAACY,WAAAA,CAAA,CAEC,SAAA,CAAU,2BAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAG,EAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAI,EAAE,CAAA,EAAA,CAAK,CAAA,CAAA,CAF1CD,CAGP,CACD,CAAA,CACH,CAEJ,CCnHO,SAASE,EAAAA,CAAiB,CAC/B,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAApB,CACF,CAAA,CAA0B,CACxB,GAAM,CAAE,IAAA,CAAMN,CAAAA,CAAY,SAAA,CAAAX,CAAU,CAAA,CAAIF,EAAAA,EAAoB,CAEtD,CAACc,CAAAA,CAAkB0B,CAAmB,CAAA,CAAIhF,cAAAA,CAAwB,IAAI,CAAA,CACtE,CAACuD,CAAAA,CAAa0B,CAAc,CAAA,CAAIjF,cAAAA,CAAwB,IAAI,CAAA,CAI5DkF,CAAAA,CAAuBvE,iBAAAA,CAC1BqC,CAAAA,EAA4B,CAI3B,GAHAgC,CAAAA,CAAoBhC,CAAQ,CAAA,CAC5BiC,EAAe,IAAI,CAAA,CAEf,CAACjC,CAAAA,CAEH+B,CAAAA,GAAW,CAAE,QAAA,CAAU,IAAA,CAAM,IAAA,CAAM,IAAK,CAAC,CAAA,CAAA,KACpC,CAEL,IAAMjC,CAAAA,CAAMO,CAAAA,CAAW,KAAM8B,CAAAA,EAAMA,CAAAA,CAAE,QAAA,GAAanC,CAAQ,CAAA,CAC1D+B,CAAAA,GAAW,CAAE,QAAA,CAAA/B,CAAAA,CAAU,IAAA,CAAMF,CAAAA,EAAK,IAAA,EAAQ,IAAK,CAAC,EAClD,CACF,EACA,CAACO,CAAAA,CAAY0B,CAAQ,CACvB,CAAA,CAEMK,CAAAA,CAAkBzE,iBAAAA,CACrByD,CAAAA,EAAuB,CAGtB,GAFAa,CAAAA,CAAeb,CAAG,CAAA,CAEbA,CAAAA,CAKHW,CAAAA,GAAW,CAAE,QAAA,CAAUzB,EAAkB,IAAA,CAAM,CAACc,CAAG,CAAE,CAAC,CAAA,CAAA,KAL9C,CAER,IAAMtB,CAAAA,CAAMO,CAAAA,CAAW,IAAA,CAAM8B,CAAAA,EAAMA,CAAAA,CAAE,QAAA,GAAa7B,CAAgB,CAAA,CAClEyB,IAAW,CAAE,QAAA,CAAUzB,CAAAA,CAAkB,IAAA,CAAMR,CAAAA,EAAK,IAAA,EAAQ,IAAK,CAAC,EACpE,CAGF,CAAA,CACA,CAACO,CAAAA,CAAYC,CAAAA,CAAkByB,CAAQ,CACzC,EAIA,GAAIrC,CAAAA,CACF,OAAOuB,cAAAA,CAACQ,EAAAA,CAAA,EAAmB,CAAA,CAI7B,IAAMjB,CAAAA,CACJH,CAAAA,CAAW,IAAA,CAAM8B,CAAAA,EAAMA,CAAAA,CAAE,QAAA,GAAa7B,CAAgB,CAAA,EAAG,MAAQ,EAAC,CAEpE,OACEW,cAAAA,CAACb,EAAAA,CAAA,CACC,UAAA,CAAYC,CAAAA,CACZ,gBAAA,CAAkBC,CAAAA,CAClB,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYC,CAAAA,CACZ,gBAAA,CAAkB0B,CAAAA,CAClB,YAAaE,CAAAA,CACb,SAAA,CAAWzB,CAAAA,CACb,CAEJ,CC9FO,IAAM0B,EAAAA,CAAoB,EAAA,CAGpBC,EAAAA,CAA4B,CAAA,CAK5BC,EAAAA,CAAoB,CAE/B,UAAA,CAAY,CAAA,CAEZ,QAAA,CAAU,EAAA,CAEV,QAAS,IACX,CAAA,CAQaC,CAAAA,CAAa,CAExB,OAAA,CAAS,IAAA,CAET,QAAA,CAAU,IAAA,CAEV,SAAA,CAAW,IAAA,CAEX,GAAA,CAAK,KACP,CAAA,CAKaC,EAAAA,CAAsBD,CAAAA,CAAW,GAAA,CAGjCE,GACX,CACE,CAACF,CAAAA,CAAW,OAAO,EAAGD,EAAAA,CAAkB,UAAA,CACxC,CAACC,CAAAA,CAAW,QAAQ,EAAGD,EAAAA,CAAkB,QAAA,CACzC,CAACC,CAAAA,CAAW,SAAS,EAAGD,EAAAA,CAAkB,QAAA,CAC1C,CAACC,CAAAA,CAAW,GAAG,EAAGD,EAAAA,CAAkB,OACtC,CAAA,CAGWI,EAAAA,CAA8D,CACzE,CAACH,CAAAA,CAAW,OAAO,EAAG,GAAA,CACtB,CAACA,CAAAA,CAAW,QAAQ,EAAG,IAAA,CACvB,CAACA,CAAAA,CAAW,SAAS,EAAG,KAAA,CACxB,CAACA,CAAAA,CAAW,GAAG,EAAG,IAAA,CAAU,EAC9B,CAAA,CAGaI,GAA8D,CACzE,CAACJ,CAAAA,CAAW,OAAO,EAAG,IAAA,CAAU,EAAA,CAChC,CAACA,CAAAA,CAAW,QAAQ,EAAG,KAAA,CAAc,EAAA,CACrC,CAACA,CAAAA,CAAW,SAAS,EAAG,GAAA,CAAU,EAAA,CAAK,EAAA,CACvC,CAACA,CAAAA,CAAW,GAAG,EAAG,IACpB,CAAA,CAKaK,EAAAA,CAAqB,CAAA,CAGrBC,EAAAA,CAAmB,CAAA,CAGnBC,EAAAA,CAAkB,CAAA,CAGlBC,EAAAA,CAAkB,GAKlBC,EAAAA,CAAuB,CAClC,QAAA,CAAU,IAAA,CACV,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,IAAA,CACT,QAAA,CAAU,IAAA,CACV,GAAA,CAAK,KACP,CAAA,CAOaC,EAAAA,CAAiCD,EAAAA,CAAqB,QAAA,CAGtDE,GAGT,CACF,CAACF,EAAAA,CAAqB,QAAQ,EAAG,EAAA,CACjC,CAACA,EAAAA,CAAqB,SAAS,EAAG,EAAA,CAClC,CAACA,EAAAA,CAAqB,OAAO,EAAG,GAAA,CAChC,CAACA,EAAAA,CAAqB,QAAQ,EAAG,IAAA,CACjC,CAACA,EAAAA,CAAqB,GAAG,EAAG,IAC9B,ECxCO,SAASG,EAAAA,CAAUtP,EAA0B,EAAC,CAAoB,CAGvE,GAAM,CAAE,QAAA,CAAAkM,CAAAA,CAAU,IAAA,CAAAC,CAAAA,CAAM,GAAGoD,CAAW,CAAA,CAAIvP,CAAAA,CACpCwP,CAAAA,CAAoB,CAAC,CAACtD,GAAa,CAAC,CAACC,CAAAA,EAAQA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAE3D,CACJ,IAAA,CAAMsD,EACN,UAAA,CAAYC,CAAAA,CACZ,OAAA,CAASC,CAAAA,CACT,KAAA,CAAOC,CACT,CAAA,CAAItL,EAAAA,CACF,CACE,GAAI4H,CAAAA,CAAW,CAAE,QAAA,CAAAA,CAAS,CAAA,CAAI,EAAC,CAC/B,GAAIC,CAAAA,EAAQA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAI,CAAE,IAAA,CAAMA,CAAAA,CAAK,KAAK,GAAG,CAAE,CAAA,CAAI,EAAC,CAC1D,aAAA,CAAe,IAAA,CACf,MAAA,CAAQ,QACV,CAAA,CACA,CAAE,OAAA,CAASqD,CAAkB,CAC/B,CAAA,CAEMK,CAAAA,CAAuB/D,cAAQ,IAAM,CACzC,GAAI,CAAC0D,CAAAA,EAAqB,CAACC,CAAAA,EAAY,MAAA,CAAQ,OAG/C,IAAMpF,CAAAA,CAAUoF,CAAAA,CAAW,MAAA,CAAO,GAAA,CAAKK,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAClE,OAAOzF,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAI,MAClD,CAAA,CAAG,CAACmF,EAAmBC,CAAU,CAAC,CAAA,CAI5BM,CAAAA,CAAejE,aAAAA,CACnB,KAAO,CACL,MAAA,CAAQ,QAAA,CACR,iBAAA,CAAmB,IAAA,CACnB,IAAA,CAAM,WAAA,CACN,KAAA,CAAO,MAAA,CACP,KAAA,CAAO,GACP,GAAGyD,CAAAA,CACH,GAAIM,CAAAA,GAAyB,MAAA,CACzB,CAAE,aAAA,CAAeA,CAAqB,CAAA,CACtC,EACN,CAAA,CAAA,CACA,CAACN,CAAAA,CAAYM,CAAoB,CACnC,EAEM,CACJ,IAAA,CAAMG,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,UAAA,CAAYC,CAAAA,CACZ,kBAAA,CAAoBC,CAAAA,CACpB,OAAA,CAAAtE,CAAAA,CACA,KAAA,CAAAlE,CAAAA,CACA,WAAA,CAAayI,CAAAA,CACb,aAAA,CAAeC,EACf,OAAA,CAAAC,CACF,CAAA,CAAIhQ,EAAAA,CAAuByP,CAAY,CAAA,CAGjC1H,CAAAA,CAAOyD,aAAAA,CACX,IAAMkE,CAAAA,EAAc,KAAA,CAAM,OAAA,CAASO,CAAAA,EAASA,CAAAA,CAAK,MAAM,CAAA,EAAK,EAAC,CAC7D,CAACP,CAAY,CACf,CAAA,CAGMQ,CAAAA,CAAoBhB,CAAAA,EAAqB,CAACC,CAAAA,EAAc,CAACE,CAAAA,CAW/D,OAAO,CACL,IAAA,CAAAtH,CAAAA,CACA,SAAA,CARgBmI,GAAqBP,CAAAA,CASrC,UAAA,CAPAP,CAAAA,EACAc,CAAAA,EACCN,CAAAA,EAAoB,CAACC,CAAAA,CAMtB,cAAA,CAAAA,CAAAA,CACA,OAAA,CAASR,CAAAA,EAAiB9D,CAAAA,CAC1B,KAAA,CAAO+D,CAAAA,EAAejI,CAAAA,CACtB,OAAA,CAAAyI,EACA,SAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CACF,CACF,CCpJO,SAASG,EAAAA,CAAkB,CAAE,SAAA,CAAA5D,CAAU,CAAA,CAA2B,CACvE,OACEI,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,4HAAA,EAA+HJ,CAAAA,EAAa,EAAE,CAAA,CAAA,CAEzJ,QAAA,CAAA,CAAAI,eAAAA,CAAC,OAAI,SAAA,CAAU,oDAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,sDAAA,CAAuD,CAAA,CAC3EZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,kCAAA,CAAmC,CAAA,CACvDZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,uDAAA,CAAwD,CAAA,CAAA,CAC9E,CAAA,CAGAd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,0DAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAC3Cd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,oBAAA,CAAqB,CAAA,CACzCZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,GAC5C,CAAA,CAAA,CACF,CAAA,CACAd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,YAAA,CAAS,SAAA,CAAU,sBAAA,CAAuB,CAAA,CAC3Cd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,oBAAA,CAAqB,CAAA,CACzCZ,cAAAA,CAACY,YAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,UAAU,8BAAA,CAA+B,CAAA,CACnDZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,8BAAA,CAA+B,CAAA,CAAA,CACrD,CAAA,CAAA,CACF,CAEJ,CAMO,SAAS2C,EAAAA,CAAe,CAAE,KAAA,CAAA9C,CAAAA,CAAQ,CAAE,CAAA,CAAwB,CACjE,OACET,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yFAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQS,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAACC,CAAAA,CAAG7F,CAAAA,GACrCmF,cAAAA,CAACsD,EAAAA,CAAA,CAA8B,SAAA,CAAU,wBAAA,CAAA,CAAjBzI,CAA0C,CACnE,CAAA,CACH,CAAA,CACF,CAEJ,CCtDO,SAAS2I,EAAAA,CAAa,CAAE,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,CAAAA,CAAY,IAAK,CAAA,CAAsB,CAC3E,IAAMC,EAAaF,CAAAA,CAAQ,GAAA,CAE3B,OACEzD,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAAF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAgB,OAAA,CAAQ,YAAA,CAErC,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAE,6BAAA,CACF,IAAA,CAAK,MAAA,CACL,SAAA,CAAU,oBAAA,CACV,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CAChB,CAAA,CAEAA,eAAC,MAAA,CAAA,CACC,CAAA,CAAE,6BAAA,CACF,IAAA,CAAK,MAAA,CACL,SAAA,CAAU,gBAAA,CACV,WAAA,CAAY,GAAA,CACZ,aAAA,CAAc,OAAA,CACd,eAAA,CAAiB,CAAA,EAAG2D,CAAAA,CAAa,KAAK,CAAA,MAAA,CAAA,CACtC,MAAO,CACL,UAAA,CAAY,mCACd,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAECD,CAAAA,EACC1D,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACb,QAAA,CAAAF,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6DAAA,CACb,UAAA2D,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,GAAA,CAAA,CACpB,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CCtBO,SAASG,EAAAA,CAAY,CAC1B,KAAA,CAAArJ,CAAAA,CACA,QAAA,CAAAuG,CAAAA,CACA,eAAA,CAAA+C,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAlE,CAAE,CAAA,CAAIC,mBAAAA,GACR,CAACkE,CAAAA,CAAsBC,CAAuB,CAAA,CAClDhI,cAAAA,CAAgC,IAAI,CAAA,CAEhCiI,CAAAA,CAAazJ,EAAM,OAAA,EAAW,EAAC,CAC/B0J,CAAAA,CACJD,CAAAA,CAAW,MAAA,CAAS,CAAA,CAChB,CAAC,GAAGA,CAAU,CAAA,CAAE,IAAA,CACd,CAAC/E,CAAAA,CAAGC,CAAAA,GAAM,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAE,MAAA,EAAU,CAAC,CACxD,EACA+E,CAAAA,CACAE,CAAAA,CAAcD,CAAAA,CAAQ,MAAA,CAAQE,CAAAA,EAAWA,CAAAA,CAAO,MAAA,GAAW,QAAQ,CAAA,CAEnEC,CAAAA,CAAiBH,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACpCI,CAAAA,CAAiBD,CAAAA,CAAiBH,CAAAA,CAAQ,CAAC,CAAA,CAAIH,CAAAA,CAE/CQ,CAAAA,CAAkB3F,aAAAA,CACtB,IAAM4F,4BAAAA,CAAAA,CAAwBhK,CAAAA,CAAM,MAAA,EAAU,CAAA,EAAK,GAAG,CAAA,CACtD,CAACA,CAAAA,CAAM,MAAM,CACf,CAAA,CAIMiK,EAAeL,CAAAA,EACfA,CAAAA,CAAO,MAAA,CAAe,UAAA,CAAWA,CAAAA,CAAO,MAAM,CAAA,CAAI,GAAA,CAC/C,IAAA,CAGHM,CAAAA,CAAcN,CAAAA,EACdA,CAAAA,CAAO,KAAA,CAAc,UAAA,CAAWA,CAAAA,CAAO,KAAK,EAAI,GAAA,CAC7C,IAAA,CAGHO,CAAAA,CAAiBP,CAAAA,EAAmC,CACxD,IAAMQ,CAAAA,CAAWH,CAAAA,CAAYL,CAAM,CAAA,CAC7BS,CAAAA,CAAUH,CAAAA,CAAWN,CAAM,CAAA,CACjC,OAAIQ,CAAAA,EAAY,KACVC,CAAAA,EAAW,IAAA,EAAQD,CAAAA,EAAY,CAAA,CAAU,MAAA,CACtCE,CAAAA,CAAcF,CAAQ,CAAA,CAE3BC,CAAAA,EAAW,IAAA,CACTA,CAAAA,EAAW,CAAA,CAAU,OAAA,CAClBC,CAAAA,CAAc,GAAA,CAAMD,CAAO,EAE7B,IACT,CAAA,CAEME,CAAAA,CAAgBX,CAAAA,EAAmC,CACvD,IAAMQ,CAAAA,CAAWH,CAAAA,CAAYL,CAAM,CAAA,CAC7BS,CAAAA,CAAUH,CAAAA,CAAWN,CAAM,CAAA,CACjC,OAAIS,CAAAA,EAAW,KACTD,CAAAA,EAAY,IAAA,EAAQC,CAAAA,EAAW,CAAA,CAAU,MAAA,CACtCC,CAAAA,CAAcD,CAAO,CAAA,CAE1BD,CAAAA,EAAY,IAAA,CACVA,CAAAA,EAAY,CAAA,CAAU,OAAA,CACnBE,CAAAA,CAAc,GAAA,CAAMF,CAAQ,EAE9B,IACT,CAAA,CAGME,CAAAA,CAAiBE,CAAAA,EACrBA,CAAAA,EAAS,IAAA,CAAO,CAAA,EAAGA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAAM,IAAA,CAGrCC,CAAAA,CAAcrG,aAAAA,CAAQ,IAAM,CAChC,IAAMsG,CAAAA,CAAkBhB,CAAAA,CAAQ,IAAA,CAAMiB,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW,QAAQ,CAAA,CAKjE,OAJkBjB,CAAAA,CAAQ,KAAA,CACvBiB,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW,QAAA,EAAYA,EAAE,MAAA,GAAW,YAC/C,CAAA,CAGS,CACL,KAAA,CAAOvF,CAAAA,CAAE,6BAA6B,CAAA,CACtC,KAAA,CAAO,8BACT,CAAA,CACEsF,CAAAA,CACK,CACL,KAAA,CAAOtF,CAAAA,CAAE,2BAA2B,EACpC,KAAA,CAAO,gCACT,CAAA,CACK,CACL,KAAA,CAAOA,CAAAA,CAAE,8BAA8B,CAAA,CACvC,KAAA,CAAO,gCACT,CACF,CAAA,CAAG,CAACsE,CAAAA,CAAStE,CAAC,CAAC,EAETwF,CAAAA,CAAqBhB,CAAAA,EAA2B,CACpDJ,CAAAA,CAAwBI,CAAM,EAChC,CAAA,CAEMiB,CAAAA,CAAa,IAAM,CACvBrB,CAAAA,CAAwB,IAAI,EAC9B,CAAA,CAEMsB,CAAAA,CAAiB,IAAM,CACvBhB,CAAAA,EAAkBR,CAAAA,EACpBA,CAAAA,CAAgBtJ,CAAAA,CAAO8J,CAAAA,CAAgB,KAAK,EAEhD,CAAA,CAEMiB,CAAAA,CAAgB,IAAM,CACtBjB,CAAAA,EAAkBR,CAAAA,EACpBA,CAAAA,CAAgBtJ,CAAAA,CAAO8J,CAAAA,CAAgB,IAAI,EAE/C,CAAA,CAEMkB,CAAAA,CAAe,IAAM,CACrBzE,CAAAA,EACFA,CAAAA,CAASvG,CAAK,EAElB,CAAA,CAEMiL,CAAAA,CAAmBtB,CAAAA,CAAY,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CACzCuB,EAAiBvB,CAAAA,CAAY,MAAA,CAAS,CAAA,CAE5C,OACEpE,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,sUAAA,CACV,QAASyF,CAAAA,CAET,QAAA,CAAA,CAAAzF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC0F,SAAAA,CAAA,CACC,GAAA,CAAKnL,CAAAA,CAAM,QAAA,EAAY,MAAA,CACvB,IAAA,CAAMA,CAAAA,CAAM,KAAA,EAAS,OAAA,CACrB,MAAA,CAAO,IAAA,CACP,UAAU,mGAAA,CACZ,CAAA,CACAyF,cAAAA,CAAC2F,gBAAAA,CAAA,CAAc,OAAA,CAASpL,CAAAA,CAAM,KAAA,CAAO,SAAA,CAAU,QAAA,CAC7C,QAAA,CAAAyF,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,iFAAA,CACV,QAAA,CAAAzF,EAAM,KAAA,CACT,CAAA,CACF,CAAA,CAEC6J,CAAAA,CACCpE,cAAAA,CAACwD,EAAAA,CAAA,CAAa,KAAA,CAAOgB,CAAAA,CAAYP,CAAAA,CAAQ,CAAC,CAAC,CAAA,EAAK,EAAA,CAAI,CAAA,CAEpDe,CAAAA,CAAY,QAAUrF,CAAAA,CAAE,2BAA2B,CAAA,EACjDK,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,yFAAA,EAA4FgF,CAAAA,CAAY,KAAK,CAAA,CAAA,CAExH,QAAA,CAAAhF,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAgF,CAAAA,CAAY,KAAA,CAAM,EAC3B,CAAA,CAAA,CAGN,CAAA,CAGCX,CAAAA,EAAkB,CAACD,CAAAA,EAClBtE,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,mHAAA,CACV,OAAA,CAAU8F,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,GACFR,CAAAA,GACF,CAAA,CAEA,QAAA,CAAA,CAAApF,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6DAAA,CACb,QAAA,CAAAqE,CAAAA,CAAe,WAAA,CAClB,CAAA,CACAvE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,UAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA0E,CAAAA,CAAcL,CAAc,CAAA,CAC/B,CAAA,CACArE,cAAAA,CAAC6F,gBAAAA,CAAA,CAAc,SAAA,CAAU,4CAAA,CAA6C,CAAA,CAAA,CACxE,CAAA,CAAA,CACF,EAID,CAACxB,CAAAA,EAAkB,CAACD,CAAAA,EAAkBoB,CAAAA,CAAiB,MAAA,CAAS,CAAA,EAC/D1F,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kEAAA,CACZ,QAAA,CAAA,CAAA0F,CAAAA,CAAiB,GAAA,CAAKrB,CAAAA,EACrBrE,eAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CAEL,SAAA,CAAU,mHAAA,CACV,OAAA,CAAU8F,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,EAAgB,CAClBT,CAAAA,CAAkBhB,CAAM,EAC1B,CAAA,CAEA,QAAA,CAAA,CAAAnE,cAAAA,CAAC,QAAK,SAAA,CAAU,6DAAA,CACb,QAAA,CAAAmE,CAAAA,CAAO,WAAA,CACV,CAAA,CACArE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA0E,EAAcP,CAAM,CAAA,CACvB,CAAA,CACArE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qIAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,oBAAoB,CAAA,CACzB,EACAK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,GAAA,CAAC,CAAA,CACpCA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,mBAAmB,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,IAvBKwE,CAAAA,CAAO,MAwBd,CACD,CAAA,CACAsB,CAAAA,EACCzF,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wCAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,2BAAA,CAA6B,CAC9B,KAAA,CAAOuE,CAAAA,CAAY,MAAA,CAAS,CAC9B,CAAC,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAIDG,CAAAA,EACCvE,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,iDAAA,EAAoDsE,CAAAA,CAAiB,MAAA,CAAS,EAAE,CAAA,CAAA,CAE3F,QAAA,CAAA,CAAAtE,eAAAA,CAACgG,SAAAA,CAAA,CACC,KAAA,CAAM,SAAA,CACN,SAAA,CAAS,IAAA,CACT,SAAA,CAAU,kEAAA,CACV,IAAA,CAAK,IAAA,CACL,OAAA,CAAST,CAAAA,CAET,QAAA,CAAA,CAAArF,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wBAAA,CACb,QAAA,CAAAL,EAAE,oBAAoB,CAAA,CACzB,CAAA,CACAK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA0E,EAAcL,CAAc,CAAA,CAC/B,CAAA,CAAA,CACF,CAAA,CACAvE,eAAAA,CAACgG,SAAAA,CAAA,CACC,KAAA,CAAM,YACN,SAAA,CAAS,IAAA,CACT,SAAA,CAAU,qEAAA,CACV,IAAA,CAAK,IAAA,CACL,OAAA,CAASR,CAAAA,CAET,QAAA,CAAA,CAAAtF,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,mBAAmB,EACxB,CAAA,CACAK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA8E,CAAAA,CAAaT,CAAc,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGC,CAACA,CAAAA,EAAkBD,CAAAA,CAClBtE,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,wFAAA,CACV,OAAA,CAAU8F,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,EAAgB,CAClBL,IACF,CAAA,CAEA,QAAA,CAAA,CAAAvF,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,wBAAwB,CAAA,CAAE,CAAA,CACnCK,cAAAA,CAAC+F,mBAAAA,CAAA,CAAiB,SAAA,CAAU,2BAAA,CAA4B,CAAA,CAAA,CAC1D,EACAjG,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAwE,CAAAA,CAAgB,GAAA,CAAE3E,CAAAA,CAAE,sBAAsB,CAAA,CAAA,CAC7C,CAAA,CAAA,CACF,CAAA,CAEAG,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,UAAU,uGAAA,CACV,OAAA,CAAU8F,CAAAA,EAAM,CACdA,CAAAA,CAAE,eAAA,EAAgB,CAClBR,CAAAA,GACF,CAAA,CAEA,QAAA,CAAA,CAAApF,cAAAA,CAACgG,kBAAAA,CAAA,CAAgB,SAAA,CAAU,2BAAA,CAA4B,EACvDhG,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,oBAAoB,CAAA,CAAE,CAAA,CAAA,CACjC,CAAA,CAAA,CAEJ,CAEJ,CChTA,IAAMsG,GAAK,GAAA,CACLC,EAAAA,CAAK,GAAA,CACLC,EAAAA,CAAK,IAAA,CACLC,EAAAA,CAAK,IAAA,CAGLC,EAAAA,CAAM,EAAA,CAGNC,EAAAA,CAAgB,GAAA,CAChBC,EAAAA,CAAgB,GAAA,CAChBC,EAAAA,CAAgB,GAAA,CAEtB,SAASC,GAAeC,CAAAA,CAAuB,CAC7C,OAAIA,CAAAA,EAASN,EAAAA,CAAW,CAAA,CACpBM,CAAAA,EAASP,EAAAA,CAAW,CAAA,CACpBO,CAAAA,EAAST,EAAAA,CAAW,CAAA,CACjB,CACT,CAEA,SAASU,EAAAA,CAAaD,EAAuB,CAC3C,OAAIA,CAAAA,EAASP,EAAAA,CAAWK,EAAAA,CACpBE,CAAAA,EAASR,EAAAA,CAAWK,EAAAA,CACjBD,EACT,CAuBO,SAASM,EAAAA,CAAS,CACvB,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAA5D,EAAU,KAAA,CACV,WAAA,CAAA6D,CAAAA,CACA,QAAA,CAAAhG,CAAAA,CACA,eAAA,CAAA+C,CACF,CAAA,CAAkB,CAEhB,IAAMkD,CAAAA,CAAe7K,YAAAA,CAAuB,IAAI,CAAA,CAC1C,CAAE,KAAA,CAAO8K,EAAiB,CAAA,CAAG,MAAA,CAAQC,CAAAA,CAAkB,CAAE,CAAA,CAC7DC,uBAAAA,CAAkB,CAAE,GAAA,CAAKH,CAAa,CAAC,CAAA,CAGnCI,CAAAA,CAAcV,EAAAA,CAAeO,CAAc,CAAA,CAC3CI,CAAAA,CAAYT,GAAaK,CAAc,CAAA,CACvCK,CAAAA,CAAe,IAAA,CAAK,IAAA,CAAKR,CAAAA,CAAO,MAAA,CAASM,CAAW,CAAA,EAAK,CAAA,CACzDG,CAAAA,CAAgBrE,CAAAA,CAAUoE,CAAAA,CAAe,CAAA,CAAIA,CAAAA,CAG7CE,CAAAA,CAAc7K,kBACjB7B,CAAAA,EAAkBA,CAAAA,CAAQwM,CAAAA,CAC3B,CAACA,CAAY,CACf,CAAA,CAEMG,CAAAA,CAAe9K,iBAAAA,CAAY,SAAY,CAC3CoK,CAAAA,KACF,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAEVW,CAAAA,CAAiBC,2CAAAA,CAAkB,CACvC,WAAA,CAAAH,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,QAAA,CAAUF,CAAAA,CACV,SAAA,CAAW,CACb,CAAC,CAAA,CAED,OACEtH,cAAAA,CAAC,OAAI,GAAA,CAAK+G,CAAAA,CAAc,SAAA,CAAU,0BAAA,CAC/B,QAAA,CAAAE,CAAAA,CAAkB,CAAA,EACjBjH,cAAAA,CAAC2H,iBAAA,CACC,KAAA,CAAO,CAAE,MAAA,CAAQV,CAAgB,CAAA,CACjC,cAAA,CAAgBQ,CAAAA,CAChB,aAAcG,EAAAA,CACd,QAAA,CAAUN,CAAAA,CACV,SAAA,CAAWF,CAAAA,CACX,QAAA,CAAU,CACR,MAAA,CAAAP,CAAAA,CACA,WAAA,CAAAM,CAAAA,CACA,YAAA,CAAAE,CAAAA,CACA,GAAA,CAAKhB,EAAAA,CACL,QAAA,CAAAvF,EACA,eAAA,CAAA+C,CACF,CAAA,CACF,CAAA,CAEJ,CAEJ,CAmBA,SAAS+D,EAAAA,CAAa,CACpB,KAAA,CAAA/M,CAAAA,CACA,KAAA,CAAAgN,CAAAA,CACA,MAAA,CAAAhB,CAAAA,CACA,WAAA,CAAAM,EACA,YAAA,CAAAE,CAAAA,CACA,GAAA,CAAAS,CAAAA,CACA,QAAA,CAAAhH,CAAAA,CACA,eAAA,CAAA+C,CACF,CAAA,CAAwC,CAEtC,GAAIhJ,CAAAA,EAASwM,CAAAA,CACX,OACErH,cAAAA,CAAC,KAAA,CAAA,CAAI,MAAO6H,CAAAA,CAAO,SAAA,CAAU,sCAAA,CAC3B,QAAA,CAAA7H,cAAAA,CAAC+H,UAAAA,CAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CACrB,CAAA,CAIJ,IAAMC,CAAAA,CAAWnN,CAAAA,CAAQsM,CAAAA,CACnBc,CAAAA,CAAYpB,EAAO,KAAA,CAAMmB,CAAAA,CAAUA,CAAAA,CAAWb,CAAW,CAAA,CACzDe,CAAAA,CAAaf,CAAAA,CAAcc,CAAAA,CAAU,MAAA,CAErCE,CAAAA,CAA4B,CAChC,OAAA,CAAS,MAAA,CACT,GAAA,CAAAL,CAAAA,CACA,MAAA,CAAQ,eAAeA,CAAG,CAAA,GAAA,CAC5B,CAAA,CAEA,OACE9H,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO6H,CAAAA,CACV,QAAA,CAAA/H,eAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOqI,CAAAA,CACT,QAAA,CAAA,CAAAF,CAAAA,CAAU,GAAA,CAAK1N,GACdyF,cAAAA,CAAC,KAAA,CAAA,CAAuB,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,CAAG,QAAA,CAAU,CAAE,CAAA,CACpD,QAAA,CAAAA,cAAAA,CAAC4D,EAAAA,CAAA,CACC,KAAA,CAAOrJ,CAAAA,CACP,QAAA,CAAUuG,EACV,eAAA,CAAiB+C,CAAAA,CACnB,CAAA,CAAA,CALQtJ,CAAAA,CAAM,MAMhB,CACD,CAAA,CAEA2N,CAAAA,CAAa,CAAA,EACZ,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQA,CAAW,CAAC,CAAA,CAAE,IAAI,CAACxH,CAAAA,CAAGC,CAAAA,GACzCX,cAAAA,CAAC,KAAA,CAAA,CAAwB,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,CAAG,QAAA,CAAU,CAAE,CAAA,CAAA,CAA7C,CAAA,OAAA,EAAUW,CAAC,CAAA,CAAqC,CAC3D,GACL,CAAA,CACF,CAEJ,CCnKO,SAASyH,EAAAA,CAAa,CAC3B,QAAA,CAAAtH,CAAAA,CACA,eAAA,CAAA+C,CAAAA,CACA,GAAGwE,CACL,CAAA,CAAsB,CACpB,GAAM,CACJ,IAAA,CAAMxB,CAAAA,CACN,OAAA,CAAA5D,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,UAAA,CAAAoF,CACF,CAAA,CAAInG,EAAAA,CAAU,CAAE,KAAA,CAAO,EAAA,CAAmB,GAAGkG,CAAY,CAAC,CAAA,CAE1D,OAAIC,CAAAA,CACKtI,cAAAA,CAACuD,EAAAA,CAAA,CAAe,KAAA,CAAO,EAAA,CAAmB,CAAA,CAIjDvD,cAAAA,CAAC4G,EAAAA,CAAA,CACC,MAAA,CAAQC,CAAAA,CACR,OAAA,CAAS5D,EACT,WAAA,CAAaC,CAAAA,CACb,QAAA,CAAUpC,CAAAA,CACV,eAAA,CAAiB+C,CAAAA,CACnB,CAEJ,CCfO,SAAS0E,EAAAA,CAAW,CAAE,QAAA,CAAAzH,CAAAA,CAAU,eAAA,CAAA+C,CAAgB,CAAA,CAAoB,CACzE,GAAM,CAAC2E,CAAAA,CAAWC,CAAY,CAAA,CAAI1M,cAAAA,CAA4B,CAC5D,QAAA,CAAU,IAAA,CACV,IAAA,CAAM,IACR,CAAC,CAAA,CAEKwJ,CAAAA,CAAe7I,iBAAAA,CAAaiG,CAAAA,EAAyB,CACzD8F,CAAAA,CAAa9F,CAAC,EAChB,CAAA,CAAG,EAAE,CAAA,CAEL,OACE7C,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,qCAAA,CAEb,QAAA,CAAA,CAAAE,cAAAA,CAACa,EAAAA,CAAA,CAAiB,QAAA,CAAU0E,CAAAA,CAAc,CAAA,CAG1CvF,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAAA,cAAAA,CAACoI,EAAAA,CAAA,CACC,QAAA,CAAUI,EAAU,QAAA,CACpB,IAAA,CAAMA,CAAAA,CAAU,IAAA,CAChB,QAAA,CAAU1H,CAAAA,CACV,eAAA,CAAiB+C,CAAAA,CACnB,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCgEA,SAAS6E,GACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACe,CACf,IAAMC,CAAAA,CAAcH,CAAAA,CAASC,CAAc,CAAA,CAC3C,OAAKE,CAAAA,CACED,CAAAA,GAAY,KAAA,CAAQC,CAAAA,CAAY,OAAA,CAAUA,CAAAA,CAAY,OADpC,IAE3B,CAEA,IAAMC,EAAAA,CAAYC,mBAAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAA,CAGjD,SAASC,EAAAA,EAAkB,CACzB,IAAMC,CAAAA,CAAW,CAAE,aAAA,CAAe,EAAA,CAAI,OAAQ,GAAA,CAAK,KAAA,CAAO,EAAA,CAAI,MAAA,CAAQ,IAAK,CAAA,CAG3EC,mBAAAA,CAAS,CACP,GAAGD,CAAAA,CACH,aAAA,CAAe,EAAA,CACf,MAAA,CAAQ,CAAE,CAAA,CAAG,EAAA,CAAK,EAAG,EAAI,CAC3B,CAAC,CAAA,CAGD,UAAA,CAAW,IAAM,CACfC,mBAAAA,CAAS,CACP,GAAGD,CAAAA,CACH,aAAA,CAAe,EAAA,CACf,MAAA,CAAQ,CAAE,CAAA,CAAG,GAAK,CAAA,CAAG,EAAI,CAC3B,CAAC,EACH,CAAA,CAAG,GAAG,CAAA,CAGN,UAAA,CAAW,IAAM,CACfC,mBAAAA,CAAS,CACP,GAAGD,CAAAA,CACH,aAAA,CAAe,GACf,MAAA,CAAQ,CAAE,CAAA,CAAG,EAAA,CAAK,CAAA,CAAG,EAAI,CAC3B,CAAC,EACH,CAAA,CAAG,GAAG,EACR,CAMO,SAASE,EAAAA,CAAa,CAC3B,OAAAjF,CAAAA,CAEA,KAAA,CAAOkF,CAAAA,CAAS,QAAA,CAChB,cAAA,CAAAC,CAAAA,CAAiB,KAAA,CACjB,WAAA,CAAAC,CAAAA,CAAc,KAChB,CAAA,CAA2C,CACzC,GAAM,CAAE,CAAA,CAAA5J,CAAE,EAAIC,mBAAAA,EAAe,CAGvB,CAAE,MAAA,CAAQ4J,CAAW,CAAA,CAAIC,uBAAAA,EAAQ,CAEjCC,CAAAA,CADUC,0BAAAA,EAAW,CACE,IAAA,CAC1BC,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmBC,oBAAAA,CAAe,QAAUD,CAAAA,CAAE,WACzD,CAAA,CACME,CAAAA,CAAkBN,CAAAA,GAAe,eAAA,CACjCO,CAAAA,CAAgBL,CAAAA,EAAc,OAAA,CAG9B,CAACb,CAAAA,CAASmB,CAAU,CAAA,CAAIjO,cAAAA,CAAuBuN,CAAc,CAAA,CAC7D,CAACW,CAAAA,CAAMC,CAAU,CAAA,CAAInO,cAAAA,CAAoBwN,CAAW,CAAA,CACpD,CAACY,CAAAA,CAAUC,CAAc,CAAA,CAAIrO,cAAAA,CAAiB,GAAG,CAAA,CAGjDsO,CAAAA,CAAc1L,aAAAA,CAClB,IAAM+J,GAAevE,CAAAA,CAAO,QAAA,CAAU4E,EAAAA,CAAWF,CAAO,CAAA,CACxD,CAAC1E,CAAAA,CAAO,QAAA,CAAU0E,CAAO,CAC3B,CAAA,CAGM,CAAE,SAAA,CAAAyB,CAAAA,CAAW,UAAA,CAAAC,CAAW,CAAA,CAAI5L,cAAQ,IACpCsL,CAAAA,GAAS,KAAA,CAEJ,CAAE,SAAA,CAAWlB,EAAAA,CAAW,UAAA,CAAYsB,CAAY,CAAA,CAGlD,CAAE,SAAA,CAAWA,CAAAA,CAAa,UAAA,CAAYtB,EAAU,CAAA,CACtD,CAACkB,EAAMI,CAAW,CAAC,CAAA,CAGhBG,CAAAA,CACJ,CAAA,CAAQF,CAAAA,EAAc,CAAA,CAAQC,CAAAA,EAAeJ,CAAAA,CAAW,CAAA,CAGpDM,CAAAA,CAAgB9L,aAAAA,CAAQ,IAEnB,MAAA,CADLkK,CAAAA,GAAY,KAAA,CACA1E,EAAO,MAAA,EAAU,EAAA,CAEnBA,CAAAA,CAAO,KAAA,EAAS,EAFM,CAAA,CAGnC,CAAC0E,CAAAA,CAAS1E,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,KAAK,CAAC,CAAA,CAInCuG,CAAAA,CAAS/L,aAAAA,CAAQ,IACjB,KAAA,CAAMwL,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,CAAA,CACzCF,CAAAA,GAAS,KAAA,CACJQ,CAAAA,CAAgB,CAAA,CAAIN,CAAAA,CAAWM,CAAAA,CAAgB,CAAA,CAEjDN,CAAAA,CACN,CAACF,CAAAA,CAAME,EAAUM,CAAa,CAAC,CAAA,CAK5BE,CAAAA,CAAShM,aAAAA,CAAQ,IACjB,KAAA,CAAMwL,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,CAAA,CACtC,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAW,GAAS,EACrC,CAACA,CAAQ,CAAC,CAAA,CAGP,CACJ,IAAA,CAAMS,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,KAAA,CAAOC,CAAAA,CACP,OAAA,CAASC,CACX,CAAA,CAAI9R,EAAAA,CACF,CACE,cAAe8Q,CAAAA,EAAiB,MAAA,CAChC,SAAA,CAAWO,CAAAA,EAAa,EAAA,CACxB,UAAA,CAAYC,CAAAA,EAAc,EAAA,CAC1B,MAAA,CAAAI,CAAAA,CACA,WAAA,CAAa,GACf,CAAA,CACA,CACE,OAAA,CAASH,CACX,CACF,CAAA,CAGM,CACJ,IAAA,CAAMQ,CAAAA,CACN,SAAA,CAAWC,EAAAA,CACX,OAAA,CAASC,EACX,CAAA,CAAIC,gCAAAA,CACF,CACE,KAAA,CAAOC,WAAAA,CAAM,MAAA,CACb,OAAA,CAASrB,CAAAA,EAAiB,EAC5B,CAAA,CACA,CACE,OAAA,CAASD,CAAAA,EAAmB,CAAA,CAAQC,CAAAA,CACpC,eAAA,CAAiB,GACnB,CACF,CAAA,CAGMsB,EAAAA,CAAc1M,aAAAA,CAAQ,IAAM,CAChC,GAAI,CAACqM,GAAkB,UAAA,CAAY,OAAO,IAAA,CAC1C,IAAMM,CAAAA,CAAgBN,CAAAA,CAAiB,UAAA,CAAW,IAAA,CAC/CO,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYxC,EACvB,CAAA,CACA,OAAOuC,CAAAA,CAAgB,UAAA,CAAWA,EAAc,MAAM,CAAA,CAAI,CAC5D,CAAA,CAAG,CAACN,CAAgB,CAAC,CAAA,CAGfQ,EAAAA,CAAsB7M,aAAAA,CAAQ,IAAM,CACxC,GAAI,CAACqM,CAAAA,EAAkB,UAAA,EAAc,CAACX,CAAAA,CAAa,OAAO,IAAA,CAC1D,IAAMoB,CAAAA,CAAmBT,CAAAA,CAAiB,UAAA,CAAW,IAAA,CAClDO,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYlB,CACvB,CAAA,CACA,OAAOoB,CAAAA,CAAmB,UAAA,CAAWA,EAAiB,MAAM,CAAA,CAAI,CAClE,CAAA,CAAG,CAACT,CAAAA,CAAkBX,CAAW,CAAC,CAAA,CAG5BqB,EAAAA,CAAU/M,aAAAA,CACd,IAAM+J,EAAAA,CAAevE,CAAAA,CAAO,QAAA,CAAU4E,EAAAA,CAAW,KAAK,CAAA,CACtD,CAAC5E,CAAAA,CAAO,QAAQ,CAClB,CAAA,CACMwH,EAAAA,CAAShN,aAAAA,CACb,IAAM+J,EAAAA,CAAevE,CAAAA,CAAO,QAAA,CAAU4E,EAAAA,CAAW,IAAI,CAAA,CACrD,CAAC5E,EAAO,QAAQ,CAClB,CAAA,CAEMyH,EAAAA,CAAkBjN,aAAAA,CAAQ,IAAM,CACpC,GAAI,CAACqM,CAAAA,EAAkB,UAAA,EAAc,CAACU,EAAAA,CAAS,OAAO,IAAA,CACtD,IAAMH,EAAIP,CAAAA,CAAiB,UAAA,CAAW,IAAA,CAAMrL,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAY+L,EAAO,CAAA,CACvE,OAAOH,CAAAA,CAAI,UAAA,CAAWA,CAAAA,CAAE,MAAM,CAAA,CAAI,CACpC,CAAA,CAAG,CAACP,EAAkBU,EAAO,CAAC,CAAA,CAExBG,EAAAA,CAAiBlN,aAAAA,CAAQ,IAAM,CACnC,GAAI,CAACqM,CAAAA,EAAkB,UAAA,EAAc,CAACW,EAAAA,CAAQ,OAAO,IAAA,CACrD,IAAMJ,EAAIP,CAAAA,CAAiB,UAAA,CAAW,IAAA,CAAMrL,CAAAA,EAAMA,CAAAA,CAAE,OAAA,GAAYgM,EAAM,CAAA,CACtE,OAAOJ,CAAAA,CAAI,UAAA,CAAWA,CAAAA,CAAE,MAAM,CAAA,CAAI,CACpC,CAAA,CAAG,CAACP,CAAAA,CAAkBW,EAAM,CAAC,CAAA,CAGvB,CAAE,IAAA,CAAMG,EAAU,CAAA,CAAIlX,EAAAA,CAAkBuP,CAAAA,CAAO,MAAA,CAAQ,CAC3D,eAAA,CAAiB,GACnB,CAAC,CAAA,CAGK4H,GAAUpN,aAAAA,CAAQ,IAAA,CACTkK,CAAAA,GAAY,KAAA,CAAQiD,EAAAA,EAAW,OAAA,CAAUA,EAAAA,EAAW,MAAA,IACnD,CAAC,CAAA,EAAG,KAAA,EAAS,IAAA,CAC1B,CAACA,EAAAA,CAAWjD,CAAO,CAAC,EAEjBmD,EAAAA,CAAUrN,aAAAA,CAAQ,IAAA,CACTkK,CAAAA,GAAY,KAAA,CAAQiD,EAAAA,EAAW,OAAA,CAAUA,EAAAA,EAAW,MAAA,IACnD,CAAC,CAAA,EAAG,KAAA,EAAS,IAAA,CAC1B,CAACA,EAAAA,CAAWjD,CAAO,CAAC,CAAA,CAGjBoD,EAAAA,CAActN,aAAAA,CAAQ,IACrBiM,CAAAA,EAAO,cAAA,CACL,UAAA,CAAWA,CAAAA,CAAM,cAAc,CAAA,CADH,IAAA,CAElC,CAACA,CAAK,CAAC,CAAA,CAGJsB,EAAAA,CAAgBvN,cAAQ,IAAM,CAClC,GAAI,KAAA,CAAMwL,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAG,OAAO,CAAA,CAC7C,GAAIS,CAAAA,CAEF,OAAO,QAAA,CAASA,CAAAA,CAAM,QAAQ,EAAI,GAAA,CAGpC,GAAIX,CAAAA,GAAS,KAAA,CAEX,OAAOE,CAAAA,CAGT,IAAMgC,CAAAA,CAEA,MAAA,CADJtD,CAAAA,GAAY,KAAA,CACD1E,CAAAA,CAAO,MAAA,EAAU,CAAA,CACjBA,CAAAA,CAAO,KAAA,EAAS,CADE,CAAA,CAE/B,OAAOgG,CAAAA,CAAWgC,CACpB,CAAA,CAAG,CAACvB,CAAAA,CAAOX,CAAAA,CAAMpB,CAAAA,CAASsB,CAAAA,CAAUhG,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,KAAK,CAAC,CAAA,CAG1DiI,GAAkBzN,aAAAA,CAAQ,IAC1B,KAAA,CAAMwL,CAAQ,CAAA,EAAKA,CAAAA,EAAY,CAAA,CAAU,CAAA,CACzCF,CAAAA,GAAS,KAAA,CAEJS,CAAAA,CAAS,CAAA,CAGXwB,EAAAA,CACN,CAACjC,CAAAA,CAAMS,CAAAA,CAAQwB,GAAe/B,CAAQ,CAAC,CAAA,CAGpCkC,EAAAA,CAAkBD,EAAAA,CAAkBF,EAAAA,CAGpCI,EAAAA,CAAU5P,iBAAAA,CAAaiG,CAAAA,EAAiB,CAC5CuH,CAAAA,CAAWvH,CAAC,CAAA,CACZyH,CAAAA,CAAe,GAAG,EACpB,EAAG,EAAE,CAAA,CAGCmC,EAAAA,CAAc7P,iBAAAA,CACjB8P,CAAAA,EAAc,CACb,GAAI,KAAA,CAAMA,CAAC,CAAA,CAAG,CACZpC,CAAAA,CAAe,GAAG,CAAA,CAClB,MACF,CACA,IAAMqC,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGD,CAAC,CAAA,CAGvBE,EAAAA,CACJzC,CAAAA,GAAS,KAAA,CAAQ,IAAA,CAAK,KAAA,CAAMwC,CAAAA,CAAU,GAAG,CAAA,CAAI,GAAA,CAAM,KAAK,KAAA,CAAMA,CAAO,CAAA,CACvErC,CAAAA,CAAesC,EAAO,EACxB,CAAA,CACA,CAACzC,CAAI,CACP,CAAA,CAGA9N,eAAAA,CAAU,IAAM,CACVqO,CAAAA,EACFO,CAAAA,GAEJ,CAAA,CAAG,CAACZ,CAAAA,CAAUtB,CAAAA,CAASoB,CAAAA,CAAMO,CAAAA,CAAcO,CAAY,CAAC,CAAA,CAGxD,IAAM4B,EAAAA,CAAahO,aAAAA,CAA6B,IAAM,CACpD,IAAMiO,CAAAA,CAAmB,EAAC,CAE1B,OAAA,CAAI,KAAA,CAAMzC,CAAQ,CAAA,EAAKA,CAAAA,CAAWvI,EAAAA,GAChCgL,CAAAA,CAAO,KAAK,CAAA,oBAAA,EAAuBhL,EAAkB,CAAA,CAAE,CAAA,CAGrDuC,CAAAA,CAAO,MAAA,GAAW,QAAA,EACpByI,CAAAA,CAAO,KAAK,sBAAsB,CAAA,CAKlC3C,CAAAA,GAAS,KAAA,EACToB,EAAAA,EAAe,IAAA,EACf,CAAC,KAAA,CAAMlB,CAAQ,CAAA,EACfA,CAAAA,CAAW,CAAA,EACXA,CAAAA,CAAWkB,EAAAA,EAEXuB,CAAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA,CAKvC3C,CAAAA,GAAS,MAAA,EACTuB,EAAAA,EAAuB,IAAA,EACvB,CAAC,KAAA,CAAMrB,CAAQ,CAAA,EACfA,CAAAA,CAAW,CAAA,EACXA,CAAAA,CAAWqB,EAAAA,EAEXoB,CAAAA,CAAO,IAAA,CAAK,qBAAqB,EAG5B,CAAE,OAAA,CAASA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,MAAA,CAAAA,CAAO,CAChD,CAAA,CAAG,CAACzC,CAAAA,CAAUhG,CAAAA,CAAO,MAAA,CAAQ8F,CAAAA,CAAMoB,EAAAA,CAAaG,EAAmB,CAAC,CAAA,CAG9D,CAACqB,EAAAA,CAAQC,EAAS,CAAA,CAAI/Q,cAAAA,CAAwB,IAAI,CAAA,CAClD,CAACgR,EAAAA,CAAcC,EAAe,CAAA,CAAIjR,cAAAA,CAAS,KAAK,CAAA,CAGhDkR,EAAAA,CAASvQ,kBAAY,SAAY,CACrC,GACE,EAAA,CAACiQ,EAAAA,CAAW,OAAA,EACZ,CAAC7C,CAAAA,EACD,CAACC,CAAAA,EACD,CAACL,CAAAA,EACDuB,EAAAA,CAAAA,CAYF,CAAA6B,EAAAA,CAAU,IAAI,EACdE,EAAAA,CAAgB,IAAI,CAAA,CAEpB,GAAI,CAEF,IAAIE,CAAAA,CAAetC,CAAAA,CAOnB,GANKsC,CAAAA,EAAc,WAAA,GAGjBA,CAAAA,CAAAA,CADe,MAAMnC,CAAAA,EAAa,EACZ,IAAA,CAAA,CAGpB,CAACmC,CAAAA,EAAc,WAAA,CAIjB,OAIF,IAAMC,CAAAA,CAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAAa,WAAW,CAAA,CAAIhM,EAAAA,EAC/DA,EAAAA,CAAE,UAAA,CAAW,CAAC,CAChB,EAGMkM,EAAAA,CAAO,MAAM1D,CAAAA,CAAa,eAAA,CAAgByD,CAAO,CAAA,CAEvDL,EAAAA,CAAUM,EAAI,CAAA,CAGdC,QAAAA,CAAM,OAAA,CAAQ1N,CAAAA,CAAE,6BAA6B,CAAC,CAAA,CAC9CsJ,EAAAA,GAGAmB,CAAAA,CAAe,GAAG,CAAA,CAGlBc,EAAAA,GACF,CAAA,KAAc,CAEZmC,QAAAA,CAAM,KAAA,CAAM1N,CAAAA,CAAE,2BAA2B,CAAC,EAC5C,CAAA,OAAE,CACAqN,EAAAA,CAAgB,KAAK,EACvB,CAAA,CACF,CAAA,CAAG,CACDL,EAAAA,CAAW,OAAA,CACX7C,CAAAA,CACAC,CAAAA,CACAL,CAAAA,CACAkB,CAAAA,CACAK,EAAAA,CACAF,CAAAA,CACAG,EAAAA,CACAvL,CACF,CAAC,CAAA,CAGK2N,GAAQ5Q,iBAAAA,CAAY,IAAM,CAC9BsN,CAAAA,CAAWV,CAAc,CAAA,CACzBY,CAAAA,CAAWX,CAAW,CAAA,CACtBa,CAAAA,CAAe,GAAG,CAAA,CAClB0C,EAAAA,CAAU,IAAI,EAChB,CAAA,CAAG,CAACxD,CAAAA,CAAgBC,CAAW,CAAC,CAAA,CAEhC,OAAO,CACL,OAAA,CAAAV,CAAAA,CACA,IAAA,CAAAoB,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,MAAA,CAAAO,CAAAA,CACA,aAAA,CAAAwB,EAAAA,CACA,gBAAAE,EAAAA,CACA,eAAA,CAAAC,EAAAA,CACA,eAAA,CAAAvC,CAAAA,CACA,OAAA,CAAAiC,EAAAA,CACA,OAAA,CAAAC,EAAAA,CACA,KAAA,CAAOpB,CAAAA,EAAS,IAAA,CAChB,WAAA,CAAAqB,EAAAA,CACA,WAAA,CAAAZ,EAAAA,CACA,oBAAAG,EAAAA,CACA,eAAA,CAAAI,EAAAA,CACA,cAAA,CAAAC,EAAAA,CACA,gBAAA,CAAAZ,EAAAA,CACA,cAAA,CAAAJ,CAAAA,CACA,YAAA,CAAAkC,EAAAA,CACA,UAAA,CAAYjC,CAAAA,EAAc,IAAA,CAC1B,MAAA,CAAA+B,EAAAA,CACA,WAAAF,EAAAA,CACA,UAAA,CAAA3C,CAAAA,CACA,OAAA,CAAAsC,EAAAA,CACA,WAAA,CAAAC,EAAAA,CACA,MAAA,CAAAU,EAAAA,CACA,KAAA,CAAAK,EACF,CACF,CC3hBA,IAAMC,EAAAA,CAAY,CAAA,4CAAA,EAA+CvE,mBAAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,UAAA,CAAA,CAmDhG,SAASwE,EAAAA,CAAY,CAC1B,KAAA,CAAAjT,CAAAA,CACA,MAAA,CAAA4J,CAAAA,CACA,OAAA,CAAA0E,CAAAA,CACA,IAAA,CAAAoB,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,eAAA,CAAAkC,CAAAA,CACA,aAAA,CAAAH,CAAAA,CACA,YAAAb,CAAAA,CACA,eAAA,CAAAO,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAZ,CAAAA,CACA,YAAA,CAAA8B,CAAAA,CACA,OAAA,CAAAU,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,EACA,QAAA,CAAAC,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAlO,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAGvBkO,CAAAA,CAAcnP,aAAAA,CAAQ,IAAM,CAChC,GAAIoO,EAAc,OAAOpN,CAAAA,CAAE,0BAA0B,CAAA,CACrD,IAAMoO,CAAAA,CACapO,CAAAA,CAAjBsK,CAAAA,GAAS,KAAA,CAAU,mBAAA,CAAyB,oBAAN,CAAA,CAClC+D,CAAAA,CACgBrO,CAAAA,CAApBkJ,CAAAA,GAAY,KAAA,CAAU,oBAAyB,kBAAN,CAAA,CAC3C,OAAO,CAAA,EAAGkF,CAAS,CAAA,CAAA,EAAIC,CAAY,CAAA,CACrC,CAAA,CAAG,CAACjB,CAAAA,CAAc9C,CAAAA,CAAMpB,CAAAA,CAASlJ,CAAC,CAAC,CAAA,CAG7BsO,EAActP,aAAAA,CAAQ,IACnBkK,CAAAA,GAAY,KAAA,CAAQ,SAAA,CAAY,WAAA,CACtC,CAACA,CAAO,CAAC,CAAA,CAEZ,OACE/I,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mFAAA,CAEZ,QAAA,CAAA,CAAAvF,GACCuF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,CAAAvF,CAAAA,CAAM,QAAA,EACLyF,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKzF,CAAAA,CAAM,QAAA,CACX,GAAA,CAAKA,CAAAA,CAAM,KAAA,CACX,SAAA,CAAU,6CACZ,CAAA,CAEFuF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qDAAA,CACb,QAAA,CAAAzF,CAAAA,CAAM,KAAA,CACT,CAAA,CACAuF,eAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,oDAAA,CACd,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW+I,CAAAA,GAAY,KAAA,CAAQ,cAAA,CAAiB,cAAA,CAE/C,QAAA,CAAA,CACGlJ,CAAAA,CADHsK,CAAAA,GAAS,KAAA,CACJ,mBAAA,CACA,oBADmB,CAAA,CACI,IAEzBtK,CAAAA,CADHkJ,CAAAA,GAAY,KAAA,CACP,mBAAA,CACA,kBADmB,CAAA,CAAA,CAE3B,CAAA,CACA/I,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAA,QAAA,CACA+I,CAAAA,GAAY,KAAA,CAAQ1E,CAAAA,CAAO,WAAA,CAAcA,EAAO,UAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAIFrE,eAAAA,CAACoO,OAAAA,CAAA,CACC,OAAA,CAAQ,YAAA,CACR,WAAA,CAAajE,CAAAA,CACb,iBAAA,CAAoBnP,CAAAA,EAAQ6S,CAAAA,CAAa7S,CAAgB,EACzD,UAAA,CAAY,CACV,OAAA,CAAS,SAAA,CACT,GAAA,CAAK,MACP,CAAA,CAEA,QAAA,CAAA,CAAAkF,cAAAA,CAACmO,MAAAA,CAAA,CAAc,KAAA,CAAOxO,CAAAA,CAAE,mBAAmB,CAAA,CAAA,CAAlC,KAAqC,EAC9CK,cAAAA,CAACmO,MAAAA,CAAA,CAAe,KAAA,CAAOxO,CAAAA,CAAE,oBAAoB,CAAA,CAAA,CAApC,MAAuC,CAAA,CAAA,CAClD,CAAA,CAGAK,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACX,QAAA,CAAA,CAAC,KAAA,CAAO,IAAI,CAAA,CAAqB,GAAA,CAAKoO,CAAAA,EAAM,CAC5C,IAAMC,CAAAA,CAAiBD,CAAAA,GAAM,KAAA,CAAQxC,CAAAA,CAAkBC,CAAAA,CACvD,OACE/L,eAAAA,CAAC,KAAA,CAAA,CAAY,SAAA,CAAU,8BAAA,CACrB,QAAA,CAAA,CAAAA,gBAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM4N,CAAAA,CAAgBU,CAAC,CAAA,CAChC,UAAW,CAAA,mFAAA,EACTvF,CAAAA,GAAYuF,CAAAA,CACRA,CAAAA,GAAM,KAAA,CACJ,2CAAA,CACA,iDAAA,CACF,6DACN,GAEA,QAAA,CAAA,CAAApO,cAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAcL,CAAAA,CAAdyO,CAAAA,GAAM,KAAA,CAAU,mBAAA,CAAyB,kBAAN,CAAA,CACtC,CAAA,CAAA,CACE,IAAM,CACN,IAAME,CAAAA,CACJrE,CAAAA,GAAS,MACLmE,CAAAA,GAAM,KAAA,CACJjK,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACTiK,CAAAA,GAAM,KAAA,CACJjK,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,KAAA,CACf,OAAOmK,CAAAA,EAAS,IAAA,CACdxO,eAAAA,CAAC,QAAK,SAAA,CAAU,iBAAA,CACb,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAOwO,CAAK,CAAA,CAAI,GAAG,CAAA,CAAE,MAAA,CAAA,CACnC,CAAA,CACE,IACN,CAAA,GAAG,CAAA,CACL,CAAA,CAECrE,CAAAA,GAAS,QAAUpB,CAAAA,GAAYuF,CAAAA,EAC9BpO,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CAAAiL,CAAAA,CAAmB,QAAA,CAAM,CAAA,EAAGoD,CAAAA,EAAkB,CAAC,CAAA,OAAA,CAAA,CAClD,CAAA,CAAA,CAAA,CAnCMD,CAqCV,CAEJ,CAAC,CAAA,CACH,CAAA,CAGCnE,CAAAA,GAAS,KAAA,EACRnK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKuN,EAAAA,CACL,GAAA,CAAI,MAAA,CACJ,SAAA,CAAU,oCACZ,CAAA,CACAzN,eAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAA,CAAAH,CAAAA,CAAE,uBAAuB,CAAA,CAAE,GAAA,CAAA,CAAC,CAAA,CACnCK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BAAA,CACb,QAAA,CAAAiL,CAAAA,CACG,QAAA,CACAI,GAAe,IAAA,CACb,CAAA,CAAA,EAAIA,CAAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAC1B,QAAA,CACR,CAAA,CAAA,CACF,CAAA,CAIFvL,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,QAAK,SAAA,CAAU,qCAAA,CACb,QAAA,CACGL,CAAAA,CADHsK,CAAAA,GAAS,KAAA,CACJ,sBAAA,CACA,yBADsB,CAAA,CAE9B,CAAA,CACAjK,cAAAA,CAACuO,oBAAAA,CAAA,CAEC,SAAA,CAAS,IAAA,CACT,WAAA,CAAY,IACZ,MAAA,CAAO,IAAA,CACP,IAAA,CAAK,IAAA,CACL,KAAA,CAAO,KAAA,CAAMpE,CAAQ,CAAA,CAAI,MAAA,CAAYA,CAAAA,CACrC,aAAA,CAAgBqC,CAAAA,EAAM,CACpBoB,CAAAA,CAAiBpB,CAAC,EACpB,EACA,QAAA,CAAU,CAAA,CACV,IAAA,CAAMvC,CAAAA,GAAS,KAAA,CAAQ,GAAA,CAAO,CAAA,CAC9B,aAAA,CACEA,CAAAA,GAAS,KAAA,CACL,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAC3B,CAAE,qBAAA,CAAuB,CAAE,CAAA,CAEjC,YAAA,CACEA,CAAAA,GAAS,KAAA,CACPjK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,GAAA,CAAC,CAAA,CAC1C,MAAA,CAEN,UAAA,CAAY,CACV,YAAA,CACE,6FAAA,CACF,KAAA,CAAO,SACT,CAAA,CAAA,CAzBKiK,CA0BP,CAAA,CAGAjK,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACZ,QAAA,CAAAiK,CAAAA,GAAS,KAAA,CACRnK,eAAAA,CAAA0O,mBAAAA,CAAA,CACG,QAAA,CAAA,CAAA,CAAC,CAAA,CAAG,CAAA,CAAG,GAAI,GAAG,CAAA,CAAE,GAAA,CAAKC,CAAAA,EACpB3O,eAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IACP8N,CAAAA,CACE,IAAA,CAAK,KAAA,CAAA,CAAA,CACD,KAAA,CAAMzD,CAAQ,CAAA,CAAI,EAAIA,CAAAA,EAAYsE,CAAAA,EAAO,GAC7C,CAAA,CAAI,GACN,CAAA,CAEF,SAAA,CAAU,4HAAA,CACX,QAAA,CAAA,CAAA,GAAA,CACGA,CAAAA,CAAI,GAAA,CAAA,CAAA,CAXDA,CAYP,CACD,CAAA,CACDzO,cAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAM,CAEf,CAAA,CACA,SAAA,CAAU,4HAAA,CAET,QAAA,CAAAL,CAAAA,CAAE,YAAY,CAAA,CACjB,CAAA,CAAA,CACF,CAAA,CAEAG,eAAAA,CAAA0O,mBAAAA,CAAA,CACG,WAAC,EAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAKE,CAAAA,EACb5O,eAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,SACL,OAAA,CAAS,IAAM,CAEf,CAAA,CACA,SAAA,CAAU,4HAAA,CAET,QAAA,CAAA,CAAA4O,CAAAA,CAAI,MAPAA,CAQP,CACD,CAAA,CACD1O,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM,CAEf,CAAA,CACA,SAAA,CAAU,4HAAA,CAET,QAAA,CAAAL,CAAAA,CAAE,YAAY,EACjB,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGC,CAAC,KAAA,CAAMwK,CAAQ,CAAA,EAAKA,CAAAA,CAAW,CAAA,EAC9BrK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,QAAK,SAAA,CAAU,yBAAA,CACb,QAAA,CACGL,CAAAA,CADHsK,CAAAA,GAAS,KAAA,CACJ,4BAAA,CACA,gCAD4B,CAAA,CAEpC,CAAA,CACAnK,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CAAqC,QAAA,CAAA,CAAA,GAAA,CAAA,CAChDmK,CAAAA,GAAS,MAAQoC,CAAAA,CAAkBH,CAAAA,EAAe,OAAA,CAAQ,CAAC,CAAA,CAAA,CAChE,CAAA,CAAA,CACF,CAAA,CAIFlM,cAAAA,CAAC8F,SAAAA,CAAA,CACC,KAAA,CAAOmI,CAAAA,CACP,SAAA,CAAS,IAAA,CACT,MAAA,CAAO,IAAA,CACP,KAAK,IAAA,CACL,UAAA,CAAY,CAACR,CAAAA,EAAWV,CAAAA,CACxB,SAAA,CAAWA,CAAAA,CACX,OAAA,CAASc,CAAAA,CAER,QAAA,CAAAC,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CCtTO,SAASa,EAAAA,CAAgB,CAC9B,KAAA,CAAApU,CAAAA,CACA,MAAA,CAAA4J,CAAAA,CACA,WAAA,CAAAoF,CAAAA,CACA,cAAA,CAAAD,CAAAA,CACA,KAAA,CAAAsF,CACF,CAAA,CAAyB,CACvB,GAAM,CACJ,OAAA,CAAA/F,CAAAA,CACA,IAAA,CAAAoB,CAAAA,CACA,QAAA,CAAAE,CAAAA,CACA,aAAA,CAAA+B,CAAAA,CACA,eAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAAhB,CAAAA,CACA,eAAA,CAAAO,CAAAA,CACA,eAAAC,CAAAA,CACA,gBAAA,CAAAZ,CAAAA,CACA,YAAA,CAAA8B,CAAAA,CACA,UAAA,CAAAJ,CAAAA,CACA,UAAA,CAAA3C,CAAAA,CACA,OAAA,CAAAsC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,MAAA,CAAAU,CACF,CAAA,CAAI7D,GAAa,CACf,MAAA,CAAAjF,CAAAA,CACA,WAAA,CAAAoF,CAAAA,CACA,cAAA,CAAAD,CAAAA,CACA,KAAA,CAAAsF,CACF,CAAC,CAAA,CAGKC,CAAAA,CAAsBC,+BAAAA,CAAgB7B,CAAM,CAAA,CAElD,OACEjN,eAACwN,EAAAA,CAAA,CACC,KAAA,CAAOjT,CAAAA,CACP,MAAA,CAAQ4J,CAAAA,CACR,OAAA,CAAS0E,CAAAA,CACT,IAAA,CAAMoB,CAAAA,CACN,QAAA,CAAUE,CAAAA,CACV,aAAA,CAAe+B,CAAAA,CACf,eAAA,CAAiBE,CAAAA,CACjB,gBAAiBC,CAAAA,CACjB,WAAA,CAAahB,CAAAA,CACb,eAAA,CAAiBO,CAAAA,CACjB,cAAA,CAAgBC,CAAAA,CAChB,gBAAA,CAAkBZ,CAAAA,CAClB,YAAA,CAAc8B,CAAAA,CACd,OAAA,CAASJ,CAAAA,CAAW,OAAA,CACpB,gBAAA,CAAkBA,CAAAA,CAAW,OAC7B,eAAA,CAAiB3C,CAAAA,CACjB,YAAA,CAAcsC,CAAAA,CACd,gBAAA,CAAkBC,CAAAA,CAClB,QAAA,CAAUsC,CAAAA,CACZ,CAEJ,CC5EA,SAASE,EAAAA,EAAY,CACnB,OACEjP,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,uBAAA,CAAwB,EAC5CZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,8BAAA,CAA+B,CAAA,CACnDd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,EAC1CZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAEJ,CAOO,SAASoO,EAAAA,CAAoB,CAClC,WAAA,CAAAC,CAAAA,CAAc,CAChB,CAAA,CAA6B,CAC3B,OACEnP,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,sCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,+CAAA,CAAgD,CAAA,CACpEd,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,6BAAA,CAA8B,CAAA,CAClDZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,oCAAA,CAAqC,CAAA,CAAA,CAC3D,GACF,CAAA,CAGAZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,0CAAA,CAA2C,CAAA,CAG/Dd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,sBAAsB,CAAA,CAC1CZ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACU,CAAAA,CAAGC,CAAAA,GACjCX,eAACY,WAAAA,CAAA,CAAiB,SAAA,CAAU,qBAAA,CAAA,CAAbD,CAAmC,CACnD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAGAX,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,OAAQiP,CAAY,CAAC,CAAA,CAAE,GAAA,CAAI,CAACvO,CAAAA,CAAGC,CAAAA,GAC3CX,cAAAA,CAAC+O,EAAAA,CAAA,EAAA,CAAepO,CAAG,CACpB,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAGO,SAASuO,EAAAA,EAAoB,CAClC,OACEpP,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iGAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,UAAU,+BAAA,CAAgC,CAAA,CACpDd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8BAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAC1CZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,UAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAAA,CAEAd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAC1CZ,cAAAA,CAACY,YAAA,CAAS,SAAA,CAAU,qBAAA,CAAsB,CAAA,CAAA,CAC5C,CAAA,CAEAd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,CAAA,CAC7CZ,eAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,CAAA,CAAA,CAC/C,CAAA,CAEAZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,wBAAA,CAAyB,CAAA,CAE7CZ,cAAAA,CAACY,WAAAA,CAAA,CAAS,SAAA,CAAU,yBAAyB,CAAA,CAAA,CAC/C,CAEJ,CC5DO,IAAMuO,EAAAA,CAAkBtc,CAAAA,EAAiC,CAC9D,GAAM,CAAE,wBAAA,CAAAuc,CAAAA,CAA0B,UAAA,CAAAC,CAAAA,CAAa7N,EAAoB,CAAA,CAAI3O,EAGjEyc,CAAAA,CAA4B7N,EAAAA,CAAmB4N,CAAU,CAAA,CACzDE,CAAAA,CAAgB5N,EAAAA,CAAqB0N,CAAU,CAAA,CAG/CG,CAAAA,CAAmB7Q,aAAAA,CACvB,IAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAClC,CAAC0Q,CAAU,CACb,CAAA,CAEM1c,CAAAA,CAASD,CAAAA,EAAiB,CAE1B,CACJ,IAAA,CAAM6H,CAAAA,CACN,SAAA,CAAWkV,CAAAA,CACX,KAAA,CAAOC,CACT,CAAA,CAAIhc,GAAkB,CAAE,EAAA,CAAIb,CAAAA,CAAO,OAAA,CAAS,iBAAA,CAAmB,IAAK,CAAC,CAAA,CAG/D8c,CAAAA,CAAqBhR,aAAAA,CAAQ,IAAM,CACvC,GAAI4Q,CAAAA,EAAiB,IAAA,CAAM,OAAOC,EAAmBD,CAAAA,CAErD,IAAMtL,CAAAA,CAAU1J,CAAAA,EAAO,OAAA,CACvB,OAAK0J,CAAAA,EAAS,MAAA,CACP,KAAK,GAAA,CAAI,GAAGA,CAAAA,CAAQ,GAAA,CAAKiB,CAAAA,EAAMA,CAAAA,CAAE,QAAQ,CAAC,EADpBsK,CAE/B,CAAA,CAAG,CAACA,CAAAA,CAAkBD,CAAAA,CAAehV,CAAAA,EAAO,OAAO,CAAC,CAAA,CAE9C,CACJ,IAAA,CAAMqV,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,KAAA,CAAOpN,CACT,EAAIlL,EAAAA,CAAuBgD,CAAAA,EAAO,YAAA,EAAgB,EAAA,CAAI,CACpD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAO,YACpB,CAAC,CAAA,CAGKuV,CAAAA,CAAiBnR,aAAAA,CAAQ,IACxBpE,CAAAA,EAAO,SAGV6U,CAAAA,EAA4BA,CAAAA,CAAyB,MAAA,CAAS,CAAA,CAC1DA,CAAAA,CACG,KAAA,CAAM,CAAA,CAAG,CAAyB,CAAA,CAClC,GAAA,CAAK5Z,CAAAA,EAAW+E,CAAAA,CAAM,OAAA,CAAS,IAAA,CAAM2K,CAAAA,EAAMA,CAAAA,CAAE,SAAW1P,CAAM,CAAC,CAAA,CAC/D,MAAA,CAAQ0P,CAAAA,EAAMA,CAAAA,GAAM,MAAS,CAAA,CAChC,CAAC,GAAG3K,CAAAA,CAAM,OAAO,CAAA,CACd,IAAA,CAAK,CAAC0E,CAAAA,CAAGC,IAAM,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAC,CAAA,CAC5D,KAAA,CAAM,CAAA,CAAG,CAAyB,CAAA,EAE5B,GAAA,CAAKiG,GAAMA,CAAAA,CAAE,MAAM,CAAA,CAZN,EAAC,CAa5B,CAACkK,CAAAA,CAA0B7U,CAAAA,EAAO,OAAO,CAAC,CAAA,CAGvCwV,CAAAA,CAAqBC,qBAAAA,CAAW,CACpC,OAAA,CAASF,CAAAA,CAAe,IAAKta,CAAAA,GAAY,CACvC,QAAA,CAAUG,EAAAA,CAA2B,CACnC,MAAA,CAAAH,CAAAA,CACA,OAAA,CAASma,CAAAA,CACT,KAAA,CAAOH,CAAAA,CACP,cAAA,CAAgBF,CAClB,CAAC,CAAA,CACD,OAAA,CAAS,IACP1Z,EAAAA,CAAwBjD,CAAAA,CAAQ,CAC9B,MAAA,CAAA6C,CAAAA,CACA,OAAA,CAASma,CAAAA,CACT,KAAA,CAAOH,EACP,cAAA,CAAgBF,CAClB,CAAC,CAAA,CACH,OAAA,CAASQ,CAAAA,CAAe,MAAA,CAAS,CACnC,EAAE,CACJ,CAAC,CAAA,CAEKG,CAAAA,CAAwBF,CAAAA,CAAmB,IAAA,CAAMG,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,CAElEC,CAAAA,CAAoBxR,aAAAA,CAAQ,IAAM,CACtC,IAAMiO,CAAAA,CAAS,IAAI,GAAA,CACnB,OAAAkD,CAAAA,CAAe,OAAA,CAAQ,CAACta,CAAAA,CAAQqF,CAAAA,GAAU,CACxC,IAAML,CAAAA,CAAQuV,CAAAA,CAAmBlV,CAAK,CAAA,EAAG,KAAA,CACrCL,CAAAA,EACFoS,CAAAA,CAAO,IAAIpX,CAAAA,CAAQgF,CAAK,EAE5B,CAAC,CAAA,CACMoS,CACT,CAAA,CAAG,CAACkD,CAAAA,CAAgBC,CAAkB,CAAC,CAAA,CAGjCK,CAAAA,CAAezR,aAAAA,CAAQ,IAAM,CACjC,IAAM0R,CAAAA,CAAM,IAAI,GAAA,CAChB,OAAAP,CAAAA,CAAe,OAAA,CAAQ,CAACta,CAAAA,CAAQqF,CAAAA,GAAU,CACxC,IAAMK,CAAAA,CAAO6U,CAAAA,CAAmBlV,CAAK,CAAA,EAAG,IAAA,CACpCK,GACFmV,CAAAA,CAAI,GAAA,CAAI7a,CAAAA,CAAQ0F,CAAI,EAExB,CAAC,CAAA,CACMmV,CACT,CAAA,CAAG,CAACP,CAAAA,CAAgBC,CAAkB,CAAC,CAAA,CAEvC,OAAO,CACL,MAAAxV,CAAAA,CACA,cAAA,CAAAkV,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,MAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAApN,CAAAA,CAEA,cAAA,CAAgB6M,CAAAA,CAChB,YAAA,CAAAc,CAAAA,CACA,qBAAA,CAAAH,EACA,iBAAA,CAAAE,CACF,CACF,EClHA,IAAMpH,EAAAA,CAAYC,mBAAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAA,CAO1C,SAASsH,EAAAA,CAAmBrM,CAAAA,CAGjC,CACA,GAAM,CAAE,OAAAhJ,CAAO,CAAA,CAAIwO,uBAAAA,EAAQ,CAErBC,CAAAA,CADUC,0BAAAA,EAAW,CACE,IAAA,CAC1BC,CAAAA,EAAMA,CAAAA,CAAE,cAAA,GAAmBC,oBAAAA,CAAe,MAAA,EAAUD,CAAAA,CAAE,WACzD,CAAA,CACME,EAAkB7O,CAAAA,GAAW,eAAA,CAC7BsV,CAAAA,CAAU7G,CAAAA,EAAc,OAAA,CAExB,CAAE,IAAA,CAAMsB,CAAAA,CAAkB,SAAA,CAAAvM,CAAU,CAAA,CAAI0M,gCAAAA,CAC5C,CAAE,KAAA,CAAOC,WAAAA,CAAM,MAAA,CAAQ,QAASmF,CAAAA,EAAW,EAAG,CAAA,CAC9C,CACE,OAAA,CAASzG,CAAAA,EAAmB,CAAA,CAAQyG,CAAAA,CACpC,eAAA,CAAiB,GACnB,CACF,CAAA,CA2BA,OAAO,CAAE,QAAA,CAzBQ5R,aAAAA,CAA4B,IAAM,CACjD,IAAM0R,CAAAA,CAAM,IAAI,GAAA,CAChB,GAAI,CAACrF,CAAAA,EAAkB,UAAA,EAAc/G,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,OAAOoM,CAAAA,CAGlE,IAAMG,CAAAA,CAAgB,IAAI,GAAA,CAC1B,IAAA,IAAWjF,CAAAA,IAAKP,CAAAA,CAAiB,UAAA,CAC/BwF,CAAAA,CAAc,GAAA,CAAIjF,CAAAA,CAAE,OAAA,CAAS,UAAA,CAAWA,CAAAA,CAAE,MAAM,CAAC,CAAA,CAGnD,IAAA,IAAWpH,CAAAA,IAAUF,EAAS,CAC5B,IAAM6E,CAAAA,CAAc3E,CAAAA,CAAO,QAAA,CAAS4E,EAAS,CAAA,CAC7C,GAAI,CAACD,CAAAA,CAAa,SAElB,IAAM2H,CAAAA,CAAYD,CAAAA,CAAc,GAAA,CAAI1H,CAAAA,CAAY,OAAO,CAAA,EAAK,CAAA,CACtD4H,CAAAA,CAAWF,CAAAA,CAAc,GAAA,CAAI1H,CAAAA,CAAY,MAAM,CAAA,EAAK,CAAA,CAAA,CAEtD2H,CAAAA,CAAY,CAAA,EAAKC,CAAAA,CAAW,CAAA,GAC9BL,CAAAA,CAAI,GAAA,CAAIlM,CAAAA,CAAO,OAAQ,CAAE,SAAA,CAAAsM,CAAAA,CAAW,QAAA,CAAAC,CAAS,CAAC,EAElD,CAEA,OAAOL,CACT,CAAA,CAAG,CAACrF,CAAAA,CAAkB/G,CAAO,CAAC,CAAA,CAEX,UAAAxF,CAAU,CAC/B,CC3DA,SAASkS,EAAAA,CAAaC,CAAAA,CAAY,CAChC,GAAM,CAAE,EAAA,CAAAC,CAAAA,CAAI,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAAjW,CAAAA,CAAO,UAAA,CAAAkW,EAAY,MAAA,CAAAC,CAAO,CAAA,CAAIJ,CAAAA,CAC9C,OAAI/V,CAAAA,GAAUkW,CAAAA,CAAa,CAAA,EAAKF,CAAAA,EAAM,IAAA,EAAQC,CAAAA,EAAM,IAAA,CAAa,IAAA,CAG/DhR,eAAAA,CAAC,GAAA,CAAA,CAEC,QAAA,CAAA,CAAAA,gBAAC,QAAA,CAAA,CAAO,EAAA,CAAI+Q,CAAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,CAAA,CAAG,CAAA,CAAG,IAAA,CAAME,CAAAA,CAAQ,OAAA,CAAS,EAAA,CACnD,QAAA,CAAA,CAAAhR,cAAAA,CAAC,SAAA,CAAA,CACC,aAAA,CAAc,GAAA,CACd,OAAO,OAAA,CACP,GAAA,CAAI,IAAA,CACJ,WAAA,CAAY,YAAA,CACd,CAAA,CACAA,cAAAA,CAAC,SAAA,CAAA,CACC,cAAc,SAAA,CACd,MAAA,CAAO,aAAA,CACP,GAAA,CAAI,IAAA,CACJ,WAAA,CAAY,YAAA,CACd,CAAA,CAAA,CACF,EAEAA,cAAAA,CAAC,QAAA,CAAA,CAAO,EAAA,CAAI6Q,CAAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,CAAA,CAAG,CAAA,CAAG,IAAA,CAAME,CAAAA,CAAQ,CAAA,CAAA,CAC9C,CAEJ,CAGA,IAAMC,EAAAA,CAAe,CACnB,CAAE,MAAA,CAAQ,4BAAA,CAA8B,EAAA,CAAI,cAAe,CAAA,CAC3D,CAAE,MAAA,CAAQ,8BAAA,CAAgC,EAAA,CAAI,cAAe,CAAA,CAC7D,CAAE,MAAA,CAAQ,4BAAA,CAA8B,EAAA,CAAI,cAAe,EAC3D,CAAE,MAAA,CAAQ,4BAAA,CAA8B,EAAA,CAAI,cAAe,CAC7D,CAAA,CAGA,SAASC,EAAAA,CACPC,CAAAA,CACA9B,CAAAA,CACQ,CACR,IAAM+B,CAAAA,CAAO,IAAI,IAAA,CAAKD,EAAY,GAAI,CAAA,CAEtC,OAAQ9B,CAAAA,EACN,KAAK9N,CAAAA,CAAW,OAAA,CAEd,OAAO6P,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,UACR,MAAA,CAAQ,KACV,CAAC,CAAA,CACH,KAAK7P,CAAAA,CAAW,QAAA,CAChB,KAAKA,CAAAA,CAAW,SAAA,CAEd,OAAO6P,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,KAAA,CAAO,QACP,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,KACV,CAAC,CAAA,CACH,KAAK7P,CAAAA,CAAW,GAAA,CAChB,QAEE,OAAO6P,CAAAA,CAAK,mBAAmB,OAAA,CAAS,CACtC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SACP,CAAC,CACL,CACF,CAiCA,SAASC,EAAAA,CACPjB,CAAAA,CACAkB,CAAAA,CACAjC,CAAAA,CACmB,CACnB,IAAMkC,CAAAA,CAAiB7P,EAAAA,CAA4B2N,CAAU,CAAA,CAGvDmC,CAAAA,CAAkD,IAAI,GAAA,CAE5DpB,CAAAA,CAAa,OAAA,CAAQ,CAACqB,CAAAA,CAAU/c,CAAAA,GAAiB,CAC/C,IAAM2b,CAAAA,CAAM,IAAI,KACDoB,CAAAA,CAAS,YAAA,EAAgB,EAAC,EAClC,OAAA,CAASC,CAAAA,EAAU,CAExB,IAAMC,CAAAA,CACJD,CAAAA,CAAM,aAAA,CAAiBA,CAAAA,CAAM,aAAA,CAAgBH,CAAAA,CAC/ClB,CAAAA,CAAI,GAAA,CAAIsB,EAAQD,CAAAA,CAAM,OAAA,CAAQ,KAAK,EACrC,CAAC,CAAA,CACDF,CAAAA,CAAc,GAAA,CAAI9c,CAAAA,CAAc2b,CAAG,EACrC,CAAC,CAAA,CAGD,IAAMuB,CAAAA,CAAgB,IAAI,IAC1B,IAAA,IAAWvB,CAAAA,IAAOmB,CAAAA,CAAc,MAAA,EAAO,CACrC,IAAA,IAAWK,CAAAA,IAAMxB,CAAAA,CAAI,IAAA,EAAK,CACxBuB,CAAAA,CAAc,GAAA,CAAIC,CAAE,CAAA,CAKxB,IAAMC,CAAAA,CAAmB,MAAM,IAAA,CAAKF,CAAa,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAAG1S,CAAAA,GAAM,CAAA,CAAIA,CAAC,CAAA,CAGjE6S,CAAAA,CAAa,IAAI,GAAA,CAEvB,OAAOD,CAAAA,CAAiB,GAAA,CAAKX,GAAc,CAEzC,IAAMa,CAAAA,CAA6B,CACjC,IAAA,CAFW,IAAI,IAAA,CAAKb,CAAAA,CAAY,GAAI,CAAA,CAEzB,kBAAA,CAAmB,OAAA,CAAS,CACrC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SACP,CAAC,CAAA,CACD,SAAA,CAAAA,CACF,CAAA,CAEA,OAAAG,CAAAA,CAAc,OAAA,CAAS5c,CAAAA,EAAiB,CACtC,IAAM+O,CAAAA,CAAQ+N,CAAAA,CAAc,GAAA,CAAI9c,CAAY,CAAA,EAAG,IAAIyc,CAAS,CAAA,CAC5D,GAAI1N,CAAAA,GAAU,MAAA,CACZuO,CAAAA,CAAUtd,CAAY,CAAA,CAAI,IAAA,CAAK,KAAA,CAAM+O,CAAAA,CAAQ,GAAG,CAAA,CAAI,GAAA,CACpDsO,CAAAA,CAAW,GAAA,CAAIrd,EAAcsd,CAAAA,CAAUtd,CAAY,CAAW,CAAA,CAAA,KACzD,CAEL,IAAMud,CAAAA,CAAYF,CAAAA,CAAW,IAAIrd,CAAY,CAAA,CACzCud,CAAAA,GAAc,MAAA,GAChBD,CAAAA,CAAUtd,CAAY,CAAA,CAAIud,CAAAA,EAE9B,CACF,CAAC,CAAA,CAEMD,CACT,CAAC,CACH,CAEO,SAASE,EAAAA,CAAkB,CAChC,YAAA,CAAA9B,CAAAA,CACA,OAAA,CAAAnM,CAAAA,CAAU,EAAC,CACX,SAAA,CAAAxF,EACA,UAAA,CAAA4Q,CAAAA,CAAa9N,CAAAA,CAAW,GAAA,CACxB,YAAA,CAAA4Q,CACF,CAAA,CAA2B,CACzB,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAItW,cAAAA,CAAwB,IAAI,CAAA,CAG5DuW,EAAkBpW,YAAAA,CAAOiW,CAAY,CAAA,CAC3ChW,eAAAA,CAAU,IAAM,CACdmW,CAAAA,CAAgB,OAAA,CAAUH,EAC5B,CAAC,CAAA,CAGD,IAAMb,CAAAA,CAAgB3S,aAAAA,CAAQ,IACvByR,CAAAA,CACE,MAAM,IAAA,CAAKA,CAAAA,CAAa,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CADvB,EAAC,CAE1B,CAACA,CAAY,CAAC,CAAA,CAGXmC,CAAAA,CAAY5T,cAAQ,IACpB,CAACyR,CAAAA,EAAgBA,CAAAA,CAAa,IAAA,GAAS,CAAA,CAAU,EAAC,CAC/CiB,EAAAA,CAAsBjB,CAAAA,CAAckB,CAAAA,CAAejC,CAAU,CAAA,CACnE,CAACe,CAAAA,CAAckB,CAAAA,CAAejC,CAAU,CAAC,CAAA,CAGtCmD,CAAAA,CAAc7T,aAAAA,CAAQ,IAAM,CAChC,GAAI4T,CAAAA,CAAU,MAAA,GAAW,CAAA,EAAKjB,CAAAA,CAAc,MAAA,GAAW,CAAA,CACrD,OAAO,CAAC,CAAA,CAAG,GAAG,CAAA,CAGhB,IAAImB,CAAAA,CAAW,CAAA,CAAA,CAAA,CACXC,CAAAA,CAAW,EAAA,CAAA,CAAA,CAaf,GAXAH,CAAAA,CAAU,OAAA,CAASP,CAAAA,EAAc,CAC/BV,CAAAA,CAAc,OAAA,CAAS5c,CAAAA,EAAiB,CACtC,IAAM+O,EAAQuO,CAAAA,CAAUtd,CAAY,CAAA,CAChC+O,CAAAA,GAAU,MAAA,GACZgP,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAUhP,CAAK,CAAA,CACnCiP,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAUjP,CAAK,GAEvC,CAAC,EACH,CAAC,CAAA,CAGGgP,CAAAA,GAAa,CAAA,CAAA,CAAA,EAAYC,CAAAA,GAAa,EAAA,CAAA,CAAA,CACxC,OAAO,CAAC,CAAA,CAAG,GAAG,CAAA,CAIhB,IAAMC,CAAAA,CAAQD,CAAAA,CAAWD,EACnBG,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,EAAA,CAAK,CAAC,CAAA,CAEjCE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMJ,CAAAA,CAAWG,CAAO,CAAC,EACtDE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAK,IAAA,CAAK,IAAA,CAAKJ,CAAAA,CAAWE,CAAO,CAAC,CAAA,CAE7D,OAAO,CAACC,CAAAA,CAAWC,CAAS,CAC9B,CAAA,CAAG,CAACP,CAAAA,CAAWjB,CAAa,CAAC,CAAA,CAGvByB,CAAAA,CAAiBrW,iBAAAA,CACpB7B,CAAAA,EAAmD,CAClD,GAAI0X,CAAAA,CAAU,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAEnC,IAAMP,CAAAA,CACJnX,IAAU,IAAA,CAAO0X,CAAAA,CAAU1X,CAAK,CAAA,CAAI0X,CAAAA,CAAUA,CAAAA,CAAU,MAAA,CAAS,CAAC,CAAA,CACpE,OAAKP,CAAAA,CAEE,CACL,SAAA,CAAWA,CAAAA,CAAU,SAAA,CACrB,IAAA,CAAMA,EAAU,IAAA,CAChB,OAAA,CAASV,CAAAA,CAAc,GAAA,CAAI,CAAC5c,CAAAA,CAAcoK,CAAAA,GAAQ,CAChD,IAAMqF,CAAAA,CAASF,CAAAA,CAAQ,IAAA,CAAMiB,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAWxQ,CAAY,EAC5D,OAAO,CACL,EAAA,CAAIA,CAAAA,CACJ,KAAA,CAAOyP,CAAAA,EAAQ,WAAA,EAAe,CAAA,OAAA,EAAUrF,CAAAA,CAAM,CAAC,CAAA,CAAA,CAC/C,KAAA,CAAQkT,CAAAA,CAAUtd,CAAY,CAAA,EAAgB,CAAA,CAC9C,MAAOuc,EAAAA,CAAanS,CAAAA,CAAMmS,EAAAA,CAAa,MAAM,CAAA,CAAE,MACjD,CACF,CAAC,CACH,CAAA,CAduB,IAezB,CAAA,CACA,CAACsB,CAAAA,CAAWjB,CAAAA,CAAerN,CAAO,CACpC,EAGA9H,eAAAA,CAAU,IAAM,CACVmW,CAAAA,CAAgB,OAAA,EAAWC,CAAAA,CAAU,MAAA,CAAS,CAAA,EAChDD,CAAAA,CAAgB,OAAA,CAAQS,CAAAA,CAAe,IAAI,CAAC,EAEhD,CAAA,CAAG,CAACR,EAAWQ,CAAc,CAAC,CAAA,CAG9B5W,eAAAA,CAAU,IAAM,CACVmW,CAAAA,CAAgB,OAAA,EAClBA,CAAAA,CAAgB,OAAA,CAAQS,CAAAA,CAAeX,CAAW,CAAC,EAEvD,CAAA,CAAG,CAACA,EAAaW,CAAc,CAAC,CAAA,CAEhC,IAAMC,CAAAA,CAAkBtW,iBAAAA,CAErBuW,CAAAA,EAAe,CACV,OAAOA,CAAAA,EAAO,kBAAA,EAAuB,QAAA,EACvCZ,CAAAA,CAAeY,CAAAA,CAAM,kBAAkB,EAE3C,EACA,EACF,CAAA,CAEMC,CAAAA,CAAmBxW,iBAAAA,CAAY,IAAM,CACzC2V,CAAAA,CAAe,IAAI,EACrB,CAAA,CAAG,EAAE,CAAA,CAGL,OAAI5T,CAAAA,CAEAuB,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,kBAAA,CAAgB,CAAA,CAC5D,CAAA,CAIAuS,CAAAA,CAAU,MAAA,GAAW,CAAA,CAErBvS,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gEAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA2B,QAAA,CAAA,uBAAA,CAAqB,CAAA,CACjE,CAAA,CAKFA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAA,cAAAA,CAACmT,4BAAAA,CAAA,CAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CACvC,QAAA,CAAArT,eAAAA,CAACsT,kBAAAA,CAAA,CACC,IAAA,CAAMb,CAAAA,CACN,MAAA,CAAQ,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,EAAA,CAAI,KAAM,EAAA,CAAI,MAAA,CAAQ,CAAE,CAAA,CAClD,WAAA,CAAaS,CAAAA,CACb,YAAA,CAAcE,CAAAA,CAEd,QAAA,CAAA,CAAAlT,cAAAA,CAACqT,cAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,IAAA,CAAOzC,CAAAA,EAAU,CACf,GAAM,CAAE,CAAA,CAAA0C,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,OAAA,CAAAC,CAAAA,CAAS,KAAA,CAAA3Y,CAAM,CAAA,CAAI+V,CAAAA,CAE3B6C,CAAAA,CAAclB,CAAAA,CAAU,MAAA,CAExBmB,CAAAA,CAAkB,KAAK,GAAA,CAC3B,CAAA,CACA,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAHM,CAGiB,CACnC,CAAA,CAEME,CAAAA,CAAU9Y,CAAAA,GAAU,CAAA,CACpB+Y,CAAAA,CAAS/Y,CAAAA,GAAU4Y,CAAAA,CAAc,CAAA,CACjCI,CAAAA,CAAYhZ,EAAQ6Y,CAAAA,GAAoB,CAAA,CAE9C,OAAI,CAACC,CAAAA,EAAW,CAACC,CAAAA,EAAU,CAACC,CAAAA,CACnB,IAAA,CAIP7T,cAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAGsT,CAAAA,CACH,CAAA,CAAGC,CAAAA,CAAI,GACP,UAAA,CAAW,QAAA,CACX,IAAA,CAAK,gCAAA,CACL,QAAA,CAAU,EAAA,CAET,QAAA,CAAArC,EAAAA,CAAgBsC,CAAAA,CAAQ,KAAA,CAAOnE,CAAU,CAAA,CAC5C,CAEJ,CAAA,CACA,QAAA,CAAU,KAAA,CACV,SAAU,KAAA,CACV,QAAA,CAAU,CAAA,CACZ,CAAA,CACArP,cAAAA,CAAC8T,sBAAAA,CAAA,CACC,UAAA,CAAY,IAAA,CACZ,QAAA,CAAU,KAAA,CACV,eAAA,CAAgB,KAAA,CAChB,MAAA,CAAO,gCAAA,CACT,CAAA,CACA9T,eAAC+T,cAAAA,CAAA,CACC,MAAA,CAAQvB,CAAAA,CACR,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,KAAA,CACV,IAAA,CAAM,CAAE,QAAA,CAAU,EAAA,CAAI,IAAA,CAAM,gCAAiC,CAAA,CAC7D,aAAA,CAAgB/O,GAAkB,CAAA,EAAGA,CAAK,CAAA,CAAA,CAAA,CAC1C,KAAA,CAAO,EAAA,CACT,CAAA,CACAzD,cAAAA,CAACgU,gBAAAA,CAAA,CACC,YAAA,CAAc,CACZ,eAAA,CAAiB,6BAAA,CACjB,MAAA,CAAQ,0CAAA,CACR,YAAA,CAAc,MACd,QAAA,CAAU,MACZ,CAAA,CACA,cAAA,CAAiBvQ,CAAAA,EACfyN,EAAAA,CAAgBzN,CAAAA,CAAO4L,CAAU,EAEnC,SAAA,CAAW,CAAC5L,CAAAA,CAAewQ,CAAAA,GAAiB,CAE1C,IAAM7T,CAAAA,CADS6D,CAAAA,CAAQ,KAAMiB,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW+O,CAAI,CAAA,EAC9B,WAAA,EAAeA,CAAAA,CACrC,OAAO,CAAC,CAAA,EAAGxQ,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAAKrD,CAAK,CACvC,CAAA,CACF,CAAA,CACCkR,CAAAA,CAAc,GAAA,CAAI,CAAC5c,CAAAA,CAAcmG,CAAAA,GAChCmF,cAAAA,CAACkU,aAAAA,CAAA,CAEC,IAAA,CAAK,UAAA,CACL,OAAA,CAASxf,CAAAA,CACT,MAAA,CAAQuc,EAAAA,CAAapW,EAAQoW,EAAAA,CAAa,MAAM,CAAA,CAAE,MAAA,CAClD,WAAA,CAAa,CAAA,CACb,iBAAA,CAAmB,KAAA,CACnB,GAAA,CAAMkD,CAAAA,EACJnU,cAAAA,CAAC2Q,EAAAA,CAAA,CAEE,GAAGwD,CAAAA,CACJ,UAAA,CAAY5B,EAAU,MAAA,CAAA,CAFjB,CAAA,IAAA,EAAO7d,CAAY,CAAA,CAAA,EAAIyf,CAAAA,CAAS,KAAK,CAAA,CAG5C,CAAA,CAEF,SAAA,CAAW,KAAA,CAAA,CAbNzf,CAcP,CACD,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CACF,CAEJ,CAGO,SAAS0f,EAAAA,EAAwC,CACtD,OAAO,CACL,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAI,GAAA,CACxB,IAAA,CAAM,IAAI,IAAA,EAAK,CAAE,kBAAA,CAAmB,OAAA,CAAS,CAC3C,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SACP,CAAC,CAAA,CACD,OAAA,CAAS,EACX,CACF,CCvZO,SAASC,EAAAA,CAAsB,CACpC,YAAA,CAAA3f,CAAAA,CACA,QAAA,CAAA4f,CAAAA,CACA,UAAA,CAAAjF,CAAAA,CAAa7N,EACf,CAAA,CAAgC,CAC9B,IAAM+S,CAAAA,CAAiB9S,EAAAA,CAAmB4N,CAAU,CAAA,CAC9CE,CAAAA,CAAgB5N,EAAAA,CAAqB0N,CAAU,CAAA,CAG/CmF,CAAAA,CAAQ7V,aAAAA,CAAQ,IAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAAG,CAAC0Q,CAAU,CAAC,CAAA,CAEjEoF,CAAAA,CAAU9V,cAAQ,IAClB4Q,CAAAA,EAAiB,IAAA,CAAaiF,CAAAA,CAAQjF,CAAAA,CAEnC+E,CAAAA,EAAYE,CAAAA,CAClB,CAACA,CAAAA,CAAOjF,CAAAA,CAAe+E,CAAQ,CAAC,CAAA,CAE7B,CACJ,IAAA,CAAMlE,CAAAA,CACN,UAAA3R,CAAAA,CACA,UAAA,CAAA6J,CAAAA,CACA,KAAA,CAAA9N,CACF,CAAA,CAAI3E,EAAAA,CACF,CACE,MAAA,CAAQnB,CAAAA,CACR,OAAA,CAAA+f,CAAAA,CACA,KAAA,CAAAD,CAAAA,CACA,cAAA,CAAAD,CACF,EACA,CAAE,OAAA,CAAS,CAAC,CAAC7f,CAAa,CAC5B,CAAA,CAEA,OAAO,CACL,YAAA,CAAA0b,CAAAA,CAEA,SAAA,CAAA3R,CAAAA,CAEA,UAAA,CAAA6J,CAAAA,CACA,KAAA,CAAA9N,EACA,cAAA,CAAA+Z,CACF,CACF,CCtCA,IAAMG,EAAAA,CAAc,4BAAA,CAEdC,GAAgB,CACpB,CAAE,KAAA,CAAOpT,CAAAA,CAAW,OAAA,CAAS,KAAA,CAAO,IAAK,CAAA,CACzC,CAAE,KAAA,CAAOA,CAAAA,CAAW,QAAA,CAAU,KAAA,CAAO,IAAK,CAAA,CAC1C,CAAE,MAAOA,CAAAA,CAAW,SAAA,CAAW,KAAA,CAAO,IAAK,CAAA,CAC3C,CAAE,KAAA,CAAOA,CAAAA,CAAW,IAAK,KAAA,CAAO,KAAM,CACxC,CAAA,CA8BA,SAASoP,EAAAA,CAAaC,CAAAA,CAAY,CAChC,GAAM,CAAE,EAAA,CAAAC,CAAAA,CAAI,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAAjW,CAAAA,CAAO,UAAA,CAAAkW,CAAAA,CAAY,MAAA,CAAAC,CAAO,CAAA,CAAIJ,CAAAA,CAC9C,OAAI/V,CAAAA,GAAUkW,CAAAA,CAAa,GAAKF,CAAAA,EAAM,IAAA,EAAQC,CAAAA,EAAM,IAAA,CAAa,IAAA,CAG/DhR,eAAAA,CAAC,GAAA,CAAA,CACC,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CAAO,EAAA,CAAI+Q,CAAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,CAAA,CAAG,CAAA,CAAG,KAAME,CAAAA,CAAQ,OAAA,CAAS,EAAA,CACnD,QAAA,CAAA,CAAAhR,cAAAA,CAAC,SAAA,CAAA,CACC,aAAA,CAAc,GAAA,CACd,MAAA,CAAO,OAAA,CACP,GAAA,CAAI,IAAA,CACJ,WAAA,CAAY,YAAA,CACd,CAAA,CACAA,cAAAA,CAAC,WACC,aAAA,CAAc,SAAA,CACd,MAAA,CAAO,aAAA,CACP,GAAA,CAAI,IAAA,CACJ,WAAA,CAAY,YAAA,CACd,CAAA,CAAA,CACF,CAAA,CACAA,cAAAA,CAAC,QAAA,CAAA,CAAO,EAAA,CAAI6Q,CAAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,EAAG,CAAA,CAAG,IAAA,CAAME,CAAAA,CAAQ,CAAA,CAAA,CAC9C,CAEJ,CAEA,SAASE,EAAAA,CACPC,CAAAA,CACA9B,CAAAA,CACQ,CACR,IAAM+B,CAAAA,CAAO,IAAI,IAAA,CAAKD,CAAAA,CAAY,GAAI,CAAA,CAEtC,OAAQ9B,CAAAA,EACN,KAAK9N,CAAAA,CAAW,OAAA,CACd,OAAO6P,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SAAA,CACR,OAAQ,KACV,CAAC,CAAA,CACH,KAAK7P,CAAAA,CAAW,QAAA,CAChB,KAAKA,CAAAA,CAAW,SAAA,CACd,OAAO6P,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,KAAA,CAAO,OAAA,CACP,IAAK,SAAA,CACL,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,KACV,CAAC,CAAA,CACH,KAAK7P,CAAAA,CAAW,GAAA,CAChB,QACE,OAAO6P,CAAAA,CAAK,kBAAA,CAAmB,QAAS,CACtC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SACP,CAAC,CACL,CACF,CAEA,SAASwD,EAAAA,CAAcC,CAAAA,CAAmB,CACxC,OAAIA,CAAAA,EAAK,GAAA,CAAkB,IAAIA,CAAAA,CAAI,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACpDA,CAAAA,EAAK,GAAA,CAAc,CAAA,EAAA,CAAIA,CAAAA,CAAI,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACzCA,CAAAA,CAAE,QAAQ,CAAC,CACpB,CAEA,SAASxD,EAAAA,CACPjB,CAAAA,CACAf,CAAAA,CACa,CACb,IAAMkC,CAAAA,CAAiB7P,EAAAA,CAA4B2N,CAAU,CAAA,CACvDyF,CAAAA,CAAS1E,CAAAA,CAAa,YAAA,EAAgB,EAAC,CAGvC2E,CAAAA,CAAY,IAAI,GAAA,CACtB,IAAA,IAAWrD,CAAAA,IAASoD,CAAAA,CAAQ,CAC1B,IAAMnD,CAAAA,CAASD,CAAAA,CAAM,aAAA,CAAiBA,CAAAA,CAAM,aAAA,CAAgBH,CAAAA,CACtDyD,CAAAA,CAAWD,EAAU,GAAA,CAAIpD,CAAM,CAAA,CACrCoD,CAAAA,CAAU,GAAA,CAAIpD,CAAAA,CAAQ,CACpB,KAAA,CAAOD,CAAAA,CAAM,OAAA,CAAQ,KAAA,CACrB,MAAA,CAAA,CAASsD,CAAAA,EAAU,MAAA,EAAU,CAAA,GAAMtD,CAAAA,CAAM,QAAU,CAAA,CACrD,CAAC,EACH,CAKA,OAFe,KAAA,CAAM,IAAA,CAAKqD,CAAAA,CAAU,OAAA,EAAS,CAAA,CAAE,IAAA,CAAK,CAAC9V,CAAAA,CAAGC,CAAAA,GAAMD,CAAAA,CAAE,CAAC,CAAA,CAAIC,CAAAA,CAAE,CAAC,CAAC,CAAA,CAE3D,GAAA,CAAI,CAAC,CAACiS,CAAAA,CAAW,CAAE,KAAA,CAAA8D,CAAAA,CAAO,MAAA,CAAAC,CAAO,CAAC,CAAA,IAAO,CACrD,SAAA,CAAA/D,CAAAA,CACA,IAAA,CAAM,IAAI,IAAA,CAAKA,CAAAA,CAAY,GAAI,CAAA,CAAE,mBAAmB,OAAA,CAAS,CAC3D,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SACP,CAAC,CAAA,CACD,MAAO,IAAA,CAAK,KAAA,CAAM8D,CAAAA,CAAQ,GAAG,CAAA,CAAI,GAAA,CACjC,MAAA,CAAAC,CACF,CAAA,CAAE,CACJ,CAMO,SAASC,EAAAA,CAA0B,CACxC,YAAA,CAAA/E,CAAAA,CACA,UAAA3R,CAAAA,CACA,UAAA,CAAA4Q,CAAAA,CACA,aAAA,CAAA+F,CACF,CAAA,CAAmC,CACjC,IAAM7C,CAAAA,CAAY5T,aAAAA,CAAQ,IACnByR,CAAAA,CACEiB,EAAAA,CAAsBjB,CAAAA,CAAcf,CAAU,CAAA,CAD3B,EAAC,CAE1B,CAACe,CAAAA,CAAcf,CAAU,CAAC,CAAA,CAEvBmD,CAAAA,CAAc7T,aAAAA,CAAQ,IAAM,CAChC,GAAI4T,CAAAA,CAAU,MAAA,GAAW,CAAA,CAAG,OAAO,CAAC,EAAG,GAAG,CAAA,CAE1C,IAAIE,CAAAA,CAAW,CAAA,CAAA,CAAA,CACXC,CAAAA,CAAW,EAAA,CAAA,CAAA,CAEf,IAAA,IAAW2C,CAAAA,IAAM9C,CAAAA,CACX8C,CAAAA,CAAG,KAAA,CAAQ5C,CAAAA,GAAUA,CAAAA,CAAW4C,CAAAA,CAAG,KAAA,CAAA,CACnCA,EAAG,KAAA,CAAQ3C,CAAAA,GAAUA,CAAAA,CAAW2C,CAAAA,CAAG,KAAA,CAAA,CAGzC,GAAI5C,CAAAA,GAAa,CAAA,CAAA,CAAA,EAAYC,CAAAA,GAAa,EAAA,CAAA,CAAA,CACxC,OAAO,CAAC,CAAA,CAAG,GAAG,CAAA,CAGhB,IAAMC,EAAQD,CAAAA,CAAWD,CAAAA,CACnBG,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,EAAA,CAAK,CAAC,CAAA,CAEjCE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMJ,CAAAA,CAAWG,CAAO,CAAC,CAAA,CACtDE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAK,IAAA,CAAK,IAAA,CAAKJ,CAAAA,CAAWE,CAAO,CAAC,CAAA,CAE7D,OAAO,CAACC,CAAAA,CAAWC,CAAS,CAC9B,CAAA,CAAG,CAACP,CAAS,CAAC,CAAA,CAGd,OAAI9T,CAAAA,CAEAqB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACb,SAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,kBAAA,CAAgB,CAAA,CACxD,CAAA,CACAA,cAAAA,CAACsV,EAAAA,CAAA,CAAc,UAAA,CAAYjG,CAAAA,CAAY,aAAA,CAAe+F,CAAAA,CAAe,CAAA,CAAA,CACvE,CAAA,CAKA7C,EAAU,MAAA,GAAW,CAAA,CAErBzS,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,iCAAqB,CAAA,CAC7D,CAAA,CACAA,cAAAA,CAACsV,EAAAA,CAAA,CAAc,UAAA,CAAYjG,CAAAA,CAAY,aAAA,CAAe+F,CAAAA,CAAe,CAAA,CAAA,CACvE,CAAA,CAMFtV,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAE,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAA,cAAAA,CAACmT,4BAAAA,CAAA,CAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CACvC,QAAA,CAAArT,eAAAA,CAACsT,kBAAAA,CAAA,CACC,IAAA,CAAMb,EACN,MAAA,CAAQ,CAAE,GAAA,CAAK,EAAA,CAAI,KAAA,CAAO,EAAA,CAAI,IAAA,CAAM,EAAA,CAAI,MAAA,CAAQ,CAAE,CAAA,CAElD,QAAA,CAAA,CAAAvS,cAAAA,CAACqT,cAAAA,CAAA,CACC,OAAA,CAAQ,YACR,IAAA,CAAOzC,CAAAA,EAAU,CACf,GAAM,CAAE,CAAA,CAAA0C,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,OAAA,CAAAC,CAAAA,CAAS,KAAA,CAAA3Y,CAAM,CAAA,CAAI+V,CAAAA,CAC3B6C,CAAAA,CAAclB,EAAU,MAAA,CAExBmB,CAAAA,CAAkB,IAAA,CAAK,GAAA,CAC3B,CAAA,CACA,IAAA,CAAK,IAAA,CAAKD,CAAAA,CAHM,CAGiB,CACnC,CAAA,CACME,CAAAA,CAAU9Y,CAAAA,GAAU,CAAA,CACpB+Y,CAAAA,CAAS/Y,CAAAA,GAAU4Y,EAAc,CAAA,CACjCI,CAAAA,CAAYhZ,CAAAA,CAAQ6Y,CAAAA,GAAoB,CAAA,CAE9C,OAAI,CAACC,CAAAA,EAAW,CAACC,CAAAA,EAAU,CAACC,CAAAA,CACnB,IAAA,CAIP7T,cAAAA,CAAC,MAAA,CAAA,CACC,CAAA,CAAGsT,CAAAA,CACH,EAAGC,CAAAA,CAAI,EAAA,CACP,UAAA,CAAW,QAAA,CACX,IAAA,CAAK,gCAAA,CACL,QAAA,CAAU,EAAA,CAET,QAAA,CAAArC,EAAAA,CAAgBsC,CAAAA,CAAQ,KAAA,CAAOnE,CAAU,CAAA,CAC5C,CAEJ,CAAA,CACA,SAAU,KAAA,CACV,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,CAAA,CACZ,CAAA,CACArP,cAAAA,CAAC8T,sBAAAA,CAAA,CACC,UAAA,CAAY,IAAA,CACZ,QAAA,CAAU,KAAA,CACV,eAAA,CAAgB,KAAA,CAChB,MAAA,CAAO,iCACT,CAAA,CACA9T,cAAAA,CAAC+T,cAAAA,CAAA,CACC,MAAA,CAAQvB,CAAAA,CACR,QAAA,CAAU,KAAA,CACV,QAAA,CAAU,KAAA,CACV,IAAA,CAAM,CACJ,QAAA,CAAU,EAAA,CACV,IAAA,CAAM,gCACR,EACA,aAAA,CAAgB/O,CAAAA,EAAkB,CAAA,EAAGA,CAAK,CAAA,CAAA,CAAA,CAC1C,KAAA,CAAO,EAAA,CACT,CAAA,CACAzD,cAAAA,CAACgU,gBAAAA,CAAA,CACC,MAAA,CAAQ,CAAE,MAAA,CAAQ,gCAAiC,CAAA,CACnD,QAAS,CAAC,CAAE,MAAA,CAAAuB,CAAAA,CAAQ,OAAA,CAAA/B,CAAQ,CAAA,GAAM,CAChC,GAAI,CAAC+B,CAAAA,EAAU,CAAC/B,CAAAA,EAAS,MAAA,CAAQ,OAAO,IAAA,CACxC,IAAM6B,CAAAA,CAAK7B,CAAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAChBzO,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMsQ,CAAAA,CAAG,KAAK,CAAA,CACjC,OACEvV,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sEAAA,CACb,UAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CAAqC,QAAA,CAAA,CAAA,MAAA,CAC7CiF,CAAAA,CAAM,MAAA,CAAA,CACb,CAAA,CACAjF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CAAuB,QAAA,CAAA,CAAA,MAAA,CAC/B8U,EAAAA,CAAcS,CAAAA,CAAG,MAAM,EAAE,OAAA,CAAG,GAAA,CAChCnE,EAAAA,CAAgBmE,CAAAA,CAAG,SAAA,CAAWhG,CAAU,CAAA,CAAA,CAC3C,CAAA,CAAA,CACF,CAEJ,CAAA,CACF,CAAA,CACArP,cAAAA,CAACkU,aAAAA,CAAA,CACC,IAAA,CAAK,UAAA,CACL,QAAQ,OAAA,CACR,MAAA,CAAQQ,EAAAA,CACR,WAAA,CAAa,CAAA,CACb,iBAAA,CAAmB,KAAA,CACnB,GAAA,CAAMP,CAAAA,EACJnU,cAAAA,CAAC2Q,EAAAA,CAAA,CAEE,GAAGwD,CAAAA,CACJ,UAAA,CAAY5B,CAAAA,CAAU,QAFjB,CAAA,IAAA,EAAO4B,CAAAA,CAAS,KAAK,CAAA,CAG5B,CAAA,CAEF,SAAA,CAAW,KAAA,CACb,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAAA,CAEAnU,cAAAA,CAACsV,EAAAA,CAAA,CAAc,UAAA,CAAYjG,CAAAA,CAAY,cAAe+F,CAAAA,CAAe,CAAA,CAAA,CACvE,CAEJ,CAMA,SAASE,EAAAA,CAAc,CACrB,UAAA,CAAAjG,CAAAA,CACA,aAAA,CAAA+F,CACF,CAAA,CAGG,CACD,OACEpV,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uCAAA,CACZ,QAAA,CAAA2U,EAAAA,CAAc,GAAA,CAAKa,CAAAA,EAAQ,CAC1B,IAAMC,CAAAA,CAAWpG,CAAAA,GAAemG,CAAAA,CAAI,KAAA,CACpC,OACExV,cAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,UAAW,CAAA,8DAAA,EACTyV,CAAAA,CACI,oCAAA,CACA,sDACN,CAAA,CAAA,CACA,OAAA,CAAS,IAAML,CAAAA,GAAgBI,CAAAA,CAAI,KAAK,CAAA,CAEvC,QAAA,CAAAA,CAAAA,CAAI,KAAA,CAAA,CATAA,CAAAA,CAAI,KAUX,CAEJ,CAAC,CAAA,CACH,CAEJ,CChUO,SAASE,EAAAA,CAAmB,CAAE,YAAA,CAAAhhB,CAAa,CAAA,CAA6B,CAC7E,GAAM,CACJ,IAAA,CAAMihB,CAAAA,CACN,SAAA,CAAWC,CAAAA,CACX,KAAA,CAAOC,CACT,CAAA,CAAIjhB,EAAAA,CAAkBF,CAAAA,CAAc,CAClC,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CAAA,CAoBD,OAAO,CACL,SAAA,CAnByBiK,aAAAA,CAAmC,IAAM,CAClE,GAAI,CAACgX,CAAAA,CAAW,OAAO,IAAA,CAEvB,GAAM,CAAE,OAAA,CAAAG,CAAAA,CAAS,OAAA,CAAAC,CAAAA,CAAS,MAAA,CAAAC,EAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIN,CAAAA,CAE7C,OAAO,CACL,OAAA,CAAAG,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,UAAA,CAAYH,CAAAA,CAAQ,OAAS,CAAA,CAAIA,CAAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,CAAQ,IAAA,CACpD,UAAA,CAAYC,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,CAAQ,IAAA,CACpD,SAAA,CAAWC,EAAO,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAQ,IAAA,CACjD,SAAA,CAAWC,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAQ,IAAA,CACjD,SAAUN,CAAAA,CAAU,QAAA,EAAY,IAClC,CACF,CAAA,CAAG,CAACA,CAAS,CAAC,CAAA,CAIZ,kBAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CACF,CACF,CC5BA,SAASK,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACgB,CAChB,IAAMC,CAAAA,CAASF,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAGC,CAAS,CAAA,CACpCE,CAAAA,CAAa,CAAA,CACjB,OAAOD,CAAAA,CAAO,GAAA,CAAKE,CAAAA,GACjBD,CAAAA,EAAcC,CAAAA,CAAM,QAAA,CACb,CACL,GAAGA,CAAAA,CACH,UAAA,CAAAD,CAAAA,CACA,KAAA,CAAO,CAAA,CACP,KAAA,CAAOC,CAAAA,CAAM,KAAA,CAAQA,CAAAA,CAAM,QAC7B,CAAA,CACD,CACH,CAEA,SAASC,EAAAA,CAAWC,EAAsBC,CAAAA,CAAgB,CACxD,IAAA,IAAWC,CAAAA,IAAOF,CAAAA,CAChBE,CAAAA,CAAI,KAAA,CAAQD,CAAAA,CAAS,CAAA,CAAIC,CAAAA,CAAI,UAAA,CAAaD,CAAAA,CAAS,EAEvD,CAGA,SAASE,EAAAA,CAAYtI,EAAuB,CAE1C,OAAO,CAAA,EADO,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAQ,GAAG,CACrB,CAAA,IAAA,CACjB,CAGA,SAASuI,EAAAA,CAAUC,CAAAA,CAAqB,CACtC,OAAIA,CAAAA,EAAO,IAAkB,CAAA,EAAA,CAAIA,CAAAA,CAAM,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACxDA,CAAAA,EAAO,GAAA,CAAc,CAAA,EAAA,CAAIA,CAAAA,CAAM,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CAC7CA,EAAI,cAAA,EACb,CAOA,SAASC,EAAAA,CAAYC,CAAAA,CAAuB,CAC1C,OAAIA,CAAAA,EAAS,GAAA,CAAkB,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAQ,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,IAC7DA,CAAAA,EAAS,GAAA,CAAc,CAAA,CAAA,EAAA,CAAKA,CAAAA,CAAQ,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,CACrDA,CAAAA,EAAS,CAAA,CAAU,CAAA,CAAA,EAAIA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,GACpC,CAAA,CAAA,EAAIA,CAAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC7B,CAEA,SAASC,EAAAA,CAAQ,CACf,GAAA,CAAAN,CAAAA,CACA,IAAA,CAAA1M,CAAAA,CACA,QAAA,CAAAiN,CAAAA,CAAW,MACX,OAAA,CAAAC,CACF,CAAA,CAMG,CACD,GAAM,CAAE,CAAA,CAAAxX,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CACvBwX,CAAAA,CAAQnN,CAAAA,GAAS,KAAA,CACjBoN,CAAAA,CAAWD,CAAAA,CAAQ,gBAAkB,eAAA,CACrCE,CAAAA,CAAYF,CAAAA,CAAQ,cAAA,CAAiB,cAAA,CAE3C,OACEtX,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,4GAAA,CACV,OAAA,CAAS,IAAMqX,CAAAA,GAAUR,CAAAA,CAAI,MAAO1M,CAAI,CAAA,CAGxC,QAAA,CAAA,CAAAjK,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,0BAAA,EAA6BqX,CAAQ,mCAChD,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGV,CAAAA,CAAI,KAAA,CAAQ,GAAG,CAAA,CAAA,CAAI,EACxC,CAAA,CAEA3W,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,oCAAA,EAAuCsX,CAAS,CAAA,UAAA,CAAA,CAE1D,QAAA,CAAAJ,CAAAA,CAEKvX,CAAAA,CADFyX,CAAAA,CACI,uBAAA,CACA,uBADuB,CAAA,CAE3B,EAAA,CACN,CAAA,CAEApX,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA4W,EAAAA,CAAYD,CAAAA,CAAI,KAAK,CAAA,CACxB,CAAA,CAEA3W,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA6W,EAAAA,CAAUF,CAAAA,CAAI,QAAQ,CAAA,CACzB,CAAA,CAEA3W,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA+W,EAAAA,CAAYJ,CAAAA,CAAI,KAAK,CAAA,CACxB,CAAA,CAAA,CACF,CAEJ,CAEA,SAASY,EAAAA,CAAY,CAAE,KAAA,CAAA1c,CAAM,CAAA,CAAsB,CAEjD,IAAM2c,CAAAA,CAAS,CAAC,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAK,CAAA,CACtE,OACE1X,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,0CAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAOwX,CAAAA,CAAO3c,CAAAA,CAAQ2c,CAAAA,CAAO,MAAM,CAAE,CAAA,CAChD,CAAA,CACAxX,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,CAAA,CACxEA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,CAAA,CACxEA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,GAC1E,CAEJ,CAEA,SAASY,EAAAA,EAAW,CAClB,OACEd,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAAE,eAAC,KAAA,CAAA,EAAI,CAAA,CACLA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,CAAA,CACxEA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,CAAA,CACxEA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wDAAA,CAAyD,GAC1E,CAAA,CAEC,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQyX,EAAmB,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC/W,CAAAA,CAAGC,CAAAA,GAClDX,cAAAA,CAACuX,EAAAA,CAAA,CAA6B,KAAA,CAAO5W,GAAnB,CAAA,IAAA,EAAOA,CAAC,CAAA,CAAc,CACzC,CAAA,CAEDX,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6DAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CAAgD,CAAA,CACjE,CAAA,CAEC,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQyX,EAAmB,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC/W,CAAAA,CAAGC,CAAAA,GAClDX,cAAAA,CAACuX,EAAAA,CAAA,CAA6B,KAAA,CAAO5W,CAAAA,CAAI,CAAA,CAAA,CAAvB,OAAOA,CAAC,CAAA,CAAkB,CAC7C,CAAA,CAAA,CACH,CAEJ,CAMA,IAAM8W,EAAAA,CAAqB,CAAA,CAEpB,SAASC,EAAAA,CAAuB,CACrC,IAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,UAAAnZ,CAAAA,CAAY,KAAA,CACZ,SAAA,CAAA2X,CAAAA,CAAYqB,EAAAA,CACZ,YAAA,CAAAI,CACF,CAAA,CAAgC,CAC9B,GAAM,CAAE,CAAA,CAAAlY,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAEvB,CAAE,OAAA,CAAAkY,CAAAA,CAAS,OAAA,CAAAC,CAAAA,CAAS,MAAA,CAAAC,CAAAA,CAAQ,aAAA,CAAAC,CAAc,CAAA,CAAItZ,aAAAA,CAAQ,IAAM,CAChE,IAAMmZ,CAAAA,CAAU5B,EAAAA,CAAUyB,CAAAA,CAAMvB,CAAS,CAAA,CACnC2B,CAAAA,CAAU7B,EAAAA,CAAU0B,CAAAA,CAAMxB,CAAS,CAAA,CAGnCM,CAAAA,CAAS,IAAA,CAAK,GAAA,CAClBoB,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAG,UAAA,EAAc,CAAA,CAC3CC,EAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAG,UAAA,EAAc,CAC7C,CAAA,CACAvB,EAAAA,CAAWsB,EAASpB,CAAM,CAAA,CAC1BF,EAAAA,CAAWuB,CAAAA,CAASrB,CAAM,CAAA,CAE1B,IAAM3K,CAAAA,CAAU+L,EAAQ,CAAC,CAAA,EAAG,KAAA,EAAS,IAAA,CAC/B9L,CAAAA,CAAU+L,CAAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,EAAS,IAAA,CAEjCC,CAAAA,CAAwB,IAAA,CACxBC,CAAAA,CAA+B,IAAA,CACnC,GAAIlM,CAAAA,EAAW,MAAQC,CAAAA,EAAW,IAAA,CAAM,CACtCgM,CAAAA,CAAShM,CAAAA,CAAUD,CAAAA,CACnB,IAAMmM,CAAAA,CAAAA,CAAOnM,CAAAA,CAAUC,CAAAA,EAAW,CAAA,CAC9BkM,CAAAA,CAAM,CAAA,GACRD,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAOD,EAASE,CAAAA,CAAO,GAAK,CAAA,CAAI,GAAA,EAEzD,CAEA,OAAO,CAAE,OAAA,CAAAJ,CAAAA,CAAS,OAAA,CAAAC,CAAAA,CAAS,MAAA,CAAAC,CAAAA,CAAQ,aAAA,CAAAC,CAAc,CACnD,EAAG,CAACN,CAAAA,CAAMC,CAAAA,CAAMxB,CAAS,CAAC,CAAA,CAE1B,OAAI3X,CAAAA,CACKuB,cAAAA,CAACY,EAAAA,CAAA,EAAS,CAAA,CAGHkX,CAAAA,CAAQ,MAAA,GAAW,CAAA,EAAKC,CAAAA,CAAQ,SAAW,CAAA,CAIvD/X,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4DAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CAKFG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAI,SAAA,CAAU,mDAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,EAAK,CAAA,CACNA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAc,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAC3DK,cAAAA,CAAC,QAAK,SAAA,CAAU,YAAA,CAAc,QAAA,CAAAL,CAAAA,CAAE,6BAA6B,CAAA,CAAE,CAAA,CAC/DK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CAAc,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAAA,CAC7D,EAGAK,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACZ,QAAA,CAAA+X,CAAAA,CAAQ,GAAA,CAAI,CAACpB,CAAAA,CAAKhW,CAAAA,GACjBX,cAAAA,CAACiX,EAAAA,CAAA,CAEC,GAAA,CAAKN,CAAAA,CACL,IAAA,CAAK,MACL,QAAA,CAAUhW,CAAAA,GAAM,CAAA,CAChB,OAAA,CAASkX,CAAAA,CAAAA,CAJJlB,CAAAA,CAAI,KAKX,CACD,CAAA,CACH,CAAA,CAGCqB,CAAAA,EAAU,IAAA,EACTlY,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2GAAA,CACb,UAAAA,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAH,CAAAA,CAAE,0BAA0B,CAAA,CAAE,IAAA,CAAGiX,EAAAA,CAAYoB,CAAM,CAAA,CAAA,CACtD,CAAA,CACCC,CAAAA,EAAiB,IAAA,EAChBnY,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAmB,QAAA,CAAA,CAAA,GAAA,CAAEmY,CAAAA,CAAc,IAAA,CAAA,CAAE,CAAA,CAAA,CAEzD,CAAA,CAIFjY,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACZ,QAAA,CAAA8X,CAAAA,CAAQ,GAAA,CAAI,CAACnB,CAAAA,CAAKhW,CAAAA,GACjBX,cAAAA,CAACiX,GAAA,CAEC,GAAA,CAAKN,CAAAA,CACL,IAAA,CAAK,KAAA,CACL,QAAA,CAAUhW,CAAAA,GAAM,CAAA,CAChB,OAAA,CAASkX,CAAAA,CAAAA,CAJJlB,CAAAA,CAAI,KAKX,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CCrQO,SAASwB,EAAAA,CAAwB,CACtC,MAAA,CAAAhU,CAAAA,CACA,aAAA,CAAAiU,CACF,CAAA,CAAiC,CAC/B,GAAM,CAAE,CAAA,CAAAzY,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CACvB,CAACyY,CAAAA,CAAWC,CAAY,CAAA,CAAIvc,cAAAA,CAA0B,WAAW,CAAA,CACjE,CAACsT,CAAAA,CAAYkJ,CAAa,CAAA,CAC9Bxc,eAAyByF,EAAmB,CAAA,CAExC,CAAE,SAAA,CAAAmU,CAAAA,CAAW,kBAAA,CAAAC,CAAmB,CAAA,CAAIF,EAAAA,CAAmB,CAC3D,YAAA,CAAcvR,CAAAA,CAAO,MACvB,CAAC,CAAA,CAEK,CAAE,aAAAiM,CAAAA,CAAc,UAAA,CAAYH,CAAsB,CAAA,CACtDoE,EAAAA,CAAsB,CACpB,YAAA,CAAclQ,CAAAA,CAAO,OACrB,QAAA,CAAUA,CAAAA,CAAO,QAAA,CACjB,UAAA,CAAAkL,CACF,CAAC,CAAA,CAIGmJ,CAAAA,CAAsB9b,kBAC1B,CAAC+b,CAAAA,CAAgBC,CAAAA,GAA4B,CAC3CN,CAAAA,GAAgBjU,CAAAA,CAAQ,KAAA,CAAOuU,CAAAA,GAAa,KAAA,CAAQ,KAAA,CAAQ,MAAM,EACpE,CAAA,CACA,CAACvU,CAAAA,CAAQiU,CAAa,CACxB,CAAA,CAEMO,CAAAA,CAAqBjc,iBAAAA,CACzB,CAAC+b,CAAAA,CAAgBC,CAAAA,GAA4B,CAC3CN,CAAAA,GAAgBjU,CAAAA,CAAQ,IAAA,CAAMuU,CAAAA,GAAa,KAAA,CAAQ,KAAA,CAAQ,MAAM,EACnE,CAAA,CACA,CAACvU,CAAAA,CAAQiU,CAAa,CACxB,CAAA,CAEA,OACEtY,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAACoO,OAAAA,CAAA,CACC,OAAA,CAAQ,YAAA,CACR,WAAA,CAAamK,EACb,iBAAA,CAAoBvd,CAAAA,EAAQwd,CAAAA,CAAaxd,CAAsB,CAAA,CAC/D,UAAA,CAAY,CACV,OAAA,CAAS,SAAA,CACT,GAAA,CAAK,MACP,CAAA,CAEA,QAAA,CAAA,CAAAkF,cAAAA,CAACmO,MAAAA,CAAA,CAAoB,MAAOxO,CAAAA,CAAE,yBAAyB,CAAA,CAAA,CAA9C,WAAiD,CAAA,CAC1DK,cAAAA,CAACmO,MAAAA,CAAA,CAAmB,KAAA,CAAOxO,CAAAA,CAAE,wBAAwB,CAAA,CAAA,CAA5C,UAA+C,CAAA,CACxDK,cAAAA,CAACmO,MAAAA,CAAA,CAAgB,KAAA,CAAOxO,CAAAA,CAAE,sBAAsB,CAAA,CAAA,CAAvC,OAA0C,CAAA,CAAA,CACrD,CAAA,CAEAG,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACZ,QAAA,CAAA,CAAAuY,CAAAA,GAAc,WAAA,EACbrY,cAAAA,CAAC0X,EAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,EAAW,OAAA,EAAW,EAAC,CAC7B,IAAA,CAAMA,CAAAA,EAAW,OAAA,EAAW,EAAC,CAC7B,SAAA,CAAWC,CAAAA,CACX,YAAA,CAAc4C,CAAAA,CAChB,CAAA,CAGDH,CAAAA,GAAc,YACbrY,cAAAA,CAAC0X,EAAAA,CAAA,CACC,IAAA,CAAM/B,CAAAA,EAAW,MAAA,EAAU,EAAC,CAC5B,IAAA,CAAMA,CAAAA,EAAW,MAAA,EAAU,EAAC,CAC5B,SAAA,CAAWC,CAAAA,CACX,YAAA,CAAc+C,EAChB,CAAA,CAGDN,CAAAA,GAAc,OAAA,EACbrY,cAAAA,CAACmV,EAAAA,CAAA,CACC,YAAA,CAAc/E,CAAAA,CACd,SAAA,CAAWH,CAAAA,CACX,UAAA,CAAYZ,CAAAA,CACZ,aAAA,CAAekJ,CAAAA,CACjB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CClGA,IAAMK,EAAAA,CAAwB,CAAA,CAkB9B,SAASC,EAAAA,CAAgB1U,CAAAA,CAAwB,CAC/C,IAAMQ,CAAAA,CAAWR,CAAAA,CAAO,MAAA,CACpB,IAAA,CAAK,KAAA,CAAM,UAAA,CAAWA,CAAAA,CAAO,MAAM,CAAA,CAAI,GAAG,CAAA,CAC1C,IAAA,CACES,CAAAA,CAAUT,CAAAA,CAAO,KAAA,CACnB,KAAK,KAAA,CAAM,UAAA,CAAWA,CAAAA,CAAO,KAAK,CAAA,CAAI,GAAG,CAAA,CACzC,IAAA,CACJ,OAAO,CAAE,QAAA,CAAAQ,CAAAA,CAAU,OAAA,CAAAC,CAAQ,CAC7B,CAEO,SAASkU,EAAAA,CAAe,CAC7B,OAAA,CAAA7U,CAAAA,CACA,kBAAA,CAAA8U,CAAAA,CACA,aAAA,CAAAX,CAAAA,CACA,cAAA,CAAAY,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,CAAA,CAAArZ,CAAE,EAAIC,mBAAAA,EAAe,CACvB,CAACqZ,CAAAA,CAASC,CAAU,CAAA,CAAInd,cAAAA,CAAS,KAAK,CAAA,CACtC,CAACod,CAAAA,CAAgBC,CAAiB,CAAA,CAAIrd,cAAAA,CAAwB,IAAI,CAAA,CAExE,GAAIkI,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAEjC,IAAMhB,CAAAA,CAAUgB,CAAAA,CAAQ,OAAS2U,EAAAA,CAC3BS,CAAAA,CAAiBJ,CAAAA,CACnBhV,CAAAA,CACAA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG2U,EAAqB,EAEpCU,CAAAA,CAAgB9jB,CAAAA,EAAmB,CACvC4jB,CAAAA,CAAmB1b,CAAAA,EAAUA,CAAAA,GAASlI,CAAAA,CAAS,IAAA,CAAOA,CAAO,EAC/D,CAAA,CAEA,OACEsK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2CAAA,CACZ,UAAAuZ,CAAAA,CAAe,GAAA,CAAKlV,CAAAA,EAAW,CAC9B,GAAM,CAAE,QAAA,CAAAQ,CAAAA,CAAU,OAAA,CAAAC,CAAQ,CAAA,CAAIiU,EAAAA,CAAgB1U,CAAM,CAAA,CAC9CoV,CAAAA,CAAaJ,CAAAA,GAAmBhV,EAAO,MAAA,CAE7C,OACErE,eAAAA,CAAC,KAAA,CAAA,CAAwB,SAAA,CAAU,eAAA,CACjC,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,mGAAA,CACV,OAAA,CAAS,IAAMwZ,CAAAA,CAAanV,CAAAA,CAAO,MAAM,EACzC,IAAA,CAAK,QAAA,CACL,QAAA,CAAU,CAAA,CACV,SAAA,CAAYyB,CAAAA,EAAM,CAAA,CACZA,CAAAA,CAAE,GAAA,GAAQ,OAAA,EAAWA,CAAAA,CAAE,GAAA,GAAQ,GAAA,IACjCA,CAAAA,CAAE,cAAA,EAAe,CACjB0T,EAAanV,CAAAA,CAAO,MAAM,CAAA,EAE9B,CAAA,CAGA,QAAA,CAAA,CAAArE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,2CAAA,CACb,QAAA,CAAAmE,CAAAA,CAAO,YACV,CAAA,CAAA,CACE,IAAM,CACN,IAAMqV,CAAAA,CAAUR,CAAAA,EAAgB,GAAA,CAAI7U,CAAAA,CAAO,MAAM,CAAA,CACjD,GAAI,CAACqV,CAAAA,CAAS,OAAO,IAAA,CACrB,GAAM,CAAE,SAAA,CAAA/I,CAAAA,CAAW,QAAA,CAAAC,CAAS,CAAA,CAAI8I,CAAAA,CAChC,OAAI/I,CAAAA,EAAa,CAAA,EAAKC,CAAAA,EAAY,CAAA,CAAU,IAAA,CAE1C5Q,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACZ,UAAA2Q,CAAAA,CAAY,CAAA,EACXzQ,cAAAA,CAACE,OAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,MAAA,CACR,KAAA,CAAM,SAAA,CACN,UAAA,CAAY,CACV,IAAA,CAAM,KAAA,CACN,OAAA,CAAS,8BACX,CAAA,CAEC,QAAA,CAAAP,CAAAA,CAAE,0BAAA,CAA4B,CAC7B,MAAA,CACE8Q,CAAAA,CAAY,CAAA,GAAM,CAAA,CACdA,CAAAA,CACAA,CAAAA,CAAU,OAAA,CAAQ,CAAC,CAC3B,CAAC,CAAA,CACH,EAEDC,CAAAA,CAAW,CAAA,EACV1Q,cAAAA,CAACE,OAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,MAAA,CACR,KAAA,CAAM,WAAA,CACN,UAAA,CAAY,CACV,IAAA,CAAM,KAAA,CACN,OAAA,CAAS,8BACX,CAAA,CAEC,QAAA,CAAAP,CAAAA,CAAE,yBAAA,CAA2B,CAC5B,MAAA,CACE+Q,CAAAA,CAAW,CAAA,GAAM,CAAA,CACbA,CAAAA,CACAA,CAAAA,CAAS,OAAA,CAAQ,CAAC,CAC1B,CAAC,CAAA,CACH,GAEJ,CAEJ,CAAA,GAAG,CAAA,CACL,CAAA,CAAA,CAGE,IAAM,CACN,IAAM+I,CAAAA,CAAS9U,CAAAA,EAAY,IAAA,CACrB+U,CAAAA,CAAQ9U,CAAAA,EAAW,IAAA,CAEzB,OAAI6U,CAAAA,EAAU,CAACC,GAAS/U,CAAAA,EAAY,CAAA,CAEhC3E,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oEAAA,CACb,QAAA,CAAA,MAAA,CACH,CAAA,CAGA0Z,CAAAA,EAAS,CAACD,CAAAA,EAAU7U,CAAAA,EAAW,CAAA,CAE/B5E,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qEACb,QAAA,CAAA,OAAA,CACH,CAAA,CAGA,CAACyZ,CAAAA,EAAU,CAACC,CAAAA,CAEZ1Z,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oEAAA,CAAqE,QAAA,CAAA,IAAA,CAErF,CAAA,CAIFA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mDAAA,CACb,YAAG2E,CAAQ,CAAA,CAAA,CAAA,CACd,CAEJ,CAAA,GAAG,CAGH7E,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC8F,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,UACN,SAAA,CAAU,kCAAA,CACV,OAAA,CAAS,IAAMsS,CAAAA,GAAgBjU,CAAAA,CAAQ,KAAA,CAAO,KAAK,EAElD,QAAA,CAAAQ,CAAAA,EAAY,IAAA,CACThF,CAAAA,CAAE,2BAAA,CAA6B,CAAE,KAAA,CAAOgF,CAAS,CAAC,CAAA,CAClDhF,CAAAA,CAAE,oBAAoB,CAAA,CAC5B,CAAA,CACAK,cAAAA,CAAC8F,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,WAAA,CACN,SAAA,CAAU,sCAAA,CACV,OAAA,CAAS,IAAMsS,IAAgBjU,CAAAA,CAAQ,IAAA,CAAM,KAAK,CAAA,CAEjD,QAAA,CAAAS,CAAAA,EAAW,IAAA,CACRjF,CAAAA,CAAE,0BAAA,CAA4B,CAAE,KAAA,CAAOiF,CAAQ,CAAC,CAAA,CAChDjF,CAAAA,CAAE,mBAAmB,EAC3B,CAAA,CAAA,CACF,CAAA,CAGC4Z,CAAAA,CACCvZ,cAAAA,CAAC6F,gBAAAA,CAAA,CAAc,SAAA,CAAU,mCAAA,CAAoC,CAAA,CAE7D7F,cAAAA,CAAC2Z,kBAAAA,CAAA,CAAgB,SAAA,CAAU,mCAAA,CAAoC,CAAA,CAAA,CAEnE,CAAA,CAGCJ,GAAcR,CAAAA,EACb/Y,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCAAA,CACZ,QAAA,CAAA+Y,CAAAA,CAAmB5U,CAAM,CAAA,CAC5B,CAAA,CAAA,CAAA,CAvIMA,CAAAA,CAAO,MAyIjB,CAEJ,CAAC,CAAA,CAEAlB,CAAAA,EACCjD,eAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMkZ,CAAAA,CAAYxb,CAAAA,EAAS,CAACA,CAAI,CAAA,CACzC,SAAA,CAAU,qIAAA,CAET,QAAA,CAAAub,CAAAA,CACCnZ,eAAAA,CAAA0O,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,8BAA8B,CAAA,CAAE,CAAA,CACzCK,cAAAA,CAAC6F,gBAAAA,CAAA,CAAc,SAAA,CAAU,SAAA,CAAU,CAAA,CAAA,CACrC,CAAA,CAEA/F,eAAAA,CAAA0O,oBAAA,CACE,QAAA,CAAA,CAAAxO,cAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAAL,CAAAA,CAAE,2BAAA,CAA6B,CAC9B,KAAA,CAAOsE,CAAAA,CAAQ,MAAA,CAAS2U,EAC1B,CAAC,CAAA,CACH,CAAA,CACA5Y,cAAAA,CAAC2Z,mBAAA,CAAgB,SAAA,CAAU,SAAA,CAAU,CAAA,CAAA,CACvC,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAEJ,CCnNA,IAAMC,EAAAA,CAAkB,IAAI,IAAI,CAAC,QAAA,CAAU,YAAA,CAAc,WAAW,CAAC,CAAA,CAErE,SAAS1I,EAAAA,CAAgBW,CAAAA,CAAoB,CAC3C,IAAMT,CAAAA,CAAO,IAAI,IAAA,CAAKS,CAAAA,CAAK,GAAI,EACzBgI,CAAAA,CAAQzI,CAAAA,CAAK,cAAA,CAAe,SAAA,CAAW,CAAE,KAAA,CAAO,OAAQ,CAAC,CAAA,CACzD0I,CAAAA,CAAM1I,CAAAA,CAAK,OAAA,EAAQ,CACnB2I,CAAAA,CAAO3I,CAAAA,CAAK,WAAA,GACZ4I,CAAAA,CAAQ5I,CAAAA,CAAK,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CAClD6I,CAAAA,CAAU7I,CAAAA,CAAK,UAAA,EAAW,CAAE,QAAA,EAAS,CAAE,SAAS,CAAA,CAAG,GAAG,CAAA,CAC5D,OAAO,CAAA,EAAGyI,CAAK,CAAA,CAAA,EAAIC,CAAG,CAAA,EAAA,EAAKC,CAAI,CAAA,CAAA,EAAIC,CAAK,CAAA,CAAA,EAAIC,CAAO,CAAA,CACrD,CAQA,SAASC,EAAAA,CAAc,CAAE,MAAA,CAAA/V,CAAO,CAAA,CAA+B,CAC7D,IAAMgW,CAAAA,CAAWP,EAAAA,CAAgB,GAAA,CAAIzV,CAAAA,CAAO,MAAM,CAAA,CAE5CiW,CAAAA,CAAwBzb,aAAAA,CAAQ,IAAM,CAC1C,IAAM0b,CAAAA,CAAyB,CAC7B,KAAA,CAAO,aAAA,CACP,KAAA,CAAOnJ,EAAAA,CAAgB/M,CAAAA,CAAO,QAAQ,CAAA,CACtC,QAAA,CAAU,IACZ,CAAA,CAEMmW,CAAAA,CAA0B,CAC9B,KAAA,CAAO,gBACP,KAAA,CAAOH,CAAAA,CACHjJ,EAAAA,CAAgB/M,CAAAA,CAAO,SAAS,CAAA,CAChC,0BAAA,CACJ,QAAA,CAAUgW,CACZ,CAAA,CAEMI,CAAAA,CAA2B,CAC/B,KAAA,CAAO,kBAAA,CACP,KAAA,CAAO,0BAAA,CACP,QAAA,CAAUpW,EAAO,MAAA,GAAW,WAC9B,CAAA,CAEA,OAAO,CAACkW,CAAAA,CAAUC,CAAAA,CAAWC,CAAU,CACzC,CAAA,CAAG,CAACpW,CAAAA,CAAO,QAAA,CAAUA,CAAAA,CAAO,SAAA,CAAWA,CAAAA,CAAO,OAAQgW,CAAQ,CAAC,CAAA,CAEzDK,CAAAA,CAAmB7b,aAAAA,CAAQ,IAC3Bwb,CAAAA,CAAiB,IAAA,CAEjBhW,CAAAA,CAAO,aAAA,EAAiBA,CAAAA,CAAO,mBAAA,CAC1B,CAAA,EAAGA,CAAAA,CAAO,mBAAmB,CAAA,yBAAA,EAA4B+M,GAAgB/M,CAAAA,CAAO,cAAc,CAAC,CAAA,CAAA,CAAA,CAGjG,CAAA,sBAAA,EAAyB+M,EAAAA,CAAgB/M,CAAAA,CAAO,cAAc,CAAC,CAAA,CAAA,CAAA,CACrE,CACDgW,CAAAA,CACAhW,CAAAA,CAAO,aAAA,CACPA,CAAAA,CAAO,mBAAA,CACPA,EAAO,cACT,CAAC,CAAA,CAED,OACErE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACZ,QAAA,CAAA,CAAAsa,CAAAA,CAAM,GAAA,CAAI,CAACK,CAAAA,CAAM5f,CAAAA,GAChBiF,eAAAA,CAAC,KAAA,CAAA,CAAqB,UAAU,4BAAA,CAE9B,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gCAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,8CAAA,EACTya,CAAAA,CAAK,QAAA,CACD,2BAAA,CACA,mCACN,CAAA,CAAA,CACF,EACC5f,CAAAA,CAAQuf,CAAAA,CAAM,MAAA,CAAS,CAAA,EACtBpa,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CAA6B,CAAA,CAAA,CAEhD,CAAA,CAEAF,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,cAAA,EAAiBjF,CAAAA,CAAQuf,CAAAA,CAAM,OAAS,CAAA,CAAI,MAAA,CAAS,EAAE,CAAA,CAAA,CAElE,QAAA,CAAA,CAAApa,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gDAAA,CACb,QAAA,CAAAya,CAAAA,CAAK,KAAA,CACR,CAAA,CACAza,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sCACb,QAAA,CAAAya,CAAAA,CAAK,KAAA,CACR,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAxBQA,CAAAA,CAAK,KAyBf,CACD,CAAA,CACAD,CAAAA,EACCxa,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,0CAAA,CACV,QAAA,CAAAwa,CAAAA,CACH,GAEJ,CAEJ,CAEO,SAASE,EAAAA,CAAa,CAAE,OAAA,CAAAzW,CAAAA,CAAS,KAAA,CAAA1J,CAAAA,CAAO,MAAA,CAAAqV,CAAO,CAAA,CAAsB,CAC1E,GAAM,CAAE,CAAA,CAAAjQ,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CACvB,CAAC+a,CAAAA,CAAsBC,CAAuB,CAAA,CAAI7e,cAAAA,CAEtD,IAAI,CAAA,CAEA8e,CAAAA,CAAmB5W,CAAAA,CAAQ,MAAA,CAAQiB,CAAAA,EAAMA,CAAAA,CAAE,YAAY,EAC7D,GAAI2V,CAAAA,CAAiB,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAE1C,IAAMxW,CAAAA,CACJwW,CAAAA,CAAiB,IAAA,CAAM3V,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAWyV,CAAoB,CAAA,EAC9DE,CAAAA,CAAiB,CAAC,CAAA,CACpB,OAAKxW,CAAAA,EAAgB,YAAA,CAGnBvE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,qBAAqB,EAC1B,CAAA,CACCkb,CAAAA,CAAiB,MAAA,CAAS,CAAA,EACzB7a,cAAAA,CAAC8a,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,YAAA,CAAW,qBAAA,CACX,SAAA,CAAU,UAAA,CACV,UAAA,CAAY,CACV,OAAA,CAAS,cACT,KAAA,CAAO,SACT,CAAA,CACA,YAAA,CAAc,IAAI,GAAA,CAAI,CAACzW,CAAAA,CAAe,MAAM,CAAC,CAAA,CAC7C,iBAAA,CAAoB0W,CAAAA,EAAS,CAC3B,GAAIA,CAAAA,GAAS,MAAO,OACpB,IAAMC,CAAAA,CAAW,KAAA,CAAM,IAAA,CAAKD,CAAI,CAAA,CAC5BC,CAAAA,CAAS,MAAA,CAAS,CAAA,EACpBJ,CAAAA,CAAwBI,CAAAA,CAAS,CAAC,CAAC,EAEvC,CAAA,CAEC,SAAAH,CAAAA,CAAiB,GAAA,CAAK1W,CAAAA,EACrBnE,cAAAA,CAACib,aAAAA,CAAA,CAA+B,SAAA,CAAW9W,CAAAA,CAAO,YAChD,QAAA,CAAAnE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAAmE,CAAAA,CAAO,WAAA,CAAY,GADxCA,CAAAA,CAAO,MAExB,CACD,CAAA,CACH,CAAA,CAEFnE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAAqE,CAAAA,CAAe,YAAA,CAClB,CAAA,CAGArE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uDAAuD,QAAA,CAAA,qBAAA,CAEvE,CAAA,CACAA,cAAAA,CAACka,EAAAA,CAAA,CAAc,MAAA,CAAQ7V,CAAAA,CAAgB,CAAA,CAGvCvE,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EAAA,CACZ,QAAA,CAAA,CAAA8P,CAAAA,EAAQ,MAAA,EACP9P,eAAAA,CAAC,QACC,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,SAAA,CAAO,CAAA,CAAQ,GAAA,CAClDA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,QAAA,CAAA4P,CAAAA,CAAO,MAAA,CAAO,CAAA,CAAA,CACnD,EAEDrV,CAAAA,CAAM,MAAA,EACLuF,eAAAA,CAAC,MAAA,CAAA,CACC,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,QAAA,CAAM,CAAA,CAAQ,GAAA,CACjDA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CAAmB,SAAAzF,CAAAA,CAAM,MAAA,CAAO,CAAA,CAAA,CAClD,CAAA,CAEFuF,eAAAA,CAAC,MAAA,CAAA,CACC,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,SAAA,CAAO,CAAA,CAAQ,GAAA,CAClDA,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,iBAAA,CAAmB,QAAA,CAAAqE,CAAAA,CAAe,MAAA,CAAO,CAAA,CAAA,CAC3D,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CA7DwC,IA+D5C,CCrKA,IAAMsQ,EAAAA,CAAgB,CACpB,CAAE,KAAA,CAAOpT,CAAAA,CAAW,OAAA,CAAS,KAAA,CAAO,IAAK,CAAA,CACzC,CAAE,KAAA,CAAOA,CAAAA,CAAW,QAAA,CAAU,KAAA,CAAO,IAAK,CAAA,CAC1C,CAAE,KAAA,CAAOA,CAAAA,CAAW,SAAA,CAAW,KAAA,CAAO,IAAK,CAAA,CAC3C,CAAE,KAAA,CAAOA,CAAAA,CAAW,GAAA,CAAK,KAAA,CAAO,KAAM,CACxC,CAAA,CA8BO,SAAS2Z,EAAAA,CAAc,CAC5B,KAAA,CAAA3gB,CAAAA,CACA,MAAA,CAAAqV,CAAAA,CACA,YAAA,CAAAQ,CAAAA,CACA,UAAA,CAAAf,CAAAA,CAAa9N,CAAAA,CAAW,OAAA,CACxB,cAAA,CAAAgT,CAAAA,CACA,qBAAA,CAAAtE,CAAAA,CACA,cAAAmF,CAAAA,CACA,qBAAA,CAAA+F,CAAAA,CACA,uBAAA,CAAAC,CAAAA,CACA,aAAA,CAAAhD,CACF,CAAA,CAAuB,CACrB,GAAM,CAAE,CAAA,CAAAzY,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CACvB,CAACyb,CAAAA,CAAaC,CAAc,CAAA,CAAIvf,cAAAA,CACpCqY,EAAAA,EACF,CAAA,CACM,CAACmH,CAAAA,CAAWC,CAAY,CAAA,CAAIzf,cAAAA,CAAS,KAAK,CAAA,CAC1C0f,CAAAA,CAAcvf,YAAAA,CAAuB,IAAI,CAAA,CAE/CC,eAAAA,CAAU,IAAM,CACd,IAAMuf,CAAAA,CAAWD,CAAAA,CAAY,OAAA,CAC7B,GAAI,CAACC,CAAAA,CAAU,OAEf,IAAIC,CAAAA,CAAU,KAAA,CACVC,CAAAA,CAAQ,EAENne,CAAAA,CAAS,IAAM,CACnB,GAAM,CAAE,MAAA,CAAAoe,CAAO,CAAA,CAAIH,CAAAA,CAAS,qBAAA,EAAsB,CAK5CI,CAAAA,CAAkBH,CAAAA,CAAUE,CAAAA,CAAS,CAAA,CAAIA,CAAAA,CAAS,IAEpDC,CAAAA,GAAoBH,CAAAA,GACtBA,CAAAA,CAAUG,CAAAA,CACVN,CAAAA,CAAaM,CAAe,CAAA,EAEhC,CAAA,CAEMC,CAAAA,CAAW,IAAM,CACrB,oBAAA,CAAqBH,CAAK,CAAA,CAC1BA,CAAAA,CAAQ,qBAAA,CAAsBne,CAAM,EACtC,CAAA,CAGA,OAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUse,CAAAA,CAAU,CAC1C,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,IACX,CAAC,CAAA,CACDte,CAAAA,EAAO,CAEA,IAAM,CACX,oBAAA,CAAqBme,CAAK,CAAA,CAC1B,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUG,CAAAA,CAAU,CAAE,QAAS,IAAK,CAAC,EAClE,CACF,CAAA,CAAG,EAAE,CAAA,CAEL,IAAM9X,CAAAA,CAAUtF,aAAAA,CACd,IACE,CAAC,GAAIpE,CAAAA,CAAM,OAAA,EAAW,EAAG,CAAA,CAAE,IAAA,CACzB,CAAC0E,CAAAA,CAAGC,CAAAA,GAAM,MAAA,CAAOA,CAAAA,CAAE,QAAU,CAAC,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAE,MAAA,EAAU,CAAC,CACxD,CAAA,CACF,CAAC1E,CAAAA,CAAM,OAAO,CAChB,CAAA,CAGM,CAAE,QAAA,CAAUye,CAAe,EAAI1I,EAAAA,CAAmBrM,CAAO,CAAA,CAEzDK,CAAAA,CAAkB3F,aAAAA,CACtB,IAAM4F,4BAAAA,CAAAA,CAAwBhK,CAAAA,CAAM,MAAA,EAAU,CAAA,EAAK,GAAG,CAAA,CACtD,CAACA,CAAAA,CAAM,MAAM,CACf,EAEMyhB,CAAAA,CAAmBrd,aAAAA,CAAQ,IAAM,CACrC,GAAI,CAACpE,CAAAA,CAAM,UAAA,CAAY,OAAO,IAAA,CAC9B,IAAM6W,CAAAA,CAAO,IAAI,IAAA,CAAK7W,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CACvCsf,CAAAA,CAAQzI,CAAAA,CAAK,cAAA,CAAe,SAAA,CAAW,CAAE,KAAA,CAAO,OAAQ,CAAC,CAAA,CACzD0I,CAAAA,CAAM1I,CAAAA,CAAK,OAAA,EAAQ,CACnB2I,CAAAA,CAAO3I,CAAAA,CAAK,aAAY,CAC9B,OAAO,CAAA,EAAGyI,CAAK,CAAA,CAAA,EAAIC,CAAG,CAAA,EAAA,EAAKC,CAAI,CAAA,CACjC,CAAA,CAAG,CAACxf,CAAAA,CAAM,UAAU,CAAC,CAAA,CAErB,OACEuF,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+EAAA,CAEb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKyb,CAAAA,CAAa,SAAA,CAAU,SAAA,CAAU,CAAA,CAG3C3b,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,kGAAA,EACTyb,CAAAA,CACI,qDACA,oBACN,CAAA,CAAA,CAEA,QAAA,CAAA,CAAAvb,cAAAA,CAAC0F,SAAAA,CAAA,CACC,GAAA,CAAKnL,CAAAA,CAAM,QAAA,EAAY,MAAA,CACvB,IAAA,CAAMA,CAAAA,CAAM,KAAA,EAAS,OAAA,CACrB,MAAA,CAAO,IAAA,CACP,UAAW,CAAA,0CAAA,EACTghB,CAAAA,CACI,6BAAA,CACA,+BACN,CAAA,CAAA,CACF,CAAA,CACAzb,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACZ,QAAA,CAAA,CAAA,CAACyb,CAAAA,GACC3L,CAAAA,EAAQ,QAAA,EAAaA,CAAAA,EAAQ,IAAA,EAAQA,EAAO,IAAA,CAAK,MAAA,CAAS,CAAA,CAAA,EACzD9P,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8CAAA,CACb,QAAA,CAAA,CAAA8P,CAAAA,CAAO,QAAA,CACPA,CAAAA,CAAO,QAAA,EAAYA,CAAAA,CAAO,IAAA,EAAM,MAAA,CAAS,CAAA,EAAK,SAC9CA,CAAAA,CAAO,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,CAAA,CACzB,CAAA,CAEJ5P,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,mDAAA,EACTub,CAAAA,CAAY,sBAAA,CAAyB,oBACvC,CAAA,CAAA,CAEC,QAAA,CAAAhhB,CAAAA,CAAM,MACT,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAyF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAAF,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAEZ,QAAA,CAAA,CAAAub,CAAAA,EAAeA,CAAAA,CAAY,OAAA,CAAQ,OAAS,CAAA,EAC3Crb,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAqb,CAAAA,CAAY,OAAA,CAAQ,GAAA,CAAKlX,CAAAA,EACxBrE,eAAAA,CAAC,KAAA,CAAA,CAAoB,SAAA,CAAU,2BAAA,CAC7B,QAAA,CAAA,CAAAE,cAAAA,CAAC,OACC,SAAA,CAAU,+BAAA,CACV,KAAA,CAAO,CAAE,eAAA,CAAiBmE,CAAAA,CAAO,KAAM,CAAA,CACzC,CAAA,CACAnE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAAmE,CAAAA,CAAO,KAAA,CAAM,IALzCA,CAAAA,CAAO,EAMjB,CACD,CAAA,CACH,CAAA,CAGFnE,cAAAA,CAACkS,EAAAA,CAAA,CACC,YAAA,CAAc9B,CAAAA,CACd,UAAA,CAAYf,CAAAA,CACZ,OAAA,CAASpL,CAAAA,CACT,SAAA,CAAWgM,CAAAA,CACX,aAAe/U,CAAAA,EAASogB,CAAAA,CAAepgB,CAAI,CAAA,CAC7C,CAAA,CAGA4E,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mEACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+DAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CACE,UAAAwE,CAAAA,CAAgB,GAAA,CAAE3E,CAAAA,CAAE,sBAAsB,CAAA,CAAA,CAC7C,CAAA,CACCqc,CAAAA,EACClc,eAAAA,CAAA0O,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,MAAA,CAAQ,EAC3CA,cAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAAL,CAAAA,CAAE,uBAAA,CAAyB,CAAE,IAAA,CAAMqc,CAAiB,CAAC,CAAA,CACxD,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAEAhc,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BACZ,QAAA,CAAA2U,EAAAA,CAAc,GAAA,CAAKsH,CAAAA,EAClBjc,cAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMoV,CAAAA,GAAgB6G,CAAAA,CAAO,KAAK,CAAA,CAC3C,SAAA,CAAW,CAAA,sEAAA,EACT5M,IAAe4M,CAAAA,CAAO,KAAA,CAClB,oCAAA,CACA,sDACN,CAAA,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAO,KAAA,CAAA,CATHA,CAAAA,CAAO,KAUd,CACD,CAAA,CACH,CAAA,CAEChY,CAAAA,CAAQ,MAAA,CAAS,CAAA,EAChBjE,eAAC8a,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,aAAA,CAAc,UAAA,CACd,WAAA,CAAY,SAAA,CACZ,YAAA,CAAW,gBAAA,CACX,SAAA,CAAU,mBAAA,CACV,UAAA,CAAY,CACV,OAAA,CAAS,aAAA,CACT,MAAO,SACT,CAAA,CACA,YAAA,CACEK,CAAAA,CACI,IAAI,GAAA,CAAIA,CAAqB,CAAA,CAC7B,MAAA,CAEN,iBAAA,CAAoBJ,CAAAA,EAAS,CAC3B,GAAIA,CAAAA,GAAS,KAAA,CAAO,OACpB,IAAMC,CAAAA,CAAW,KAAA,CAAM,IAAA,CAAKD,CAAI,CAAA,CAC5BC,CAAAA,CAAS,MAAA,EAAU,CAAA,EACrBI,CAAAA,GAA0BJ,CAAQ,EAEtC,CAAA,CAEA,QAAA,CAAAhb,cAAAA,CAACkc,gBAAAA,CAAA,CACC,MAAO,CAAA,WAAA,EAAc,CAAyB,CAAA,QAAA,CAAA,CAC9C,UAAA,CAAY,CACV,OAAA,CAAS,oCACX,CAAA,CAEC,QAAA,CAAAjY,CAAAA,CAAQ,GAAA,CAAKE,CAAAA,EACZnE,cAAAA,CAACib,aAAAA,CAAA,CAEC,SAAA,CAAW9W,EAAO,WAAA,CAElB,QAAA,CAAAnE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CACb,QAAA,CAAAmE,CAAAA,CAAO,WAAA,CACV,CAAA,CAAA,CALKA,CAAAA,CAAO,MAMd,CACD,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CAEJ,GACF,CAAA,CACF,CAAA,CAGAnE,cAAAA,CAAC8Y,EAAAA,CAAA,CACC,OAAA,CAAS7U,CAAAA,CACT,aAAA,CAAemU,CAAAA,CACf,cAAA,CAAgBY,CAAAA,CAChB,kBAAA,CAAqB7U,CAAAA,EACnBnE,cAAAA,CAACmY,EAAAA,CAAA,CACC,OAAQhU,CAAAA,CACR,aAAA,CAAeiU,CAAAA,CACjB,CAAA,CAEJ,CAAA,CAGApY,cAAAA,CAAC0a,EAAAA,CAAA,CAAa,OAAA,CAASzW,CAAAA,CAAS,KAAA,CAAO1J,CAAAA,CAAO,MAAA,CAAQqV,CAAAA,CAAQ,CAAA,CAAA,CAChE,CAEJ,CC1RO,SAASuM,EAAAA,CAAkB,CAChC,OAAA,CAAAC,CAAAA,CACA,oBAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CAAoB9a,EAAAA,CACpB,aAAA,CAAA4W,CACF,CAAA,CAA2B,CACzB,GAAM,CAAC/I,CAAAA,CAAYkJ,CAAa,CAAA,CAC9Bxc,cAAAA,CAAyBugB,CAAiB,CAAA,CACtC,CAACnB,CAAAA,CAAuBoB,CAAwB,CAAA,CAAIxgB,cAAAA,CAExDsgB,CAAoB,CAAA,CAEhB,CACJ,MAAA9hB,CAAAA,CACA,cAAA,CAAAkV,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,MAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,cAAA,CAAA0E,CAAAA,CACA,YAAA,CAAAnE,CAAAA,CACA,qBAAA,CAAAH,CAAAA,CACA,iBAAA,CAAAE,CACF,CAAA,CAAIhB,EAAAA,CAAe,CACjB,OAAA,CAAAiN,CAAAA,CACA,wBAAA,CAA0BjB,CAAAA,CAC1B,UAAA,CAAA9L,CACF,CAAC,CAAA,CAGKmN,CAAAA,CAAwBtgB,YAAAA,CAAO,CAAC,CAACmgB,CAAoB,EAC3DlgB,eAAAA,CAAU,IAAM,CACd,GAAI5B,CAAAA,EAAO,OAAA,EAAW,CAACiiB,CAAAA,CAAsB,QAAS,CACpDA,CAAAA,CAAsB,OAAA,CAAU,IAAA,CAChC,IAAMC,CAAAA,CAAuB,CAAC,GAAGliB,EAAM,OAAO,CAAA,CAC3C,IAAA,CAAK,CAAC0E,CAAAA,CAAGC,CAAAA,GAAM,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAC,EAC5D,KAAA,CAAM,CAAA,CAAG,CAAyB,CAAA,CAClC,GAAA,CAAKiG,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAAA,CACtBqX,CAAAA,CAAyBE,CAAoB,EAC/C,CACF,CAAA,CAAG,CAACliB,CAAAA,EAAO,OAAO,CAAC,CAAA,CAGnB,IAAMmiB,CAAAA,CAAoB/d,aAAAA,CACxB,IAAOge,CAAAA,EAA6B,CAClCpE,CAAAA,CAAcoE,CAAQ,EACxB,CAAA,CACA,EACF,CAAA,CAEMC,CAAAA,CAA8Bje,cAClC,IAAO2S,CAAAA,EAA4B,CACjCiL,CAAAA,CAAyBjL,CAAa,EACxC,CAAA,CACA,EACF,CAAA,CAEA,OAAI7B,CAAAA,EAAkBI,CAAAA,CACb7P,cAAAA,CAACgP,EAAAA,CAAA,EAAoB,EAG1BU,CAAAA,EAAc,CAACnV,CAAAA,CAEfyF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAA0P,CAAAA,EAAY,OAAA,EAAW,iBAAA,CAC1B,CAAA,CAKF1P,cAAAA,CAACkb,EAAAA,CAAA,CACC,KAAA,CAAO3gB,EACP,MAAA,CAAQqV,CAAAA,CACR,YAAA,CAAcQ,CAAAA,CACd,UAAA,CAAYf,CAAAA,CACZ,cAAA,CAAgBkF,CAAAA,CAChB,qBAAA,CAAuBtE,CAAAA,CACvB,iBAAA,CAAmBE,CAAAA,CACnB,aAAA,CAAeuM,CAAAA,CACf,qBAAA,CAAuBvB,CAAAA,CACvB,wBAAyByB,CAAAA,CACzB,aAAA,CAAexE,CAAAA,CACjB,CAEJ,CCrEO,SAASyE,EAAAA,CAAgB,CAC9B,QAAAT,CAAAA,CACA,KAAA,CAAAxN,CAAAA,CACA,GAAGkO,CACL,CAAA,CAAyB,CACvB,GAAM,CAAE,CAAA,CAAAnd,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CACvB,CAAE,QAAA,CAAAmd,CAAS,CAAA,CAAIC,YAAAA,EAAU,CACzB,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAAA,CAAQ,OAAA,CAAAC,CAAQ,CAAA,CAAIC,gBAAAA,EAAc,CAG5C,CAAE,IAAA,CAAM7iB,CAAAA,CAAO,UAAWkV,CAAe,CAAA,CAAI/b,EAAAA,CAAkB,CACnE,EAAA,CAAI0oB,CAAAA,CACJ,iBAAA,CAAmB,IACrB,CAAC,CAAA,CAGKnY,CAAAA,CAAUtF,aAAAA,CACd,IACE,CAAC,GAAIpE,CAAAA,EAAO,SAAW,EAAG,CAAA,CAAE,IAAA,CAC1B,CAAC0E,CAAAA,CAAGC,CAAAA,GAAM,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAU,CAAC,CAAA,CAAI,MAAA,CAAOD,CAAAA,CAAE,MAAA,EAAU,CAAC,CACxD,CAAA,CACF,CAAC1E,CAAAA,EAAO,OAAO,CACjB,CAAA,CAGM,CAAC8iB,CAAAA,CAAgBC,CAAiB,CAAA,CAAIvhB,cAAAA,CAMlC,IAAI,CAAA,CAERwhB,CAAAA,CAAoB7gB,iBAAAA,CACxB,CAACyH,EAAwB0E,CAAAA,CAAuBoB,CAAAA,GAAoB,CAClEqT,CAAAA,CAAmB5f,CAAAA,GAAU,CAC3B,MAAA,CAAAyG,CAAAA,CACA,OAAA,CAAA0E,CAAAA,CACA,IAAA,CAAAoB,CAAAA,CACA,OAAA,CAAA,CAAUvM,CAAAA,EAAM,OAAA,EAAW,CAAA,EAAK,CAClC,CAAA,CAAE,CAAA,CAEEqf,CAAAA,EAAUG,CAAAA,GAChB,CAAA,CACA,CAACH,CAAAA,CAAUG,CAAM,CACnB,CAAA,CAGM7Y,CAAAA,CAAiBgZ,CAAAA,EAAgB,MAAA,EAAUpZ,CAAAA,CAAQ,CAAC,EAK1D,GAAIwL,CAAAA,CACF,OAAIsN,CAAAA,CACK/c,cAAAA,CAACgP,EAAAA,CAAA,EAAoB,CAAA,CAG5BlP,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kDAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BACb,QAAA,CAAAA,cAAAA,CAACgP,EAAAA,CAAA,EAAoB,CAAA,CACvB,CAAA,CACAhP,cAAAA,CAAC,OAAA,CAAA,CAAM,UAAU,iDAAA,CACf,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAAA,cAAAA,CAACkP,GAAA,EAAkB,CAAA,CACrB,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAQJ,IAAMsO,CAAAA,CAAeH,CAAAA,CACjB,CAAA,EAAGA,CAAAA,CAAe,MAAA,CAAO,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAe,OAAO,CAAA,CAAA,CACxDhZ,GAAgB,MAAA,EAAU,SAAA,CAE/B,OAAI0Y,CAAAA,CAEAjd,eAAAA,CAAA0O,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAA,CACb,QAAA,CAAAA,cAAAA,CAACmc,EAAAA,CAAA,CACC,QAASC,CAAAA,CACT,aAAA,CAAemB,CAAAA,CACd,GAAGT,CAAAA,CACN,CAAA,CACF,CAAA,CAGCzY,CAAAA,EACCrE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yHAAA,CACb,QAAA,CAAAA,cAAAA,CAAC8F,SAAAA,CAAA,CACC,MAAM,SAAA,CACN,IAAA,CAAK,IAAA,CACL,SAAA,CAAU,+BAAA,CACV,OAAA,CAASoX,CAAAA,CAER,QAAA,CAAAvd,CAAAA,CAAE,sBAAsB,CAAA,CAC3B,CAAA,CACF,CAAA,CAIFK,cAAAA,CAACyd,SAAAA,CAAA,CACC,OAAQR,CAAAA,CACR,OAAA,CAASE,CAAAA,CACT,SAAA,CAAU,QAAA,CACV,IAAA,CAAK,IAAA,CACL,eAAA,CAAe,IAAA,CACf,UAAA,CAAY,CACV,IAAA,CAAM,6BAAA,CACN,IAAA,CAAM,KACR,CAAA,CAEA,SAAAnd,cAAAA,CAAC0d,gBAAAA,CAAA,CACC,QAAA,CAAA1d,cAAAA,CAAC2d,aAAAA,CAAA,CACE,QAAA,CAAAtZ,CAAAA,EACCrE,cAAAA,CAAC2O,EAAAA,CAAA,CAEC,KAAA,CAAOpU,CAAAA,CACP,MAAA,CAAQ8J,CAAAA,CACR,YAAagZ,CAAAA,EAAgB,IAAA,CAC7B,cAAA,CAAgBA,CAAAA,EAAgB,OAAA,CAChC,KAAA,CAAOzO,CAAAA,CAAAA,CALF4O,CAMP,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAQF1d,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mDAEb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CACb,QAAA,CAAAA,cAAAA,CAACmc,EAAAA,CAAA,CACC,OAAA,CAASC,CAAAA,CACT,aAAA,CAAemB,CAAAA,CACd,GAAGT,CAAAA,CACN,CAAA,CACF,EAGCzY,CAAAA,EACCrE,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,iDAAA,CACf,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC2O,EAAAA,CAAA,CAEC,KAAA,CAAOpU,CAAAA,CACP,OAAQ8J,CAAAA,CACR,WAAA,CAAagZ,CAAAA,EAAgB,IAAA,CAC7B,cAAA,CAAgBA,CAAAA,EAAgB,OAAA,CAChC,KAAA,CAAOzO,CAAAA,CAAAA,CALF4O,CAMP,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CCjKA,SAAStH,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACgB,CAChB,GAAI,CAACD,CAAAA,CAAQ,OAAO,EAAC,CACrB,IAAME,CAAAA,CAASF,CAAAA,CAAO,MAAM,CAAA,CAAGC,CAAS,CAAA,CACpCE,CAAAA,CAAa,CAAA,CACXG,CAAAA,CAAuBJ,CAAAA,CAAO,GAAA,CAAKE,CAAAA,GACvCD,CAAAA,EAAcC,CAAAA,CAAM,QAAA,CACb,CAAE,GAAGA,CAAAA,CAAO,UAAA,CAAAD,EAAY,KAAA,CAAO,CAAE,CAAA,CACzC,CAAA,CAGKI,CAAAA,CAASD,CAAAA,CAAKA,CAAAA,CAAK,MAAA,CAAS,CAAC,CAAA,EAAG,UAAA,EAAc,CAAA,CACpD,IAAA,IAAWE,CAAAA,IAAOF,CAAAA,CAChBE,CAAAA,CAAI,MAAQA,CAAAA,CAAI,UAAA,CAAaD,CAAAA,CAG/B,OAAOD,CACT,CAMO,SAASmH,EAAAA,CAAa,CAC3B,YAAA,CAAAlpB,CAAAA,CACA,SAAA,CAAA0hB,CAAAA,CAAY,EAAA,CACZ,eAAA,CAAAyH,CAAAA,CAAkB,IAClB,OAAA,CAAAhV,CAAAA,CAAU,KACZ,CAAA,CAA2C,CACzC,GAAM,CACJ,IAAA,CAAMiD,CAAAA,CACN,SAAA,CAAArN,CAAAA,CACA,UAAA,CAAA6J,CACF,CAAA,CAAI1T,EAAAA,CAAkBF,CAAAA,CAAc,CAClC,eAAA,CAAiBmpB,CAAAA,EAAmB,MACtC,CAAC,CAAA,CAGKC,CAAAA,CAAUnf,aAAAA,CAAQ,IACfkK,IAAY,KAAA,CAAQiD,CAAAA,EAAW,OAAA,CAAUA,CAAAA,EAAW,MAAA,CAC1D,CAACA,CAAAA,CAAWjD,CAAO,CAAC,CAAA,CAEjBkV,CAAAA,CAAUpf,aAAAA,CAAQ,IACfkK,CAAAA,GAAY,KAAA,CAAQiD,CAAAA,EAAW,OAAA,CAAUA,CAAAA,EAAW,MAAA,CAC1D,CAACA,CAAAA,CAAWjD,CAAO,CAAC,CAAA,CAEjB8O,CAAAA,CAAOhZ,cACX,IAAMuX,EAAAA,CAAU4H,CAAAA,CAAS1H,CAAS,CAAA,CAClC,CAAC0H,CAAAA,CAAS1H,CAAS,CACrB,CAAA,CAEMwB,CAAAA,CAAOjZ,aAAAA,CACX,IAAMuX,EAAAA,CAAU6H,CAAAA,CAAS3H,CAAS,EAClC,CAAC2H,CAAAA,CAAS3H,CAAS,CACrB,CAAA,CAGM4B,CAAAA,CAASrZ,aAAAA,CAAQ,IACjBgZ,CAAAA,CAAK,MAAA,GAAW,CAAA,EAAKC,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAU,IAAA,CAC5CA,CAAAA,CAAK,CAAC,CAAA,CAAE,KAAA,CAAQD,CAAAA,CAAK,CAAC,CAAA,CAAE,KAAA,CAC9B,CAACA,CAAAA,CAAMC,CAAI,CAAC,CAAA,CAEToG,CAAAA,CAAWrf,aAAAA,CAAQ,IACnBgZ,CAAAA,CAAK,MAAA,GAAW,GAAKC,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAU,IAAA,CAAA,CAC3CD,CAAAA,CAAK,CAAC,CAAA,CAAE,KAAA,CAAQC,CAAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAS,CAAA,CACxC,CAACD,CAAAA,CAAMC,CAAI,CAAC,CAAA,CAETK,CAAAA,CAAgBtZ,aAAAA,CAAQ,IACxBqZ,CAAAA,GAAW,IAAA,EAAQgG,CAAAA,GAAa,IAAA,EAAQA,CAAAA,GAAa,CAAA,CAAU,IAAA,CAC5D,IAAA,CAAK,KAAA,CAAOhG,CAAAA,CAASgG,CAAAA,CAAY,GAAK,EAAI,GAAA,CAChD,CAAChG,CAAAA,CAAQgG,CAAQ,CAAC,CAAA,CAErB,OAAO,CACL,IAAA,CAAArG,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,MAAA,CAAAI,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,SAAA+F,CAAAA,CACA,SAAA,CAAAvf,CAAAA,CACA,UAAA,CAAA6J,CACF,CACF,CCxGA,SAAS2V,EAAAA,CAAiB,CACxB,GAAA,CAAAtH,CAAAA,CACA,IAAA,CAAA1M,CAAAA,CACA,OAAA,CAAAkN,CACF,CAAA,CAIG,CACD,IAAM+G,CAAAA,CAAQjU,CAAAA,GAAS,MACjBoN,CAAAA,CAAW6G,CAAAA,CAAQ,eAAA,CAAkB,cAAA,CACrCC,CAAAA,CAAYD,CAAAA,CAAQ,cAAA,CAAiB,aAAA,CAE3C,OACEpe,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,yGAAA,CACV,OAAA,CAAS,IAAMqX,CAAAA,GAAUR,CAAAA,CAAI,KAAK,CAAA,CAGlC,QAAA,CAAA,CAAA3W,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,mBAAA,EAAsBke,CAAAA,CAAQ,SAAA,CAAY,QAAQ,CAAA,CAAA,EAAI7G,CAAQ,CAAA,CAAA,CACzE,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGV,CAAAA,CAAI,KAAA,CAAQ,GAAG,CAAA,CAAA,CAAI,CAAA,CACxC,CAAA,CAEA7W,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAW,CAAA,0BAAA,EAA6Bqe,CAAS,CAAA,CAAA,CACpD,QAAA,CAAA,CAAAxH,CAAAA,CAAI,MAAM,MAAA,CAAA,CACb,CAAA,CACA3W,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CAAkC,QAAA,CAAA2W,CAAAA,CAAI,QAAA,CAAS,CAAA,CAC/D3W,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCAAA,CAAkC,QAAA,CAAA2W,CAAAA,CAAI,WAAW,CAAA,CAAA,CACnE,CAEJ,CAEA,SAAS/V,EAAAA,EAAW,CAClB,OACEZ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACU,CAAAA,CAAGC,CAAAA,GACjCX,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,+CAAA,CAAA,CADLW,CAEP,CACD,CAAA,CACH,CAEJ,CAMO,SAASyd,EAAAA,CAAY,CAC1B,IAAA,CAAAzG,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,MAAA,CAAAI,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,UAAAxZ,CAAAA,CACA,YAAA,CAAAoZ,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAlY,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAE7B,GAAInB,CAAAA,CACF,OACEqB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAL,EAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,cAAAA,CAACY,EAAAA,CAAA,EAAS,CAAA,CACVZ,cAAAA,CAACY,EAAAA,CAAA,EAAS,CAAA,CAAA,CACZ,CAAA,CAIJ,IAAMyd,CAAAA,CAAU1G,CAAAA,CAAK,MAAA,GAAW,GAAKC,CAAAA,CAAK,MAAA,GAAW,CAAA,CAErD,OACE9X,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAEb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yEAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qBAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACF,CAAA,CAEC0e,CAAAA,CACCre,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,EAEAG,eAAAA,CAAA0O,mBAAAA,CAAA,CAEE,QAAA,CAAA,CAAA1O,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CACpCK,eAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,uBAAuB,CAAA,CAAE,CAAA,CAClCK,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAAE,CAAA,CAAA,CACtC,CAAA,CAGAK,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uBAAA,CACZ,QAAA,CAAA4X,CAAAA,CAAK,GAAA,CAAKjB,CAAAA,EACT3W,cAAAA,CAACie,EAAAA,CAAA,CAEC,GAAA,CAAKtH,CAAAA,CACL,IAAA,CAAK,KAAA,CACL,OAAA,CAASkB,CAAAA,CAAAA,CAHJlB,CAAAA,CAAI,KAIX,CACD,CAAA,CACH,CAAA,CAGCqB,CAAAA,GAAW,IAAA,EACVlY,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sGAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CACE,QAAA,CAAA,CAAAH,CAAAA,CAAE,0BAA0B,CAAA,CAAE,IAAA,CAAGqY,EAAO,MAAA,CAAA,CAC3C,CAAA,CACCC,CAAAA,GAAkB,IAAA,EACjBnY,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,QAAA,CAAA,CAAA,GAAA,CAAEmY,CAAAA,CAAc,IAAA,CAAA,CAAE,CAAA,CAAA,CAEzD,CAAA,CAIFjY,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBACZ,QAAA,CAAA2X,CAAAA,CAAK,GAAA,CAAKhB,CAAAA,EACT3W,cAAAA,CAACie,EAAAA,CAAA,CAEC,GAAA,CAAKtH,CAAAA,CACL,IAAA,CAAK,KAAA,CACL,OAAA,CAASkB,CAAAA,CAAAA,CAHJlB,CAAAA,CAAI,KAIX,CACD,EACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CClJO,SAAS2H,EAAAA,CAAgB,CAC9B,YAAA,CAAA5pB,CAAAA,CACA,SAAA,CAAA0hB,CAAAA,CACA,eAAA,CAAAyH,CAAAA,CACA,aAAAhG,CAAAA,CACA,OAAA,CAAAhP,CACF,CAAA,CAAyB,CACvB,GAAM,CAAE,IAAA,CAAA8O,CAAAA,CAAM,IAAA,CAAAC,CAAAA,CAAM,MAAA,CAAAI,CAAAA,CAAQ,aAAA,CAAAC,CAAAA,CAAe,SAAA,CAAAxZ,CAAU,CAAA,CAAImf,EAAAA,CAAa,CACpE,YAAA,CAAAlpB,CAAAA,CACA,SAAA,CAAA0hB,CAAAA,CACA,eAAA,CAAAyH,CAAAA,CACA,OAAA,CAAAhV,CACF,CAAC,CAAA,CAED,OACE7I,cAAAA,CAACoe,EAAAA,CAAA,CACC,IAAA,CAAMzG,CAAAA,CACN,IAAA,CAAMC,CAAAA,CACN,MAAA,CAAQI,CAAAA,CACR,aAAA,CAAeC,CAAAA,CACf,SAAA,CAAWxZ,CAAAA,CACX,YAAA,CAAcoZ,CAAAA,CAChB,CAEJ,CCkBO,SAAS0G,EAAAA,CACdC,CAAAA,CAA+B,EAAC,CACX,CACrB,GAAM,CAACC,CAAAA,CAAmBC,CAAoB,CAAA,CAAI3iB,cAAAA,CAChD,IACF,EACM,CAAC4iB,CAAW,CAAA,CAAI5iB,cAAAA,CAAuB,IAAI,CAAA,CAG3C6iB,CAAAA,CAAcliB,iBAAAA,CAAamiB,GAAqB,CAIpDH,CAAAA,CAAqB,IAAI,EAC3B,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CACL,MAAA,CAAQ,EAAC,CACT,SAAA,CAAW,KAAA,CACX,UAAA,CAAY,KAAA,CACZ,iBAAA,CAAAD,CAAAA,CACA,WAAA,CAAAG,CAAAA,CACA,WAAA,CAAAD,CACF,CACF,CC9CA,SAASG,EAAAA,CAAWC,CAAAA,CAAqB,CAEvC,OADU,IAAI,IAAA,CAAKA,CAAG,CAAA,CACb,cAAA,CAAe,SAAA,CAAW,CACjC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SACV,CAAC,CACH,CAMO,SAASC,EAAAA,CAAa,CAC3B,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAxgB,CAAAA,CACA,iBAAA,CAAAggB,CAAAA,CACA,QAAA,CAAAS,CACF,CAAA,CAAsB,CACpB,GAAM,CAAE,EAAAvf,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAEvB6W,CAAAA,CAAO9X,aAAAA,CACX,IACEsgB,CAAAA,CAAO,GAAA,CAAKrU,CAAAA,GAAW,CACrB,GAAA,CAAKA,CAAAA,CAAM,EAAA,CACX,IAAA,CAAMA,CAAAA,CAAM,KACZ,OAAA,CAASA,CAAAA,CAAM,OAAA,CACf,IAAA,CAAMA,CAAAA,CAAM,IAAA,CACZ,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,MAAA,CAAQ,CAAA,EAAGA,CAAAA,CAAM,cAAc,CAAA,CAAA,EAAIA,CAAAA,CAAM,QAAQ,GACjD,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,SAAA,CAAWkU,EAAAA,CAAWlU,CAAAA,CAAM,SAAS,CAAA,CACrC,YAAA,CAAcA,CAAAA,CAAM,EAAA,GAAO6T,CAAAA,CAC3B,EAAA,CAAI7T,CAAAA,CAAM,EACZ,CAAA,CAAE,EACJ,CAACqU,CAAAA,CAAQR,CAAiB,CAC5B,CAAA,CAEA,OAAIhgB,CAAAA,CAEAqB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,SAAAL,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CACAK,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACU,CAAAA,CAAGC,CAAAA,GACjCX,cAAAA,CAAC,KAAA,CAAA,CAAY,SAAA,CAAU,0CAAA,CAAA,CAAbW,CAAwD,CACnE,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAKFb,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAA,CAAAH,CAAAA,CAAE,0BAA0B,CAAA,CAC5Bsf,CAAAA,CAAO,MAAA,CAAS,CAAA,EACfnf,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,CAAA,GAAA,CAAEmf,CAAAA,CAAO,OAAO,GAAA,CAAA,CAAC,CAAA,CAAA,CAE7D,CAAA,CAECA,CAAAA,CAAO,MAAA,GAAW,CAAA,CACjBjf,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CAEAK,cAAAA,CAAC,OAAI,SAAA,CAAU,wBAAA,CACb,QAAA,CAAAF,eAAAA,CAACqf,cAAAA,CAAA,CACC,MAAA,CAAO,MAAA,CACP,YAAA,CAAW,aAAA,CACX,SAAA,CAAU,eAAA,CAEV,QAAA,CAAA,CAAArf,eAAAA,CAACsf,cAAAA,CAAA,CACC,UAAApf,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAA,CAAO,KAAA,CAAO,EAAA,CAClC,QAAA,CAAA1f,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,UAAU,KAAA,CAAO,EAAA,CACrC,QAAA,CAAA1f,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CACAK,cAAAA,CAACqf,eAAA,CAAY,SAAA,CAAU,MAAA,CAAO,KAAA,CAAO,EAAA,CAClC,QAAA,CAAA1f,CAAAA,CAAE,yBAAyB,EAC9B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,CAAO,EAAA,CACnC,QAAA,CAAA1f,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,UAAU,QAAA,CAAS,KAAA,CAAO,EAAA,CACpC,QAAA,CAAA1f,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,QAAA,CAAS,KAAA,CAAO,EAAA,CACpC,QAAA,CAAA1f,EAAE,2BAA2B,CAAA,CAChC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAA,CAAO,KAAA,CAAO,GAAA,CAClC,QAAA,CAAA1f,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,cAAAA,CAACqf,eAAA,CAAY,SAAA,CAAU,QAAA,CAAS,KAAA,CAAO,EAAA,CAAI,KAAA,CAAM,KAAA,CAC9C,QAAA,CAAA,GAAA,CACH,CAAA,CAAA,CACF,CAAA,CACArf,cAAAA,CAACsf,YAAAA,CAAA,CACE,QAAA,CAAA7I,CAAAA,CAAK,GAAA,CAAKE,GACT7W,eAAAA,CAACyf,WAAAA,CAAA,CACC,QAAA,CAAA,CAAAvf,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,oBAAA,EACT2W,CAAAA,CAAI,IAAA,GAAS,KAAA,CAAQ,cAAA,CAAiB,aACxC,CAAA,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAI,IAAA,GAAS,KAAA,CACVhX,CAAAA,CAAE,mBAAmB,CAAA,CACrBA,CAAAA,CAAE,oBAAoB,CAAA,CAC5B,CAAA,CACF,CAAA,CACAK,cAAAA,CAACwf,YAAAA,CAAA,CACC,SAAAxf,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,QAAA,EACT2W,CAAAA,CAAI,OAAA,GAAY,KAAA,CACZ,cAAA,CACA,gBACN,CAAA,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAI,OAAA,GAAY,KAAA,CACbhX,CAAAA,CAAE,mBAAmB,EACrBA,CAAAA,CAAE,kBAAkB,CAAA,CAC1B,CAAA,CACF,CAAA,CACAK,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAA2W,CAAAA,CAAI,IAAA,CAAK,EACjD,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA,CAAA6W,CAAAA,CAAI,KAAA,CAAM,MAAA,CAAA,CAAC,CAAA,CACxC,CAAA,CACA3W,cAAAA,CAACwf,aAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2W,CAAAA,CAAI,MAAA,CAAO,CAAA,CACxC,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,QAAK,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAA2W,CAAAA,CAAI,MAAA,CAAO,CAAA,CACnD,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BAAA,CACb,QAAA,CAAA2W,EAAI,SAAA,CACP,CAAA,CACF,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CAAU,SAAA,CAAU,YAAA,CACnB,QAAA,CAAAxf,cAAAA,CAAC8F,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,MAAA,CACR,MAAM,QAAA,CACN,SAAA,CAAW6Q,CAAAA,CAAI,YAAA,CACf,OAAA,CAAS,IAAMuI,CAAAA,CAASvI,CAAAA,CAAI,EAAE,CAAA,CAE7B,QAAA,CAAAhX,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACF,CAAA,CAAA,CAAA,CApDagX,EAAI,GAqDnB,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CCxLO,SAAS8I,EAAAA,CAAiB,CAC/B,eAAA,CAAA5B,CACF,EAA2B,EAAC,CAAG,CAC7B,GAAM,CAAE,MAAA,CAAAoB,CAAAA,CAAQ,SAAA,CAAAxgB,CAAAA,CAAW,iBAAA,CAAAggB,CAAAA,CAAmB,WAAA,CAAAG,CAAY,CAAA,CAAIL,EAAAA,CAAc,CAE5E,CAAC,CAAA,CAED,OACEve,cAAAA,CAACgf,EAAAA,CAAA,CACC,MAAA,CAAQC,EACR,SAAA,CAAWxgB,CAAAA,CACX,iBAAA,CAAmBggB,CAAAA,CACnB,QAAA,CAAUG,CAAAA,CACZ,CAEJ,CCiBO,SAASc,EAAAA,CAAgB,CAC9B,MAAA,CAAAlqB,CAAAA,CACA,QAAA,CAAAmqB,CAAAA,CAAW,EACb,CAAA,CAA2B,EAAC,CAA0B,CACpD,GAAM,CAACvc,CAAAA,CAAMwc,CAAO,CAAA,CAAI7jB,cAAAA,CAAS,CAAC,CAAA,CAC5B,CAAC8jB,CAAAA,CAASC,CAAU,CAAA,CAAI/jB,cAAAA,CAAiC,CAAC,MAAS,CAAC,CAAA,CAEpEgkB,CAAAA,CAAgBF,CAAAA,CAAQzc,CAAAA,CAAO,CAAC,CAAA,CAEhCiF,CAAAA,CAAc1J,aAAAA,CAClB,KAAO,CACL,GAAInJ,CAAAA,CAAS,CAAE,MAAA,CAAAA,CAAO,EAAI,EAAC,CAC3B,KAAA,CAAOmqB,CAAAA,CACP,GAAII,CAAAA,CAAgB,CAAE,MAAA,CAAQA,CAAc,CAAA,CAAI,EAClD,CAAA,CAAA,CACA,CAACvqB,CAAAA,CAAQmqB,CAAAA,CAAUI,CAAa,CAClC,CAAA,CAEM,CAAE,IAAA,CAAA7kB,CAAAA,CAAM,SAAA,CAAAuD,CAAAA,CAAW,UAAA,CAAA6J,CAAW,CAAA,CAAIpT,EAAAA,CAAemT,CAAW,CAAA,CAE5DoJ,CAAAA,CAAWvW,CAAAA,CAEX4C,CAAAA,CAAS2T,GAAU,MAAA,EAAU,EAAC,CAC9BuO,CAAAA,CAAc,CAAC,CAACvO,CAAAA,EAAU,MAAA,CAC1BwO,CAAAA,CAAc7c,CAAAA,CAAO,CAAA,CAErB8c,CAAAA,CAAWxjB,iBAAAA,CACd6O,CAAAA,EAAc,CACTA,CAAAA,EAAK,GAAKA,CAAAA,EAAKsU,CAAAA,CAAQ,MAAA,EAAQD,CAAAA,CAAQrU,CAAC,EAC9C,CAAA,CACA,CAACsU,CAAAA,CAAQ,MAAM,CACjB,CAAA,CAEMM,CAAAA,CAAWzjB,iBAAAA,CAAY,IAAM,CAC7BsjB,GAAevO,CAAAA,EAAU,MAAA,GAC3BqO,CAAAA,CAAYpiB,CAAAA,EAAS,CACnB,IAAM0iB,CAAAA,CAAa,CAAC,GAAG1iB,CAAI,CAAA,CAC3B,OAAI0iB,CAAAA,CAAW,MAAA,GAAWhd,CAAAA,EACxBgd,CAAAA,CAAW,KAAK3O,CAAAA,CAAS,MAAO,CAAA,CAE3B2O,CACT,CAAC,CAAA,CACDR,CAAAA,CAASliB,CAAAA,EAASA,CAAAA,CAAO,CAAC,CAAA,EAE9B,CAAA,CAAG,CAACsiB,CAAAA,CAAavO,CAAAA,EAAU,MAAA,CAAQrO,CAAI,CAAC,CAAA,CAElCid,CAAAA,CAAW3jB,iBAAAA,CAAY,IAAM,CAC7BujB,CAAAA,EAAaL,CAAAA,CAASliB,CAAAA,EAASA,CAAAA,CAAO,CAAC,EAC7C,CAAA,CAAG,CAACuiB,CAAW,CAAC,EAEhB,OAAO,CACL,MAAA,CAAAniB,CAAAA,CACA,SAAA,CAAAW,CAAAA,CACA,UAAA,CAAA6J,CAAAA,CACA,IAAA,CAAAlF,CAAAA,CACA,QAAA,CAAAuc,CAAAA,CACA,WAAA,CAAAK,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAE,CACF,CACF,CCnEA,SAASvB,EAAAA,CAAW3N,CAAAA,CAA2B,CAE7C,OADU,IAAI,IAAA,CAAKA,EAAY,GAAI,CAAA,CAC1B,cAAA,CAAe,SAAA,CAAW,CACjC,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SACV,CAAC,CACH,CAMO,SAASmP,EAAAA,CAAe,CAC7B,MAAA,CAAAxiB,CAAAA,CACA,SAAA,CAAAW,CAAAA,CACA,UAAA,CAAA6J,CAAAA,CACA,KAAAlF,CAAAA,CACA,WAAA,CAAA4c,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAA,CAAAM,CAAAA,CACA,UAAA,CAAAC,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,CAAA,CAAA7gB,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAEvB6W,CAAAA,CAAO9X,aAAAA,CACX,IACEb,CAAAA,CAAO,GAAA,CAAKE,CAAAA,GAAW,CACrB,IAAKA,CAAAA,CAAM,OAAA,CACX,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,SAAA,CAAWA,CAAAA,CAAM,SAAA,CACjB,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,OAAA,CAASA,CAAAA,CAAM,QACf,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,SAAA,CAAW8gB,EAAAA,CAAW9gB,CAAAA,CAAM,WAAW,CACzC,CAAA,CAAE,CAAA,CACJ,CAACF,CAAM,CACT,CAAA,CAEA,OAAIW,CAAAA,CAEAqB,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CACAK,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4BACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACU,CAAAA,CAAGC,CAAAA,GACjCX,cAAAA,CAAC,KAAA,CAAA,CAAY,SAAA,CAAU,0CAAA,CAAA,CAAbW,CAAwD,CACnE,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAKFb,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,4BAA4B,CAAA,CACjC,EAEC7B,CAAAA,CAAO,MAAA,GAAW,CAAA,CACjBkC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CAEAG,eAAAA,CAAA0O,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,eAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,uBAAA,EAA0BsI,CAAAA,CAAa,YAAA,CAAe,EAAE,CAAA,CAAA,CAEnE,QAAA,CAAAxI,eAAAA,CAACqf,cAAAA,CAAA,CACC,MAAA,CAAO,MAAA,CACP,YAAA,CAAW,eAAA,CACX,SAAA,CAAU,gBAEV,QAAA,CAAA,CAAArf,eAAAA,CAACsf,cAAAA,CAAA,CACC,QAAA,CAAA,CAAApf,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAA,CAAO,KAAA,CAAO,EAAA,CAClC,QAAA,CAAA1f,CAAAA,CAAE,2BAA2B,CAAA,CAChC,EACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,CAAO,EAAA,CACnC,QAAA,CAAA1f,CAAAA,CAAE,4BAA4B,CAAA,CACjC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAM,KAAA,CAAO,EAAA,CACjC,QAAA,CAAA1f,CAAAA,CAAE,mBAAmB,CAAA,CACxB,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,IAAA,CAAK,KAAA,CAAO,EAAA,CAChC,QAAA,CAAA1f,CAAAA,CAAE,kBAAkB,CAAA,CACvB,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,KAAA,CAAM,KAAA,CAAO,EAAA,CACjC,QAAA,CAAA1f,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAA,CAAO,KAAA,CAAO,GAAA,CAClC,QAAA,CAAA1f,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACAK,cAAAA,CAACsf,YAAAA,CAAA,CACE,QAAA,CAAA7I,CAAAA,CAAK,GAAA,CAAKE,GACT7W,eAAAA,CAACyf,WAAAA,CAAA,CACC,QAAA,CAAA,CAAAvf,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,oBAAA,EACT2W,CAAAA,CAAI,SAAA,GAAc,KAAA,CACd,cAAA,CACA,gBACN,CAAA,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAI,SAAA,GAAc,KAAA,CACfhX,CAAAA,CAAE,mBAAmB,CAAA,CACrBA,CAAAA,CAAE,kBAAkB,CAAA,CAC1B,CAAA,CACF,CAAA,CACAK,cAAAA,CAACwf,YAAAA,CAAA,CACC,SAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA,CAAA6W,CAAAA,CAAI,KAAA,CAAM,MAAA,CAAA,CAAC,EACxC,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBACb,QAAA,CAAA,CAAA6W,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAA,CAChB,CAAA,CACF,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wBAAA,CACb,QAAA,CAAA,CAAA6W,CAAAA,CAAI,QAAQ,MAAA,CAAA,CACf,CAAA,CACF,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2W,CAAAA,CAAI,KAAA,CAAM,CAAA,CACvC,CAAA,CACA3W,eAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BAAA,CACb,QAAA,CAAA2W,CAAAA,CAAI,SAAA,CACP,CAAA,CACF,CAAA,CAAA,CAAA,CAlCaA,CAAAA,CAAI,GAmCnB,CACD,CAAA,CACH,GACF,CAAA,CACF,CAAA,CAAA,CAGEsJ,CAAAA,EAAeD,CAAAA,GACflgB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC8F,SAAAA,CAAA,CACC,IAAA,CAAK,IAAA,CACL,OAAA,CAAQ,MAAA,CACR,WAAY,CAACma,CAAAA,CACb,OAAA,CAASO,CAAAA,CACT,YAAA,CAAcxgB,cAAAA,CAACgG,kBAAAA,CAAA,CAAgB,SAAA,CAAU,SAAA,CAAU,CAAA,CAElD,QAAA,CAAArG,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0BAAA,CACb,QAAA,CAAAL,CAAAA,CAAE,yBAAA,CAA2B,CAAE,IAAA,CAAAyD,CAAK,CAAC,CAAA,CACxC,CAAA,CACApD,cAAAA,CAAC8F,SAAAA,CAAA,CACC,IAAA,CAAK,KACL,OAAA,CAAQ,MAAA,CACR,UAAA,CAAY,CAACka,CAAAA,CACb,OAAA,CAASO,CAAAA,CACT,UAAA,CAAYvgB,cAAAA,CAAC+F,mBAAAA,CAAA,CAAiB,SAAA,CAAU,SAAA,CAAU,CAAA,CAEjD,QAAA,CAAApG,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAEJ,CCzMO,SAAS8gB,EAAAA,CAAmB,CACjC,MAAA,CAAAjrB,CAAAA,CACA,QAAA,CAAAmqB,CACF,EAA6B,EAAC,CAAG,CAC/B,GAAM,CACJ,MAAA,CAAA7hB,CAAAA,CACA,SAAA,CAAAW,CAAAA,CACA,UAAA,CAAA6J,CAAAA,CACA,IAAA,CAAAlF,CAAAA,CACA,WAAA,CAAA4c,CAAAA,CACA,WAAA,CAAAC,EACA,QAAA,CAAAE,CAAAA,CACA,QAAA,CAAAE,CACF,CAAA,CAAIX,EAAAA,CAAgB,CAAE,MAAA,CAAAlqB,CAAAA,CAAQ,QAAA,CAAAmqB,CAAS,CAAC,CAAA,CAExC,OACE3f,cAAAA,CAACsgB,EAAAA,CAAA,CACC,MAAA,CAAQxiB,CAAAA,CACR,SAAA,CAAWW,CAAAA,CACX,UAAA,CAAY6J,CAAAA,CACZ,IAAA,CAAMlF,CAAAA,CACN,WAAA,CAAa4c,CAAAA,CACb,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYE,CAAAA,CACZ,UAAA,CAAYE,CAAAA,CACd,CAEJ,CC4BO,SAASK,EAAAA,CACdlC,CAAAA,CAA8B,EAAC,CACX,CAEpB,IAAMmC,CAAAA,CAAUhiB,aAAAA,CACd,KAAO,CACL,WAAY,CAAA,CACZ,kBAAA,CAAoB,CAAA,CACpB,gBAAA,CAAkB,CAAA,CAClB,KAAA,CAAO,CACT,CAAA,CAAA,CACA,EACF,CAAA,CAEA,OAAO,CACL,SAAA,CAAW,EAAC,CACZ,UAAW,KAAA,CACX,UAAA,CAAY,KAAA,CACZ,OAAA,CAAAgiB,CACF,CACF,CCjDA,IAAMC,GAAY7b,CAAAA,EAAkBR,4BAAAA,CAAuBQ,CAAAA,CAAQ,GAAG,CAAA,CAEtE,SAAS8b,EAAAA,CAAQ,CAAE,MAAApd,CAAM,CAAA,CAAsB,CAC7C,GAAIA,CAAAA,GAAU,CAAA,CACZ,OAAOzD,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAA4gB,EAAAA,CAAS,CAAC,CAAA,CAAE,CAAA,CAEzD,IAAME,CAAAA,CAAard,CAAAA,CAAQ,CAAA,CAC3B,OACE3D,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWghB,CAAAA,CAAa,cAAA,CAAiB,aAAA,CAC5C,QAAA,CAAA,CAAAA,CAAAA,CAAa,GAAA,CAAM,EAAA,CACnBF,EAAAA,CAASnd,CAAK,GACjB,CAEJ,CAMO,SAASsd,EAAAA,CAAY,CAC1B,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAAviB,CAAAA,CACA,OAAA,CAAAkiB,CAAAA,CACA,MAAA,CAAAM,CACF,CAAA,CAAqB,CACnB,GAAM,CAAE,CAAA,CAAAthB,CAAE,CAAA,CAAIC,mBAAAA,EAAe,CAEvB6W,CAAAA,CAAO9X,aAAAA,CACX,IACEqiB,CAAAA,CAAU,GAAA,CAAKE,CAAAA,GAAS,CACtB,GAAA,CAAK,CAAA,EAAGA,CAAAA,CAAI,QAAQ,IAAIA,CAAAA,CAAI,OAAO,CAAA,CAAA,CACnC,WAAA,CAAaA,CAAAA,CAAI,WAAA,CACjB,OAAA,CAASA,CAAAA,CAAI,OAAA,CACb,QAAA,CAAUA,CAAAA,CAAI,QAAA,CACd,OAAA,CAASA,CAAAA,CAAI,YAAA,CACb,YAAA,CAAcA,EAAI,YAAA,CAClB,KAAA,CAAOA,CAAAA,CAAI,YAAA,CAAeA,CAAAA,CAAI,QAAA,CAC9B,aAAA,CAAeA,CAAAA,CAAI,aAAA,CACnB,QAAA,CAAUA,CACZ,CAAA,CAAE,CAAA,CACJ,CAACF,CAAS,CACZ,EAEA,OAAIviB,CAAAA,CAEAqB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ,CAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAACU,CAAAA,CAAGC,CAAAA,GACjCX,cAAAA,CAAC,KAAA,CAAA,CAAY,UAAU,0CAAA,CAAA,CAAbW,CAAwD,CACnE,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAKFb,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAEb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yEAAA,CACb,QAAA,CAAAF,gBAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAH,CAAAA,CAAE,yBAAyB,CAAA,CAC3BqhB,CAAAA,CAAU,MAAA,CAAS,CAAA,EAClBlhB,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,CAAA,GAAA,CAAEkhB,CAAAA,CAAU,OAAO,GAAA,CAAA,CAAC,CAAA,CAAA,CAEhE,CAAA,CACF,CAAA,CAECA,CAAAA,CAAU,MAAA,GAAW,CAAA,CACpBhhB,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gEAAA,CACZ,QAAA,CAAAL,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CAEAG,gBAAA0O,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAxO,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CACb,QAAA,CAAAF,eAAAA,CAACqf,cAAAA,CAAA,CACC,MAAA,CAAO,MAAA,CACP,YAAA,CAAW,WAAA,CACX,SAAA,CAAU,gBAEV,QAAA,CAAA,CAAArf,eAAAA,CAACsf,cAAAA,CAAA,CACC,QAAA,CAAA,CAAApf,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,QAAA,CAAS,KAAA,CAAO,GAAA,CACpC,QAAA,CAAA1f,CAAAA,CAAE,0BAA0B,CAAA,CAC/B,EACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,SAAA,CAAU,KAAA,CAAO,EAAA,CACrC,QAAA,CAAA1f,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,MAAM,KAAA,CAAO,EAAA,CACjC,QAAA,CAAA1f,CAAAA,CAAE,uBAAuB,CAAA,CAC5B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,UAAA,CAAW,KAAA,CAAO,EAAA,CACtC,QAAA,CAAA1f,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,CAAO,GACnC,QAAA,CAAA1f,CAAAA,CAAE,gCAAgC,CAAA,CACrC,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,UAAU,OAAA,CAAQ,KAAA,CAAO,EAAA,CACnC,QAAA,CAAA1f,CAAAA,CAAE,yBAAyB,CAAA,CAC9B,CAAA,CACAK,cAAAA,CAACqf,cAAAA,CAAA,CAAY,SAAA,CAAU,KAAA,CAAM,KAAA,CAAO,EAAA,CACjC,QAAA,CAAA1f,EAAE,uBAAuB,CAAA,CAC5B,CAAA,CAAA,CACF,CAAA,CACAK,cAAAA,CAACsf,YAAAA,CAAA,CACE,QAAA,CAAA7I,CAAAA,CAAK,GAAA,CAAKE,CAAAA,EACT7W,eAAAA,CAACyf,WAAAA,CAAA,CAEC,SAAA,CACE0B,CAAAA,CAAS,qCAAuC,EAAA,CAElD,OAAA,CAAS,IAAMA,CAAAA,GAAStK,CAAAA,CAAI,QAAQ,CAAA,CAEpC,QAAA,CAAA,CAAA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kCAAA,CACb,SAAA2W,CAAAA,CAAI,WAAA,CACP,CAAA,CACF,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAW,CAAA,oBAAA,EACT2W,CAAAA,CAAI,OAAA,GAAY,KAAA,CACZ,cAAA,CACA,gBACN,CAAA,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAI,OAAA,GAAY,KAAA,CACbhX,CAAAA,CAAE,mBAAmB,CAAA,CACrBA,CAAAA,CAAE,kBAAkB,CAAA,CAC1B,CAAA,CACF,CAAA,CACAK,cAAAA,CAACwf,YAAAA,CAAA,CACC,SAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2W,CAAAA,CAAI,QAAA,CAAS,CAAA,CAC1C,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,UAAW,QAAA,CAAA,CAAA6W,CAAAA,CAAI,OAAA,CAAQ,MAAA,CAAA,CAAC,CAAA,CAC1C,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAA1f,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA,CAAA6W,CAAAA,CAAI,aAAa,MAAA,CAAA,CAAC,CAAA,CAC/C,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA4gB,EAAAA,CAASjK,CAAAA,CAAI,KAAK,CAAA,CAAE,EACjD,CAAA,CACA3W,cAAAA,CAACwf,YAAAA,CAAA,CACC,QAAA,CAAAxf,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CACd,QAAA,CAAAA,cAAAA,CAAC6gB,EAAAA,CAAA,CAAQ,KAAA,CAAOlK,CAAAA,CAAI,aAAA,CAAe,EACrC,CAAA,CACF,CAAA,CAAA,CAAA,CAxCKA,CAAAA,CAAI,GAyCX,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAGA7W,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iFAAA,CACb,QAAA,CAAA,CAAAE,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,2BAAA,CACb,QAAA,CAAAF,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAH,CAAAA,CAAE,8BAA8B,CAAA,CAAE,GAAA,CAAE,GAAA,CACrCK,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BAAA,CACb,SAAA4gB,EAAAA,CAASD,CAAAA,CAAQ,UAAU,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACA7gB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CACb,UAAAH,CAAAA,CAAE,iCAAiC,CAAA,CAAE,GAAA,CAAE,GAAA,CACxCK,cAAAA,CAAC6gB,EAAAA,CAAA,CAAQ,KAAA,CAAOF,CAAAA,CAAQ,kBAAA,CAAoB,CAAA,CAAA,CAC9C,CAAA,CACA7gB,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBACb,QAAA,CAAA,CAAAH,CAAAA,CAAE,+BAA+B,CAAA,CAAE,GAAA,CAAE,GAAA,CACtCK,cAAAA,CAAC6gB,EAAAA,CAAA,CAAQ,KAAA,CAAOF,CAAAA,CAAQ,gBAAA,CAAkB,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,GAEJ,CAEJ,CCvMO,SAASQ,EAAAA,CAAgB,CAC9B,eAAA,CAAAtD,CAAAA,CACA,MAAA,CAAAoD,CACF,CAAA,CAA0B,EAAC,CAAG,CAC5B,GAAM,CAAE,SAAA,CAAAD,CAAAA,CAAW,SAAA,CAAAviB,CAAAA,CAAW,OAAA,CAAAkiB,CAAQ,CAAA,CAAID,GAAa,CAAkB,CAAC,CAAA,CAE1E,OACE1gB,cAAAA,CAAC+gB,EAAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACX,SAAA,CAAWviB,CAAAA,CACX,OAAA,CAASkiB,CAAAA,CACT,MAAA,CAAQM,CAAAA,CACV,CAEJ,CCpBO,SAASG,EAAAA,CAAgB,CAC9B,MAAA,CAAAzuB,CAAAA,CACA,QAAA,CAAAkK,CAAAA,CAAW,IAAA,CACX,QAAA,CAAAwkB,CACF,CAAA,CAAyB,CACvB,IAAM5d,CAAAA,CAAQ9E,aAAAA,CACZ,KAAO,CACL,MAAA,CAAAhM,CAAAA,CACA,QAAA,CAAAkK,CACF,CAAA,CAAA,CACA,CAAClK,CAAAA,CAAQkK,CAAQ,CACnB,CAAA,CAEA,OACEmD,cAAAA,CAAC3N,EAAAA,CAAe,QAAA,CAAf,CAAwB,KAAA,CAAOoR,EAAQ,QAAA,CAAA4d,CAAAA,CAAS,CAErD,CCpBO,SAASC,EAAAA,CACdzuB,CAAAA,CACA0uB,CAAAA,CACQ,CACR,IAAMC,EAAK,IAAI,eAAA,CAGXD,CAAAA,EACFC,CAAAA,CAAG,GAAA,CAAI,UAAA,CAAYD,CAAQ,CAAA,CAG7B,IAAA,GAAW,CAACzmB,CAAAA,CAAK2I,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ5Q,CAAM,EACnB4Q,CAAAA,EAAU,IAAA,GAC/B,OAAOA,CAAAA,EAAU,QAAA,CACnB+d,CAAAA,CAAG,GAAA,CAAI1mB,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAU2I,CAAK,CAAC,CAAA,CAEjC+d,CAAAA,CAAG,GAAA,CAAI1mB,CAAAA,CAAK,OAAO2I,CAAK,CAAC,CAAA,CAAA,CAI/B,IAAMge,CAAAA,CAAMD,CAAAA,CAAG,QAAA,EAAS,CACxB,OAAOC,CAAAA,CAAM,CAAA,CAAA,EAAIA,CAAG,CAAA,CAAA,CAAK,EAC3B,CAGO,SAASC,GAA2B7uB,CAAAA,CAAoC,CAC7E,OAAOA,CACT,CAMO,IAAe8uB,EAAAA,CAAf,KAAiC,CACtC,WAAA,CACqBC,CAAAA,CACAL,CAAAA,CACnB,CAFmB,IAAA,CAAA,QAAA,CAAAK,CAAAA,CACA,IAAA,CAAA,QAAA,CAAAL,EAClB,CAKO,QAAA,CAASM,CAAAA,CAAchvB,CAAAA,CAA0C,CACzE,IAAMivB,CAAAA,CAAQR,EAAAA,CAAWzuB,CAAAA,EAAU,EAAC,CAAG,IAAA,CAAK,QAAQ,CAAA,CACpD,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAGgvB,CAAI,CAAA,EAAGC,CAAK,CAAA,CACxC,CAKA,MAAgB,KAAA,CACdD,CAAAA,CACAhvB,CAAAA,CACY,CACZ,IAAMkvB,CAAAA,CAAM,IAAA,CAAK,QAAA,CAASF,EAAMhvB,CAAM,CAAA,CACtC,OAAO,MAAMmvB,aAAAA,CAAWD,CAAG,CAC7B,CAKA,MAAgB,WAAA,CACdF,CAAAA,CACA3mB,CAAAA,CACArI,CAAAA,CACY,CACZ,IAAMkvB,CAAAA,CAAM,KAAK,QAAA,CAASF,CAAAA,CAAMhvB,CAAM,CAAA,CACtC,OAAO,MAAMovB,cAAAA,CAAeF,CAAAA,CAAK7mB,CAAI,CACvC,CACF,ECJA,SAASgnB,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACkB,CAClB,GAAI,CAACD,CAAAA,CAAK,OAAO,EAAC,CAClB,IAAMhM,CAAAA,CAA2B,MAAA,CAAO,OAAA,CAAQgM,CAAG,CAAA,CAAE,GAAA,CACnD,CAAC,CAACE,CAAAA,CAAUlY,CAAQ,CAAA,IAAO,CACzB,KAAA,CAAO,UAAA,CAAWkY,CAAQ,CAAA,CAC1B,QAAA,CAAAlY,CACF,CAAA,CACF,CAAA,CACA,OAAAgM,CAAAA,CAAO,IAAA,CAAK,CAAClX,CAAAA,CAAGC,CAAAA,GACdkjB,IAAS,MAAA,CAASljB,CAAAA,CAAE,KAAA,CAAQD,CAAAA,CAAE,KAAA,CAAQA,CAAAA,CAAE,KAAA,CAAQC,CAAAA,CAAE,KACpD,CAAA,CACOiX,CACT,CAGA,SAASmM,EAAAA,CAAmBH,CAAAA,CAAmD,CAC7E,OAAO,CACL,OAAA,CAASD,EAAAA,CAAUC,CAAAA,CAAI,QAAA,CAAU,MAAM,CAAA,CACvC,OAAA,CAASD,GAAUC,CAAAA,CAAI,QAAA,CAAU,KAAK,CAAA,CACtC,MAAA,CAAQD,EAAAA,CAAUC,CAAAA,CAAI,OAAA,CAAS,MAAM,CAAA,CACrC,MAAA,CAAQD,EAAAA,CAAUC,CAAAA,CAAI,OAAA,CAAS,KAAK,CAAA,CACpC,QAAA,CAAUA,CAAAA,CAAI,QAChB,CACF,CAQO,IAAMI,EAAAA,CAAN,cACGZ,EAEV,CACE,WAAA,CAAYC,CAAAA,CAAkB,CAC5B,KAAA,CAAMA,CAAAA,CAAU,OAAO,EACzB,CAIA,MAAM,SAAA,CAAU/uB,CAAAA,CAA4D,CAC1E,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,YACSA,CAAAA,EAAU,EACrB,CACF,CAEA,MAAM,YAAA,CACJupB,CAAAA,CACAoG,CAAAA,CACwB,CACxB,OAAO,MAAM,IAAA,CAAK,KAAA,CAAqB,CAAA,UAAA,EAAapG,CAAO,GAAI,CAC7D,iBAAA,CAAAoG,CACF,CAAC,CACH,CAEA,MAAM,oBAAA,CACJhtB,CAAAA,CACA3C,CAAAA,CAC+B,CAC/B,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,UAAA,EAAa2C,CAAM,CAAA,aAAA,CAAA,CACV3C,CACX,CACF,CAEA,MAAM,iCAAA,CACJA,CAAAA,CAC4C,CAC5C,GAAM,CAAE,YAAA,CAAAwE,CAAAA,CAAc,OAAA,CAAA+kB,CAAAA,CAAS,GAAG3mB,CAAK,EAAI5C,CAAAA,CAC3C,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,UAAA,EAAawE,CAAY,CAAA,CAAA,EAAI+kB,CAAO,CAAA,4BAAA,CAAA,CAC3B3mB,CACX,CACF,CAEA,MAAM,uCAAA,CACJ5C,CAAAA,CAC4C,CAC5C,GAAM,CAAE,WAAA,CAAAqB,CAAAA,CAAa,GAAGuB,CAAK,CAAA,CAAI5C,CAAAA,CACjC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,kBAAA,EAAqBqB,CAAW,CAAA,4BAAA,CAAA,CACvBuB,CACX,CACF,CAIA,MAAM,UAAA,CACJ5C,CAAAA,CACkC,CAClC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,YAAA,CACSA,CAAAA,EAAU,EACrB,CACF,CAEA,MAAM,cAAc4vB,CAAAA,CAA2C,CAC7D,OAAO,MAAM,IAAA,CAAK,KAAA,CAAsB,CAAA,WAAA,EAAcA,CAAQ,CAAA,CAAE,CAClE,CAEA,MAAM,eAAA,CAAgBvuB,CAAAA,CAA8C,CAClE,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,mBAAA,EAAsBA,CAAW,CAAA,CACnC,CACF,CAEA,MAAM,eAAA,CACJI,CAAAA,CACkC,CAClC,OAAO,MAAM,IAAA,CAAK,WAAA,CAChB,kBAAA,CACAA,CACF,CACF,CAEA,MAAM,qBAAA,CACJkB,CAAAA,CACA3C,CAAAA,CAC+B,CAC/B,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,WAAA,EAAc2C,CAAM,CAAA,aAAA,CAAA,CACX3C,CACX,CACF,CAEA,MAAM,2BAAA,CACJqB,CAAAA,CACArB,CAAAA,CAC+B,CAC/B,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,mBAAA,EAAsBqB,CAAW,CAAA,aAAA,CAAA,CACxBrB,CACX,CACF,CAIA,MAAM,aAAa6B,CAAAA,CAAkD,CACnE,IAAMytB,CAAAA,CAAM,MAAM,IAAA,CAAK,KAAA,CACrB,CAAA,cAAA,EAAiBztB,CAAY,CAAA,CAC/B,CAAA,CACA,OAAO4tB,EAAAA,CAAmBH,CAAG,CAC/B,CAEA,MAAM,kBAAA,CAAmBjuB,CAAAA,CAAiD,CACxE,IAAMiuB,CAAAA,CAAM,MAAM,IAAA,CAAK,KAAA,CACrB,CAAA,sBAAA,EAAyBjuB,CAAW,CAAA,CACtC,CAAA,CACA,OAAOouB,EAAAA,CAAmBH,CAAG,CAC/B,CAIA,MAAM,SAAA,CAAUtvB,CAAAA,CAAyD,CACvE,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,YAAA,CACSA,CAAAA,EAAU,EACrB,CACF,CAEA,MAAM,eAAA,CACJA,EAC6B,CAC7B,GAAM,CAAE,WAAA,CAAAqB,CAAAA,CAAa,GAAGuB,CAAK,CAAA,CAAI5C,EACjC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,mBAAA,EAAsBqB,CAAW,CAAA,CAAA,CACxBuB,CACX,CACF,CAIA,MAAM,WAAA,CAAY5C,CAAAA,CAAwD,CACxE,OAAO,MAAM,IAAA,CAAK,KAAA,CAAwB,UAAA,CAAY,CACpD,YAAA,CAAcA,CAAAA,CAAO,YAAA,CAAa,IAAA,CAAK,GAAG,CAC5C,CAAC,CACH,CAEA,MAAM,kBAAA,CACJA,CAAAA,CAC2B,CAC3B,GAAM,CAAE,WAAA,CAAA6vB,CAAAA,CAAa,GAAGjtB,CAAK,CAAA,CAAI5C,CAAAA,CACjC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,eAAA,EAAkB6vB,CAAW,CAAA,CAAA,CACpBjtB,CACX,CACF,CAEA,MAAM,iBAAA,CACJ5C,CAAAA,CAC2B,CAC3B,GAAM,CAAE,WAAA,CAAAqB,CAAAA,CAAa,GAAGuB,CAAK,CAAA,CAAI5C,CAAAA,CACjC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,CAAA,iBAAA,EAAoBqB,CAAW,CAAA,CAAA,CACtBuB,CACX,CACF,CAIA,MAAM,SAAA,CAAU5C,CAAAA,CAAyD,CACvE,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,YAAA,CACSA,CAAAA,EAAU,EACrB,CACF,CAEA,MAAM,iBAAA,CAAkBwE,CAAAA,CAA+C,CACrE,OAAO,MAAM,KAAK,KAAA,CAAsB,CAAA,WAAA,EAAcA,CAAY,CAAA,CAAE,CACtE,CAIA,MAAM,mBAAA,EAAyD,CAC7D,OAAO,MAAM,IAAA,CAAK,KAAA,CAAgC,wBAAwB,CAC5E,CAEA,MAAM,kBAAA,EAAuD,CAC3D,OAAO,MAAM,IAAA,CAAK,KAAA,CAA+B,oBAAoB,CACvE,CAIA,MAAM,MAAA,CAAOxE,CAAAA,CAAoD,CAC/D,OAAO,MAAM,IAAA,CAAK,MAAsB,YAAA,CAAuBA,CAAO,CACxE,CAIA,MAAM,eAAA,CACJA,CAAAA,CAC+B,CAC/B,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,mBAAA,CACSA,CAAAA,EAAU,EACrB,CACF,CAEA,MAAM,kBAAA,CACJyB,CAAAA,CACqC,CACrC,OAAO,MAAM,IAAA,CAAK,WAAA,CAGhB,0BAAA,CAA4BA,CAAO,CACvC,CAIA,MAAM,QAAA,CAASzB,CAAAA,CAAkD,CAC/D,OAAO,MAAM,IAAA,CAAK,KAAA,CAAqB,gBAAA,CAA2BA,CAAO,CAC3E,CAEA,MAAM,UAAA,CAAWyB,CAAAA,CAAiD,CAChE,OAAO,MAAM,IAAA,CAAK,WAAA,CAChB,UAAA,CACAA,CACF,CACF,CAEA,MAAM,sBAAA,CACJA,CAAAA,CACmC,CACnC,OAAO,MAAM,IAAA,CAAK,WAAA,CAChB,uBAAA,CACAA,CACF,CACF,CAIA,MAAM,QAAA,CAASzB,EAAkD,CAC/D,OAAO,MAAM,IAAA,CAAK,KAAA,CAAqB,WAAA,CAAsBA,CAAO,CACtE,CAEA,MAAM,cAAA,CACJA,CAAAA,CAC8B,CAC9B,OAAO,MAAM,IAAA,CAAK,MAChB,kBAAA,CACSA,CACX,CACF,CAIA,MAAM,cAAA,CACJA,CAAAA,CAC8B,CAC9B,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,kBAAA,CACSA,CACX,CACF,CAEA,MAAM,gBAAA,CACJyB,CAAAA,CAC6B,CAC7B,OAAO,MAAM,IAAA,CAAK,WAAA,CAChB,iBAAA,CACAA,CACF,CACF,CAIA,MAAM,oBAAA,CACJzB,CAAAA,CACuC,CACvC,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,4BAAA,CACSA,CACX,CACF,CAIA,MAAM,SAAA,EAAwC,CAC5C,OAAO,MAAM,IAAA,CAAK,KAAA,CAAyB,YAAY,CACzD,CAEA,MAAM,qBAAA,EAAgE,CACpE,OAAO,MAAM,IAAA,CAAK,KAAA,CAChB,qBACF,CACF,CAEA,MAAM,SAAA,EAAwC,CAC5C,OAAO,MAAM,IAAA,CAAK,KAAA,CAAyB,YAAY,CACzD,CACF","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-predict\"] = \"0.1.45\";\n}\n\nexport default \"0.1.45\";\n","import { createContext } from \"react\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport interface PredictContextValue {\n /** The predict API client instance */\n client: IPredictClient;\n\n /** The WebSocket client instance for real-time data */\n wsClient: IPredictWsClient | null;\n}\n\nexport const PredictContext = createContext<PredictContextValue>(\n {} as PredictContextValue,\n);\n","import { useContext } from \"react\";\nimport { PredictContext } from \"../contexts\";\n\nexport function usePredictContext() {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictContext must be used within a PredictProvider\");\n }\n return context;\n}\n","import { usePredictContext } from \"./usePredictContext\";\n\nexport function usePredictClient() {\n const { client } = usePredictContext();\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n StandardEvent,\n EventQueryParams,\n IPredictClient,\n StandardEventsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsQueryKey(params?: EventQueryParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\nexport async function fetchEvents(\n client: IPredictClient,\n params?: EventQueryParams,\n): Promise<StandardEventsResponse> {\n return await client.getEvents(params);\n}\n\nexport function useEventsQuery(\n params?: EventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardEventsResponse,\n Error,\n StandardEventsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: async () => fetchEvents(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardEvent, EventQueryParams, StandardEventsResponse };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { EventQueryParams, StandardEventsResponse } from \"../types\";\nimport { fetchEvents } from \"./useEventsQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsInfiniteQueryKey(\n params?: Omit<EventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"events\", \"infinite\", params ?? {}];\n}\n\nexport function useEventsInfiniteQuery(\n params: Omit<EventQueryParams, \"cursor\"> = {},\n options: Omit<\n UseInfiniteQueryOptions<\n StandardEventsResponse,\n Error,\n InfiniteData<StandardEventsResponse>,\n unknown[],\n number | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: eventsInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchEvents(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n // If API returns a non-null cursor, use it as the next page param\n return lastPage.cursor ?? undefined;\n },\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { StandardEvent, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseEventByIdQueryParams {\n /** Event ticker ID */\n id: string;\n /** Include nested markets in response */\n withNestedMarkets?: boolean;\n}\n\nexport function eventByIdQueryKey(params: UseEventByIdQueryParams): unknown[] {\n return [\"predict\", \"event\", \"byId\", params.id, params.withNestedMarkets];\n}\n\nexport async function fetchEventById(\n client: IPredictClient,\n params: UseEventByIdQueryParams,\n): Promise<StandardEvent> {\n return await client.getEventById(params.id, params.withNestedMarkets);\n}\n\nexport function useEventByIdQuery(\n params: UseEventByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardEvent, Error, StandardEvent, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventByIdQueryKey(params),\n queryFn: async () => fetchEventById(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n StandardMarket,\n MarketQueryParams,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketsQueryKey(params?: MarketQueryParams): unknown[] {\n return [\"predict\", \"markets\", params ?? {}];\n}\n\nexport async function fetchMarkets(\n client: IPredictClient,\n params?: MarketQueryParams,\n): Promise<StandardMarketsResponse> {\n return await client.getMarkets(params);\n}\n\nexport function useMarketsQuery(\n params?: MarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardMarket, MarketQueryParams, StandardMarketsResponse };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketByIdQueryParams {\n /** Market ticker ID */\n id: string;\n}\n\nexport function marketByIdQueryKey(\n params: UseMarketByIdQueryParams,\n): unknown[] {\n return [\"predict\", \"market\", \"byId\", params.id];\n}\n\nexport async function fetchMarketById(\n client: IPredictClient,\n params: UseMarketByIdQueryParams,\n): Promise<StandardMarket> {\n return await client.getMarketById(params.id);\n}\n\nexport function useMarketByIdQuery(\n params: UseMarketByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByIdQueryKey(params),\n queryFn: async () => fetchMarketById(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Market by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function marketByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"market\", \"byMint\", mintAddress];\n}\n\nexport async function fetchMarketByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<StandardMarket> {\n return await client.getMarketByMint(mintAddress);\n}\n\nexport function useMarketByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByMintQueryKey(mintAddress),\n queryFn: async () => fetchMarketByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MarketsBatchRequest,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Markets Batch Query\n// -----------------------------------------------------------------------------\n\nexport function marketsBatchQueryKey(request: MarketsBatchRequest): unknown[] {\n return [\"predict\", \"markets\", \"batch\", request];\n}\n\nexport async function fetchMarketsBatch(\n client: IPredictClient,\n request: MarketsBatchRequest,\n): Promise<StandardMarketsResponse> {\n return await client.getMarketsBatch(request);\n}\n\nexport function useMarketsBatchQuery(\n request: MarketsBatchRequest,\n options: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsBatchQueryKey(request),\n queryFn: async () => fetchMarketsBatch(client, request),\n enabled: Boolean(request.tickers?.length || request.mints?.length),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, OrderbookResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderBookQueryKey(marketTicker: string): unknown[] {\n return [\"predict\", \"orderBook\", marketTicker];\n}\n\nexport async function fetchOrderBook(\n client: IPredictClient,\n marketTicker: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbook(marketTicker);\n}\n\nexport function useOrderBookQuery(\n marketTicker: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookQueryKey(marketTicker),\n queryFn: async () => fetchOrderBook(client, marketTicker),\n ...options,\n });\n}\n\n// Also export a hook for getting orderbook by mint address\nexport function orderBookByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"orderBook\", \"byMint\", mintAddress];\n}\n\nexport async function fetchOrderBookByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbookByMint(mintAddress);\n}\n\nexport function useOrderBookByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookByMintQueryKey(mintAddress),\n queryFn: async () => fetchOrderBookByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiTradeResponse,\n TradesQueryParams,\n TradesByMintQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params?: TradesQueryParams): unknown[] {\n return [\"predict\", \"trades\", params ?? {}];\n}\n\nexport async function fetchTrades(\n client: IPredictClient,\n params?: TradesQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params?: TradesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: async () => fetchTrades(client, params),\n ...queryOptions,\n });\n}\n\n// Also export a hook for getting trades by mint address\nexport function tradesByMintQueryKey(\n params: TradesByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"trades\", \"byMint\", params];\n}\n\nexport async function fetchTradesByMint(\n client: IPredictClient,\n params: TradesByMintQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTradesByMint(params);\n}\n\nexport function useTradesByMintQuery(\n params: TradesByMintQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesByMintQueryKey(params),\n queryFn: async () => fetchTradesByMint(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n CandlesticksResponse,\n CandlesticksQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseEventCandlesticksParams extends CandlesticksQueryParams {\n /** Event ticker */\n ticker: string;\n}\n\nexport function eventCandlesticksQueryKey(\n params: UseEventCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"event\", params];\n}\n\nexport async function fetchEventCandlesticks(\n client: IPredictClient,\n params: UseEventCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getEventCandlesticks(ticker, rest);\n}\n\nexport function useEventCandlesticksQuery(\n params: UseEventCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventCandlesticksQueryKey(params),\n queryFn: async () => fetchEventCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksParams extends CandlesticksQueryParams {\n /** Market ticker */\n ticker: string;\n}\n\nexport function marketCandlesticksQueryKey(\n params: UseMarketCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", params];\n}\n\nexport async function fetchMarketCandlesticks(\n client: IPredictClient,\n params: UseMarketCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getMarketCandlesticks(ticker, rest);\n}\n\nexport function useMarketCandlesticksQuery(\n params: UseMarketCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksQueryKey(params),\n queryFn: async () => fetchMarketCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks by Mint Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksByMintParams\n extends CandlesticksQueryParams {\n /** Mint address */\n mintAddress: string;\n}\n\nexport function marketCandlesticksByMintQueryKey(\n params: UseMarketCandlesticksByMintParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", \"byMint\", params];\n}\n\nexport async function fetchMarketCandlesticksByMint(\n client: IPredictClient,\n params: UseMarketCandlesticksByMintParams,\n): Promise<CandlesticksResponse> {\n const { mintAddress, ...rest } = params;\n return await client.getMarketCandlesticksByMint(mintAddress, rest);\n}\n\nexport function useMarketCandlesticksByMintQuery(\n params: UseMarketCandlesticksByMintParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksByMintQueryKey(params),\n queryFn: async () => fetchMarketCandlesticksByMint(client, params),\n ...options,\n });\n}\n\n// Legacy aliases for backward compatibility\n/** @deprecated Use useEventCandlesticksQuery or useMarketCandlesticksQuery instead */\nexport const usePriceHistoryQuery = useMarketCandlesticksQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n ForecastPercentileHistoryResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryQueryKey(\n params: ForecastPercentileHistoryQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", params];\n}\n\nexport async function fetchForecastPercentileHistory(\n client: IPredictClient,\n params: ForecastPercentileHistoryQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistory(params);\n}\n\nexport function useForecastPercentileHistoryQuery(\n params: ForecastPercentileHistoryQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistory(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryByMintQueryKey(\n params: ForecastPercentileHistoryByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", \"byMint\", params];\n}\n\nexport async function fetchForecastPercentileHistoryByMint(\n client: IPredictClient,\n params: ForecastPercentileHistoryByMintQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistoryByMint(params);\n}\n\nexport function useForecastPercentileHistoryByMintQuery(\n params: ForecastPercentileHistoryByMintQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryByMintQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistoryByMint(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n LiveDataResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Live Data Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataQueryKey(params: LiveDataQueryParams): unknown[] {\n return [\"predict\", \"liveData\", params];\n}\n\nexport async function fetchLiveData(\n client: IPredictClient,\n params: LiveDataQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveData(params);\n}\n\nexport function useLiveDataQuery(\n params: LiveDataQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataQueryKey(params),\n queryFn: async () => fetchLiveData(client, params),\n enabled: params.milestoneIds.length > 0,\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Event Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByEventQueryKey(\n params: LiveDataByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byEvent\", params];\n}\n\nexport async function fetchLiveDataByEvent(\n client: IPredictClient,\n params: LiveDataByEventQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByEvent(params);\n}\n\nexport function useLiveDataByEventQuery(\n params: LiveDataByEventQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByEventQueryKey(params),\n queryFn: async () => fetchLiveDataByEvent(client, params),\n enabled: Boolean(params.eventTicker),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByMintQueryKey(\n params: LiveDataByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byMint\", params];\n}\n\nexport async function fetchLiveDataByMint(\n client: IPredictClient,\n params: LiveDataByMintQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByMint(params);\n}\n\nexport function useLiveDataByMintQuery(\n params: LiveDataByMintQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByMintQueryKey(params),\n queryFn: async () => fetchLiveDataByMint(client, params),\n enabled: Boolean(params.mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SeriesListResponse,\n SeriesResponse,\n SeriesQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Series List Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesQueryKey(params?: SeriesQueryParams): unknown[] {\n return [\"predict\", \"series\", params ?? {}];\n}\n\nexport async function fetchSeries(\n client: IPredictClient,\n params?: SeriesQueryParams,\n): Promise<SeriesListResponse> {\n return await client.getSeries(params);\n}\n\nexport function useSeriesQuery(\n params?: SeriesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SeriesListResponse, Error, SeriesListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesQueryKey(params),\n queryFn: async () => fetchSeries(client, params),\n ...queryOptions,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Series by Ticker Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesByTickerQueryKey(seriesTicker: string): unknown[] {\n return [\"predict\", \"series\", \"byTicker\", seriesTicker];\n}\n\nexport async function fetchSeriesByTicker(\n client: IPredictClient,\n seriesTicker: string,\n): Promise<SeriesResponse> {\n return await client.getSeriesByTicker(seriesTicker);\n}\n\nexport function useSeriesByTickerQuery(\n seriesTicker: string,\n options: Omit<\n UseQueryOptions<SeriesResponse, Error, SeriesResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesByTickerQueryKey(seriesTicker),\n queryFn: async () => fetchSeriesByTicker(client, seriesTicker),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tags by Categories Hook\n// -----------------------------------------------------------------------------\n\nexport function tagsByCategoriesQueryKey(): unknown[] {\n return [\"predict\", \"tags\", \"byCategories\"];\n}\n\nexport async function fetchTagsByCategories(\n client: IPredictClient,\n): Promise<TagsByCategoriesResponse> {\n return await client.getTagsByCategories();\n}\n\nexport function useTagsByCategoriesQuery(\n options: Omit<\n UseQueryOptions<\n TagsByCategoriesResponse,\n Error,\n TagsByCategoriesResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tagsByCategoriesQueryKey(),\n queryFn: async () => fetchTagsByCategories(client),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filters by Sports Hook\n// -----------------------------------------------------------------------------\n\nexport function filtersBySportsQueryKey(): unknown[] {\n return [\"predict\", \"filters\", \"bySports\"];\n}\n\nexport async function fetchFiltersBySports(\n client: IPredictClient,\n): Promise<FiltersBySportsResponse> {\n return await client.getFiltersBySports();\n}\n\nexport function useFiltersBySportsQuery(\n options: Omit<\n UseQueryOptions<\n FiltersBySportsResponse,\n Error,\n FiltersBySportsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: filtersBySportsQueryKey(),\n queryFn: async () => fetchFiltersBySports(client),\n ...options,\n });\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use useTagsByCategoriesQuery instead */\nexport const useCategoriesQuery = useTagsByCategoriesQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SearchQueryParams,\n SearchResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function searchQueryKey(params: SearchQueryParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\nexport async function fetchSearch(\n client: IPredictClient,\n params: SearchQueryParams,\n): Promise<SearchResponse> {\n return await client.search(params);\n}\n\nexport function useSearchQuery(\n params: SearchQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SearchResponse, Error, SearchResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: searchQueryKey(params),\n queryFn: async () => fetchSearch(client, params),\n ...queryOptions,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OutcomeMintsQueryParams,\n OutcomeMintsResponse,\n FilterOutcomeMintsRequest,\n FilterOutcomeMintsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Outcome Mints Query\n// -----------------------------------------------------------------------------\n\nexport function outcomeMintsQueryKey(\n params?: OutcomeMintsQueryParams,\n): unknown[] {\n return [\"predict\", \"outcomeMints\", params ?? {}];\n}\n\nexport async function fetchOutcomeMints(\n client: IPredictClient,\n params?: OutcomeMintsQueryParams,\n): Promise<OutcomeMintsResponse> {\n return await client.getOutcomeMints(params);\n}\n\nexport function useOutcomeMintsQuery(\n params?: OutcomeMintsQueryParams,\n options: Omit<\n UseQueryOptions<\n OutcomeMintsResponse,\n Error,\n OutcomeMintsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: outcomeMintsQueryKey(params),\n queryFn: async () => fetchOutcomeMints(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filter Outcome Mints Mutation\n// -----------------------------------------------------------------------------\n\nexport async function filterOutcomeMints(\n client: IPredictClient,\n request: FilterOutcomeMintsRequest,\n): Promise<FilterOutcomeMintsResponse> {\n return await client.filterOutcomeMints(request);\n}\n\nexport function useFilterOutcomeMintsMutation(\n options: Omit<\n UseMutationOptions<\n FilterOutcomeMintsResponse,\n Error,\n FilterOutcomeMintsRequest\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: FilterOutcomeMintsRequest) =>\n filterOutcomeMints(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, QuoteQueryParams, QuoteResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Quote Query\n// -----------------------------------------------------------------------------\n\nexport function quoteQueryKey(params: QuoteQueryParams): unknown[] {\n return [\"predict\", \"quote\", params];\n}\n\nexport async function fetchQuote(\n client: IPredictClient,\n params: QuoteQueryParams,\n): Promise<QuoteResponse> {\n return await client.getQuote(params);\n}\n\nexport function useQuoteQuery(\n params: QuoteQueryParams,\n options: Omit<\n UseQueryOptions<QuoteResponse, Error, QuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: quoteQueryKey(params),\n queryFn: async () => fetchQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Quotes are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds (formerly cacheTime)\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SwapRequestBody,\n SwapResponse,\n SwapInstructionsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Create Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwap(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapResponse> {\n return await client.createSwap(request);\n}\n\nexport function useCreateSwapMutation(\n options: Omit<\n UseMutationOptions<SwapResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) => createSwap(client, request),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Create Swap Instructions Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwapInstructions(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapInstructionsResponse> {\n return await client.createSwapInstructions(request);\n}\n\nexport function useCreateSwapInstructionsMutation(\n options: Omit<\n UseMutationOptions<SwapInstructionsResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) =>\n createSwapInstructions(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OrderQueryParams,\n OrderResponse,\n OrderStatusQueryParams,\n OrderStatusResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Order Query (Get quote and optionally transaction)\n// -----------------------------------------------------------------------------\n\nexport function orderQueryKey(params: OrderQueryParams): unknown[] {\n return [\"predict\", \"order\", params];\n}\n\nexport async function fetchOrder(\n client: IPredictClient,\n params: OrderQueryParams,\n): Promise<OrderResponse> {\n return await client.getOrder(params);\n}\n\nexport function useOrderQuery(\n params: OrderQueryParams,\n options: Omit<\n UseQueryOptions<OrderResponse, Error, OrderResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params),\n queryFn: async () => fetchOrder(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Orders are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Order Status Query\n// -----------------------------------------------------------------------------\n\nexport function orderStatusQueryKey(params: OrderStatusQueryParams): unknown[] {\n return [\"predict\", \"order\", \"status\", params.signature];\n}\n\nexport async function fetchOrderStatus(\n client: IPredictClient,\n params: OrderStatusQueryParams,\n): Promise<OrderStatusResponse> {\n return await client.getOrderStatus(params);\n}\n\nexport function useOrderStatusQuery(\n params: OrderStatusQueryParams,\n options: Omit<\n UseQueryOptions<OrderStatusResponse, Error, OrderStatusResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderStatusQueryKey(params),\n queryFn: async () => fetchOrderStatus(client, params),\n enabled: Boolean(params.signature),\n // Poll for status updates\n refetchInterval: options.refetchInterval ?? 3000,\n ...options,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n IntentQuoteQueryParams,\n IntentQuoteResponse,\n IntentSwapRequestBody,\n IntentSwapResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Intent Quote Query (Declarative Swap)\n// -----------------------------------------------------------------------------\n\nexport function intentQuoteQueryKey(params: IntentQuoteQueryParams): unknown[] {\n return [\"predict\", \"intent\", \"quote\", params];\n}\n\nexport async function fetchIntentQuote(\n client: IPredictClient,\n params: IntentQuoteQueryParams,\n): Promise<IntentQuoteResponse> {\n return await client.getIntentQuote(params);\n}\n\nexport function useIntentQuoteQuery(\n params: IntentQuoteQueryParams,\n options: Omit<\n UseQueryOptions<IntentQuoteResponse, Error, IntentQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: intentQuoteQueryKey(params),\n queryFn: async () => fetchIntentQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Intent quotes are time-sensitive\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Submit Intent Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function submitIntentSwap(\n client: IPredictClient,\n request: IntentSwapRequestBody,\n): Promise<IntentSwapResponse> {\n return await client.submitIntentSwap(request);\n}\n\nexport function useSubmitIntentSwapMutation(\n options: Omit<\n UseMutationOptions<IntentSwapResponse, Error, IntentSwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: IntentSwapRequestBody) =>\n submitIntentSwap(client, request),\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n PredictionMarketInitQueryParams,\n PredictionMarketInitResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Initialize Prediction Market Mutation\n// -----------------------------------------------------------------------------\n\nexport async function initPredictionMarket(\n client: IPredictClient,\n params: PredictionMarketInitQueryParams,\n): Promise<PredictionMarketInitResponse> {\n return await client.initPredictionMarket(params);\n}\n\nexport function useInitPredictionMarketMutation(\n options: Omit<\n UseMutationOptions<\n PredictionMarketInitResponse,\n Error,\n PredictionMarketInitQueryParams\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (params: PredictionMarketInitQueryParams) =>\n initPredictionMarket(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tokens Query\n// -----------------------------------------------------------------------------\n\nexport function tokensQueryKey(): unknown[] {\n return [\"predict\", \"tokens\"];\n}\n\nexport async function fetchTokens(\n client: IPredictClient,\n): Promise<TokenListResponse> {\n return await client.getTokens();\n}\n\nexport function useTokensQuery(\n options: Omit<\n UseQueryOptions<TokenListResponse, Error, TokenListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensQueryKey(),\n queryFn: async () => fetchTokens(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Tokens With Decimals Query\n// -----------------------------------------------------------------------------\n\nexport function tokensWithDecimalsQueryKey(): unknown[] {\n return [\"predict\", \"tokens\", \"decimals\"];\n}\n\nexport async function fetchTokensWithDecimals(\n client: IPredictClient,\n): Promise<TokenListWithDecimalsResponse> {\n return await client.getTokensWithDecimals();\n}\n\nexport function useTokensWithDecimalsQuery(\n options: Omit<\n UseQueryOptions<\n TokenListWithDecimalsResponse,\n Error,\n TokenListWithDecimalsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensWithDecimalsQueryKey(),\n queryFn: async () => fetchTokensWithDecimals(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, VenueListResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Venues Query\n// -----------------------------------------------------------------------------\n\nexport function venuesQueryKey(): unknown[] {\n return [\"predict\", \"venues\"];\n}\n\nexport async function fetchVenues(\n client: IPredictClient,\n): Promise<VenueListResponse> {\n return await client.getVenues();\n}\n\nexport function useVenuesQuery(\n options: Omit<\n UseQueryOptions<VenueListResponse, Error, VenueListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: venuesQueryKey(),\n queryFn: async () => fetchVenues(client),\n // Venue list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { DflowPredictWsClient, createDflowPredictWsClient } from \"../client/ws\";\nimport type { WsClientConfig } from \"../client/ws\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsConnectionParams {\n /** WebSocket endpoint URL */\n wsEndpoint: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Enable connection (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseWsConnectionResult {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Current connection status */\n status: WsConnectionStatus;\n /** Whether currently connected */\n isConnected: boolean;\n /** Connect to WebSocket */\n connect: () => void;\n /** Disconnect from WebSocket */\n disconnect: () => void;\n /** Last error */\n error: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for managing WebSocket connection lifecycle\n */\nexport function useWsConnection({\n wsEndpoint,\n autoConnect = true,\n autoReconnect = true,\n enabled = true,\n}: UseWsConnectionParams): UseWsConnectionResult {\n const [status, setStatus] = useState<WsConnectionStatus>(\"disconnected\");\n const [error, setError] = useState<Error | null>(null);\n const clientRef = useRef<DflowPredictWsClient | null>(null);\n\n // Initialize client\n useEffect(() => {\n if (!enabled) {\n if (clientRef.current) {\n clientRef.current.disconnect();\n clientRef.current = null;\n }\n setStatus(\"disconnected\");\n return;\n }\n\n const config: WsClientConfig = {\n wsUrl: wsEndpoint,\n autoConnect,\n autoReconnect,\n };\n\n const client = createDflowPredictWsClient(config);\n clientRef.current = client;\n\n // Listen for status changes\n const unsubStatus = client.on(\"status\", (newStatus) => {\n setStatus(newStatus);\n });\n\n // Listen for errors\n const unsubError = client.on(\"error\", (err) => {\n setError(err);\n });\n\n // Listen for successful connection to clear error\n const unsubConnect = client.on(\"connect\", () => {\n setError(null);\n });\n\n // Cleanup on unmount\n return () => {\n unsubStatus();\n unsubError();\n unsubConnect();\n client.disconnect();\n clientRef.current = null;\n };\n }, [wsEndpoint, autoConnect, autoReconnect, enabled]);\n\n const connect = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n const disconnect = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n return {\n client: clientRef.current,\n status,\n isConnected: status === \"connected\",\n connect,\n disconnect,\n error,\n };\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { PredictContext } from \"../contexts/PredictContext\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsClientResult {\n /** WebSocket client instance (null if not configured) */\n wsClient: IPredictWsClient | null;\n /** Current connection status */\n wsStatus: WsConnectionStatus;\n /** Whether currently connected */\n isWsConnected: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook to access the WebSocket client from PredictContext.\n * Connection status is derived directly from the wsClient instance.\n */\nexport function useWsClient(): UseWsClientResult {\n const context = useContext(PredictContext);\n\n if (!context) {\n throw new Error(\"useWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n\n // Sync initial status\n setWsStatus(wsClient.getStatus());\n\n // Listen for status changes\n const unsubscribe = wsClient.onStatusChange(setWsStatus);\n return unsubscribe;\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useEffect, useState, useRef } from \"react\";\nimport type { IPredictWsClient, WsPriceUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when price update received */\n onUpdate?: (update: WsPriceUpdate) => void;\n}\n\nexport interface PriceData {\n yesBid: string | null;\n yesAsk: string | null;\n noBid: string | null;\n noAsk: string | null;\n updatedAt: number;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Map of market ticker to latest price data */\n prices: Map<string, PriceData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time price updates\n */\nexport function usePricesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, PriceData>>(new Map());\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribePrices(options, (update) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBid: update.yes_bid,\n yesAsk: update.yes_ask,\n noBid: update.no_bid,\n noAsk: update.no_ask,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n return {\n prices,\n isSubscribed,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type { IPredictWsClient, WsTradeUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Maximum number of trades to keep in history (default: 100) */\n maxHistory?: number;\n /** Callback when trade update received */\n onUpdate?: (update: WsTradeUpdate) => void;\n}\n\nexport interface TradeData {\n tradeId: string;\n marketTicker: string;\n price: number;\n count: number;\n yesPrice: number;\n noPrice: number;\n takerSide: \"yes\" | \"no\";\n createdTime: number;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Recent trades (newest first) */\n trades: TradeData[];\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Clear trade history */\n clearHistory: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time trade updates\n */\nexport function useTradesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n maxHistory = 100,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<TradeData[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeTrades(options, (update) => {\n const trade: TradeData = {\n tradeId: update.trade_id,\n marketTicker: update.market_ticker,\n price: update.price,\n count: update.count,\n yesPrice: update.yes_price,\n noPrice: update.no_price,\n takerSide: update.taker_side,\n createdTime: update.created_time,\n };\n\n setTrades((prev) => {\n const next = [trade, ...prev];\n if (next.length > maxHistory) {\n return next.slice(0, maxHistory);\n }\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled, maxHistory]);\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n return {\n trades,\n isSubscribed,\n clearHistory,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type {\n IPredictWsClient,\n WsOrderbookUpdate,\n OrderbookLevel,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when orderbook update received */\n onUpdate?: (update: WsOrderbookUpdate) => void;\n}\n\nexport interface OrderbookData {\n yesBids: OrderbookLevel[];\n yesAsks: OrderbookLevel[];\n noBids: OrderbookLevel[];\n noAsks: OrderbookLevel[];\n updatedAt: number;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Map of market ticker to latest orderbook data */\n orderbooks: Map<string, OrderbookData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Get orderbook for a specific ticker */\n getOrderbook: (ticker: string) => OrderbookData | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time orderbook updates\n */\nexport function useOrderbookSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbooks, setOrderbooks] = useState<Map<string, OrderbookData>>(\n new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeOrderbook(options, (update) => {\n setOrderbooks((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBids: update.yes_bids,\n yesAsks: update.yes_asks,\n noBids: update.no_bids,\n noAsks: update.no_asks,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n const getOrderbook = useCallback(\n (ticker: string) => orderbooks.get(ticker),\n [orderbooks],\n );\n\n return {\n orderbooks,\n isSubscribed,\n getOrderbook,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTagsByCategoriesQuery } from \"../../hooks\";\n\n// -----------------------------------------------------------------------------\n// Preferred display order\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Culture\",\n \"Crypto\",\n \"Climate\",\n \"Economics\",\n \"Mentions\",\n \"Companies\",\n \"Financials\",\n \"Tech & Science\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** A single category with its tags */\nexport interface EventCategory {\n /** Category name (e.g. \"Politics\", \"Economics\") */\n category: string;\n /** Tags associated with this category */\n tags: string[];\n}\n\n/** Return type for the useEventsCategories hook */\nexport interface UseEventsCategoriesResult {\n /** Structured category list */\n data: EventCategory[];\n /** Whether data is still loading */\n isLoading: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Fetches event categories and their tags.\n *\n * Uses `getTagsByCategories()` to build a sorted list of categories, each\n * containing the tags that belong to it.\n *\n * @example\n * ```tsx\n * const { data: categories, isLoading } = useEventsCategories();\n *\n * // categories = [\n * // { category: \"Politics\", tags: [\"US Elections\", ...] },\n * // { category: \"Sports\", tags: [\"NFL\", \"NBA\", ...] },\n * // ...\n * // ]\n * ```\n */\nexport function useEventsCategories(): UseEventsCategoriesResult {\n const {\n data: tagsData,\n isLoading,\n isError,\n error,\n } = useTagsByCategoriesQuery();\n\n const data = useMemo<EventCategory[]>(() => {\n if (!tagsData?.tagsByCategories) return [];\n\n const orderIndex = (cat: string) => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(tagsData.tagsByCategories)\n .map(([category, tags]) => ({ category, tags }))\n .sort((a, b) => orderIndex(a.category) - orderIndex(b.category));\n }, [tagsData]);\n\n return { data, isLoading, isError, error: error ?? null };\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, HorizontalScrollContainer, Skeleton } from \"@liberfi.io/ui\";\nimport type { EventCategory } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: EventCategory[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: string[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n return (\n <div className={cn(\"flex w-full flex-col gap-2\", className)}>\n {/* Primary: category chips */}\n <HorizontalScrollContainer>\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {/* \"Trending\" chip */}\n <Chip\n label={t(\"predict.categories.trending\")}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n />\n\n {/* Category chips */}\n {categories.map((cat) => (\n <Chip\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n />\n ))}\n </div>\n </HorizontalScrollContainer>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <HorizontalScrollContainer>\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {/* \"All\" tag chip — resets tag filter to full category */}\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n variant=\"secondary\"\n />\n\n {activeTags.map((tag) => (\n <Chip\n key={tag}\n label={tag}\n isSelected={selectedTag === tag}\n onPress={() => onTagSelect(tag)}\n variant=\"secondary\"\n />\n ))}\n </div>\n </HorizontalScrollContainer>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — reusable chip button\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n variant?: \"primary\" | \"secondary\";\n}\n\nfunction Chip({ label, isSelected, onPress, variant = \"primary\" }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"shrink-0 rounded-full px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer\",\n \"border whitespace-nowrap\",\n variant === \"primary\"\n ? isSelected\n ? \"bg-foreground text-background border-foreground\"\n : \"bg-content1 text-foreground/70 border-default-200 hover:bg-default-100 hover:text-foreground\"\n : isSelected\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content1 text-foreground/50 border-default-100 hover:bg-default-50 hover:text-foreground/70\",\n )}\n >\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex items-center gap-2 px-0.5 py-1\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-8 shrink-0 rounded-full\"\n style={{ width: `${60 + Math.random() * 40}px` }}\n />\n ))}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useEventsCategories } from \"./categories.script\";\nimport { CategoriesUI, CategoriesSkeleton } from \"./categories.ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Selection state emitted by the categories widget */\nexport interface CategorySelection {\n /** Selected category name, null when \"Trending\" is selected */\n category: string | null;\n /** Tags to filter by, null when no filter is applied */\n tags: string[] | null;\n}\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback when category / tag selection changes.\n * - `category = null, tags = null` → \"Trending\" is selected (no filter)\n * - `category = \"Politics\", tags = [...]` → category selected with its tags\n */\n onSelect?: (selection: CategorySelection) => void;\n /** Optional class name */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n className,\n}: CategoriesWidgetProps) {\n const { data: categories, isLoading } = useEventsCategories();\n\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (category: string | null) => {\n setSelectedCategory(category);\n setSelectedTag(null); // reset tag when category changes\n\n if (!category) {\n // \"Trending\" selected\n onSelect?.({ category: null, tags: null });\n } else {\n // find the category and emit all its tags\n const cat = categories.find((c) => c.category === category);\n onSelect?.({ category, tags: cat?.tags ?? null });\n }\n },\n [categories, onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tag: string | null) => {\n setSelectedTag(tag);\n\n if (!tag) {\n // deselected tag → fall back to full category\n const cat = categories.find((c) => c.category === selectedCategory);\n onSelect?.({ category: selectedCategory, tags: cat?.tags ?? null });\n } else {\n onSelect?.({ category: selectedCategory, tags: [tag] });\n }\n },\n [categories, selectedCategory, onSelect],\n );\n\n // --- render ---\n\n if (isLoading) {\n return <CategoriesSkeleton />;\n }\n\n // Get the tags for the currently selected category\n const activeTags =\n categories.find((c) => c.category === selectedCategory)?.tags ?? [];\n\n return (\n <CategoriesUI\n categories={categories}\n selectedCategory={selectedCategory}\n selectedTag={selectedTag}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n className={className}\n />\n );\n}\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","import { useMemo } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfiniteQuery, useSeriesQuery } from \"../../hooks\";\nimport type { StandardEvent, EventQueryParams } from \"../../types\";\n\n/**\n * useEvents parameters — extends EventQueryParams (without cursor) with\n * optional category / tags filtering.\n */\nexport interface UseEventsParams extends Omit<EventQueryParams, \"cursor\"> {\n /** Filter events by category (scopes the series lookup when tags is set) */\n category?: string | null;\n /**\n * Filter events by tags.\n * Internally converts tags → matching series tickers, then filters events.\n * Takes precedence over `seriesTickers` when provided.\n */\n tags?: string[] | null;\n}\n\n/**\n * useEvents return value\n */\nexport interface UseEventsResult {\n /** All accumulated events data */\n data: StandardEvent[];\n /** Whether *initial* data is still loading (no cache yet) */\n isLoading: boolean;\n /** Whether any fetch is in-flight (includes refetch / param change, excludes fetchNextPage) */\n isFetching: boolean;\n /** Whether more data is being fetched (infinite scroll) */\n isFetchingMore: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n /** Whether there is more data to load */\n hasMore: boolean;\n /** Fetch more results */\n fetchMore: () => void;\n /** Refetch all pages */\n refetch: () => void;\n}\n\n/**\n * Events list hook with infinite scroll support (cursor-based pagination)\n *\n * Supports filtering by `tags` – internally converts tags into matching series\n * tickers via a series query, then filters events by `seriesTickers`.\n *\n * @example\n * ```tsx\n * const {\n * data,\n * isLoading,\n * hasMore,\n * isFetchingMore,\n * fetchMore,\n * } = useEvents({\n * limit: 20,\n * status: 'active',\n * withNestedMarkets: true,\n * category: 'Politics',\n * tags: ['US Elections'],\n * });\n * ```\n */\nexport function useEvents(params: UseEventsParams = {}): UseEventsResult {\n // --- category / tags → seriesTickers conversion ---\n\n const { category, tags, ...restParams } = params;\n const needsSeriesLookup = !!category || (!!tags && tags.length > 0);\n\n const {\n data: seriesData,\n isFetching: isSeriesFetching,\n isError: isSeriesError,\n error: seriesError,\n } = useSeriesQuery(\n {\n ...(category ? { category } : {}),\n ...(tags && tags.length > 0 ? { tags: tags.join(\",\") } : {}),\n isInitialized: true,\n status: \"active\",\n },\n { enabled: needsSeriesLookup },\n );\n\n const derivedSeriesTickers = useMemo(() => {\n if (!needsSeriesLookup || !seriesData?.series) return undefined;\n\n // dflow API limits seriesTickers to 25\n const tickers = seriesData.series.map((s) => s.ticker).slice(0, 25);\n return tickers.length > 0 ? tickers.join(\",\") : undefined;\n }, [needsSeriesLookup, seriesData]);\n\n // --- build final query params ---\n\n const mergedParams = useMemo<Omit<EventQueryParams, \"cursor\">>(\n () => ({\n status: \"active\",\n withNestedMarkets: true,\n sort: \"volume24h\",\n order: \"desc\",\n limit: DEFAULT_PAGE_SIZE,\n ...restParams,\n ...(derivedSeriesTickers !== undefined\n ? { seriesTickers: derivedSeriesTickers }\n : {}),\n }),\n [restParams, derivedSeriesTickers],\n );\n\n const {\n data: infiniteData,\n isLoading: isEventsLoading,\n isFetching: isEventsFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage: fetchMore,\n refetch,\n } = useEventsInfiniteQuery(mergedParams);\n\n // Flatten all pages into a single events array\n const data = useMemo(\n () => infiniteData?.pages.flatMap((page) => page.events) ?? [],\n [infiniteData],\n );\n\n // If series query errors out, stop resolving to avoid stuck state\n const isSeriesResolving = needsSeriesLookup && !seriesData && !isSeriesError;\n\n // isLoading — true only on *initial* load (no cached data at all)\n // isFetching — true whenever any request is in-flight (param change / refetch), excludes fetchNextPage\n // includes isSeriesFetching so that switching tag shows skeleton even when stale series cache exists\n const isLoading = isSeriesResolving || isEventsLoading;\n const isFetching =\n isSeriesFetching ||\n isSeriesResolving ||\n (isEventsFetching && !isFetchingMore);\n\n return {\n data,\n isLoading,\n isFetching,\n isFetchingMore,\n isError: isSeriesError || isError,\n error: seriesError ?? error,\n hasMore,\n fetchMore,\n refetch,\n };\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport type EventItemSkeletonProps = {\n className?: string;\n};\n\nexport function EventItemSkeleton({ className }: EventItemSkeletonProps) {\n return (\n <div\n className={`flex h-full w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 @5xl:gap-y-3 @5xl:p-4 ${className ?? \"\"}`}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: avatar, title, gauge/status */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-8 w-8 flex-shrink-0 rounded-lg @5xl:h-12 @5xl:w-12\" />\n <Skeleton className=\"h-10 flex-1 rounded-md @5xl:h-12\" />\n <Skeleton className=\"h-8 w-12 flex-shrink-0 rounded-lg @5xl:h-10 @5xl:w-14\" />\n </div>\n\n {/* Market rows placeholder */}\n <div className=\"flex w-full flex-col gap-y-0.5 @5xl:gap-y-1\">\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-2/3 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer: show more + volume */}\n <div className=\"flex items-center justify-between gap-x-2\">\n <Skeleton className=\"h-3 w-16 rounded-md @5xl:h-4\" />\n <Skeleton className=\"h-3 w-20 rounded-md @5xl:h-4\" />\n </div>\n </div>\n );\n}\n\nexport type EventsSkeletonProps = {\n count?: number;\n};\n\nexport function EventsSkeleton({ count = 8 }: EventsSkeletonProps) {\n return (\n <div className=\"@container w-full h-full\">\n <div className=\"grid grid-cols-1 gap-4 @[640px]:grid-cols-2 @[1024px]:grid-cols-3 @[1280px]:grid-cols-4\">\n {Array.from({ length: count }).map((_, index) => (\n <EventItemSkeleton key={index} className=\"min-h-44 @5xl:min-h-56\" />\n ))}\n </div>\n </div>\n );\n}\n","export type GaugeChartUIProps = {\n /** Value between 0 and 100 (cents) */\n value: number;\n /** Whether to show percentage label */\n showLabel?: boolean;\n};\n\nexport function GaugeChartUI({ value, showLabel = true }: GaugeChartUIProps) {\n const normalized = value / 100;\n\n return (\n <div className=\"flex-shrink-0 flex flex-col items-center\">\n <div className=\"relative w-16 h-12 lg:w-20 lg:h-14\">\n <svg className=\"w-full h-full\" viewBox=\"0 0 100 70\">\n {/* Background arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-default-200\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n {/* Progress arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-primary\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n strokeDasharray={`${normalized * 125.6} 125.6`}\n style={{\n transition: \"stroke-dasharray 0.5s ease-in-out\",\n }}\n />\n </svg>\n {/* Percentage in center */}\n {showLabel && (\n <div className=\"absolute inset-0 flex items-center justify-center pt-3 lg:pt-4\">\n <span className=\"text-sm font-bold text-foreground lg:text-base leading-none\">\n {value.toFixed(0)}%\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronUpIcon,\n StyledTooltip,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { GaugeChartUI } from \"./gauge-chart.ui\";\n\nexport type EventItemUIProps = {\n event: StandardEvent;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventItemUI({\n event,\n onSelect,\n onSelectOutcome,\n}: EventItemUIProps) {\n const { t } = useTranslation();\n const [manualSelectedMarket, setManualSelectedMarket] =\n useState<StandardMarket | null>(null);\n\n const rawMarkets = event.markets || [];\n const markets =\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n )\n : rawMarkets;\n const openMarkets = markets.filter((market) => market.status === \"active\");\n\n const isSingleMarket = markets.length === 1;\n const selectedMarket = isSingleMarket ? markets[0] : manualSelectedMarket;\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n // Get the yes price in cents (0-100) from the market\n // yesAsk / yesBid are in dollars (0~1), multiply by 100 to get cents\n const getYesCents = (market: StandardMarket): number | null => {\n if (market.yesAsk) return parseFloat(market.yesAsk) * 100;\n return null;\n };\n\n const getNoCents = (market: StandardMarket): number | null => {\n if (market.noAsk) return parseFloat(market.noAsk) * 100;\n return null;\n };\n\n const getYesPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (yesCents != null) {\n if (noCents == null && yesCents <= 1) return \"< 1%\";\n return formatPercent(yesCents);\n }\n if (noCents != null) {\n if (noCents <= 1) return \"> 99%\";\n return formatPercent(100 - noCents);\n }\n return \"0%\";\n };\n\n const getNoPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (noCents != null) {\n if (yesCents == null && noCents <= 1) return \"< 1%\";\n return formatPercent(noCents);\n }\n if (yesCents != null) {\n if (yesCents <= 1) return \"> 99%\";\n return formatPercent(100 - yesCents);\n }\n return \"0%\";\n };\n\n // Format cents price as percentage string\n const formatPercent = (cents: number | null): string =>\n cents != null ? `${cents.toFixed(0)}%` : \"--\";\n\n // Determine event status based on market statuses\n const eventStatus = useMemo(() => {\n const hasActiveMarket = markets.some((m) => m.status === \"active\");\n const allClosed = markets.every(\n (m) => m.status === \"closed\" || m.status === \"determined\",\n );\n\n if (allClosed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (hasActiveMarket)\n return {\n label: t(\"predict.event.status.live\"),\n color: \"bg-primary-100/50 text-primary\",\n };\n return {\n label: t(\"predict.event.status.pending\"),\n color: \"bg-warning-100/50 text-warning\",\n };\n }, [markets, t]);\n\n const handleMarketClick = (market: StandardMarket) => {\n setManualSelectedMarket(market);\n };\n\n const handleBack = () => {\n setManualSelectedMarket(null);\n };\n\n const handleYesClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"yes\");\n }\n };\n\n const handleNoClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"no\");\n }\n };\n\n const handleSelect = () => {\n if (onSelect) {\n onSelect(event);\n }\n };\n\n const displayedMarkets = openMarkets.slice(0, 2);\n const hasMoreMarkets = openMarkets.length > 2;\n\n return (\n <div\n className=\"flex h-full w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 transition-all duration-300 cursor-pointer hover:border-primary hover:ring-2 hover:ring-primary/20 focus-within:border-primary focus-within:bg-content2 focus-within:ring-2 focus-within:ring-primary/20 @5xl:gap-y-3 @5xl:p-4\"\n onClick={handleSelect}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: image, title, status */}\n <div className=\"flex items-center gap-4\">\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"md\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 @5xl:h-12 @5xl:w-12\"\n />\n <StyledTooltip content={event.title} placement=\"bottom\">\n <p className=\"flex-1 min-w-0 h-10 @5xl:h-12 text-sm font-semibold @5xl:text-base line-clamp-2\">\n {event.title}\n </p>\n </StyledTooltip>\n\n {isSingleMarket ? (\n <GaugeChartUI value={getYesCents(markets[0]) ?? 50} />\n ) : (\n eventStatus.label !== t(\"predict.event.status.live\") && (\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm @5xl:px-4 @5xl:py-2 ${eventStatus.color}`}\n >\n <span>{eventStatus.label}</span>\n </div>\n )\n )}\n </div>\n\n {/* Selected state: show selected market (only for multiple markets) */}\n {selectedMarket && !isSingleMarket && (\n <button\n type=\"button\"\n className=\"flex min-h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <span className=\"text-left text-xs text-foreground @5xl:text-sm line-clamp-1\">\n {selectedMarket.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-foreground @5xl:text-lg\">\n {getYesPercent(selectedMarket)}\n </span>\n <ChevronUpIcon className=\"w-3 h-3 text-default-500 @5xl:w-4 @5xl:h-4\" />\n </div>\n </button>\n )}\n\n {/* Unselected state: show max 2 markets (only for multiple markets) */}\n {!selectedMarket && !isSingleMarket && displayedMarkets.length > 0 && (\n <div className=\"flex w-full flex-col gap-y-0.5 text-xs @5xl:gap-y-1 @5xl:text-sm\">\n {displayedMarkets.map((market) => (\n <button\n type=\"button\"\n key={market.ticker}\n className=\"flex min-h-8 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleMarketClick(market);\n }}\n >\n <span className=\"text-left text-xs text-foreground @5xl:text-sm line-clamp-1\">\n {market.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-xs text-foreground @5xl:text-base\">\n {getYesPercent(market)}\n </span>\n <div className=\"flex h-full items-center gap-x-3 rounded-lg p-1 @5xl:p-1.5 bg-gradient-to-r from-primary-50/20 via-primary-50/20 to-secondary-50/20\">\n <span className=\"text-primary\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"text-default-400\">/</span>\n <span className=\"text-secondary\">\n {t(\"predict.market.no\")}\n </span>\n </div>\n </div>\n </button>\n ))}\n {hasMoreMarkets && (\n <span className=\"text-xxs text-default-500 @5xl:text-xs\">\n {t(\"predict.event.moreMarkets\", {\n count: openMarkets.length - 2,\n })}\n </span>\n )}\n </div>\n )}\n\n {/* Selected state: show Yes/No buttons */}\n {selectedMarket && (\n <div\n className={`flex items-center gap-x-2 text-sm @5xl:text-base ${isSingleMarket ? \"mt-3\" : \"\"}`}\n >\n <Button\n color=\"primary\"\n fullWidth\n className=\"group/yes bg-primary-100 text-primary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleYesClick}\n >\n <span className=\"group-hover/yes:hidden\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"hidden group-hover/yes:inline\">\n {getYesPercent(selectedMarket)}\n </span>\n </Button>\n <Button\n color=\"secondary\"\n fullWidth\n className=\"group/no bg-secondary-100 text-secondary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleNoClick}\n >\n <span className=\"group-hover/no:hidden\">\n {t(\"predict.market.no\")}\n </span>\n <span className=\"hidden group-hover/no:inline\">\n {getNoPercent(selectedMarket)}\n </span>\n </Button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n {!selectedMarket || isSingleMarket ? (\n <div className=\"flex items-center justify-between gap-x-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-xxs text-default-600 hover:text-foreground @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleSelect();\n }}\n >\n <span>{t(\"predict.event.showMore\")}</span>\n <ChevronRightIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n </button>\n <span className=\"text-xxs text-default-600 @5xl:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center cursor-pointer gap-x-1 text-xxs text-default-600 hover:text-foreground @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n <span>{t(\"predict.event.back\")}</span>\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useRef, type CSSProperties } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { EventItemUI } from \"./event-item.ui\";\n\n// Tailwind viewport breakpoints\nconst SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Gap between cards in px (matches Tailwind gap-4) */\nconst GAP = 16;\n\n/** Row heights per breakpoint (card height + bottom gap) */\nconst ROW_HEIGHT_XS = 192;\nconst ROW_HEIGHT_SM = 228;\nconst ROW_HEIGHT_LG = 244;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= SM) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n if (width >= MD) return ROW_HEIGHT_SM;\n return ROW_HEIGHT_XS;\n}\n\n// ---------------------------------------------------------------------------\n// EventsUI — virtual grid with infinite loading\n// ---------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n /** Events data to render */\n events: StandardEvent[];\n /** Whether there is more data to load */\n hasMore?: boolean;\n /** Callback to fetch more data */\n onFetchMore?: () => void;\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n}: EventsUIProps) {\n // --- container dimensions ---\n const containerRef = useRef<HTMLDivElement>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n // --- layout calculations ---\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const totalRowCount = hasMore ? dataRowCount + 1 : dataRowCount;\n\n // --- infinite loader ---\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={rowHeight}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n gap: GAP,\n onSelect,\n onSelectOutcome,\n }}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row component — renders a single row of N columns\n// ---------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: StandardEvent[];\n columnCount: number;\n dataRowCount: number;\n gap: number;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n gap,\n onSelect,\n onSelectOutcome,\n}: RowComponentProps<EventGridRowData>) {\n // Loading indicator for the sentinel row beyond loaded data\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n const innerStyle: CSSProperties = {\n display: \"flex\",\n gap,\n height: `calc(100% - ${gap}px)`,\n };\n\n return (\n <div style={style}>\n <div style={innerStyle}>\n {rowEvents.map((event) => (\n <div key={event.ticker} style={{ flex: 1, minWidth: 0 }}>\n <EventItemUI\n event={event}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n ))}\n {/* Spacers to keep equal-width columns on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { useEvents, type UseEventsParams } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport interface EventsWidgetProps extends UseEventsParams {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\nexport function EventsWidget({\n onSelect,\n onSelectOutcome,\n ...queryParams\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEvents({ limit: DEFAULT_PAGE_SIZE, ...queryParams });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n CategoriesWidget,\n type CategorySelection,\n} from \"../categories/categories.widget\";\nimport { EventsWidget } from \"./events.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({ onSelect, onSelectOutcome }: EventsPageProps) {\n const [selection, setSelection] = useState<CategorySelection>({\n category: null,\n tags: null,\n });\n\n const handleSelect = useCallback((s: CategorySelection) => {\n setSelection(s);\n }, []);\n\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n {/* Category + tag filter bar */}\n <CategoriesWidget onSelect={handleSelect} />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n category={selection.category}\n tags={selection.tags}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport { useOrderQuery } from \"../../hooks/useOrderQuery\";\nimport type {\n StandardMarket,\n OrderResponse,\n MarketAccountInfo,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Trade outcome - yes or no */\nexport type TradeOutcome = \"yes\" | \"no\";\n\n/** Trade side - buy or sell */\nexport type TradeSide = \"buy\" | \"sell\";\n\nexport interface UseTradeFormParams {\n /** Market to trade in */\n market: StandardMarket;\n /** Chain network to use (default: 'solana') */\n chain?: string;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Initial trade side */\n initialSide?: TradeSide;\n}\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\nexport interface UseTradeFormResult {\n // -- State ------------------------------------------------------------------\n /** Current outcome (yes/no) */\n outcome: TradeOutcome;\n /** Current side (buy/sell) */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n\n // -- Derived ----------------------------------------------------------------\n /** Number of shares (buy: amount / price, sell: quantity) */\n shares: number;\n /** Estimated cost in dollars */\n estimatedCost: number;\n /** Potential payout in dollars */\n potentialPayout: number;\n /** Potential profit in dollars */\n potentialProfit: number;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Best bid price from order book (cents) */\n bestBid: number | null;\n /** Best ask price from order book (cents) */\n bestAsk: number | null;\n /** Current order response from the API (includes quote + transaction) */\n order: OrderResponse | null;\n /** Price impact percentage */\n priceImpact: number | null;\n\n // -- Balances ---------------------------------------------------------------\n /** USDC balance in dollars (for buy side) */\n usdcBalance: number | null;\n /** Outcome token balance in token units (for sell side) */\n outcomeTokenBalance: number | null;\n /** Yes token balance (shares held) */\n yesTokenBalance: number | null;\n /** No token balance (shares held) */\n noTokenBalance: number | null;\n /** Whether balance is being fetched */\n isBalanceLoading: boolean;\n\n // -- Status -----------------------------------------------------------------\n /** Whether order/quote is being fetched */\n isQuoteLoading: boolean;\n /** Whether a transaction is being signed/sent */\n isSubmitting: boolean;\n /** Order/quote fetch error (if any) */\n quoteError: Error | null;\n /** Transaction hash after successful send */\n txHash: string | null;\n /** Form validation result */\n validation: TradeFormValidation;\n\n // -- Actions ----------------------------------------------------------------\n /** Set outcome */\n setOutcome: (outcome: TradeOutcome) => void;\n /** Set side */\n setSide: (side: TradeSide) => void;\n /** Set quantity (minimum ORDER_MIN_QUANTITY) */\n setQuantity: (quantity: number) => void;\n /** Submit the swap */\n submit: () => void;\n /** Reset form to initial values */\n reset: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get mint address for the specified outcome from market accounts.\n * `accounts` is keyed by collateral token mint (e.g. USDC mint), not by chain.\n */\nfunction getMintAddress(\n accounts: Record<string, MarketAccountInfo>,\n collateralMint: string,\n outcome: TradeOutcome,\n): string | null {\n const accountInfo = accounts[collateralMint];\n if (!accountInfo) return null;\n return outcome === \"yes\" ? accountInfo.yesMint : accountInfo.noMint;\n}\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/** Fire a celebration confetti burst 🎉 */\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n\n // Center burst\n confetti({\n ...defaults,\n particleCount: 80,\n origin: { x: 0.5, y: 0.4 },\n });\n\n // Left side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.3, y: 0.6 },\n });\n }, 150);\n\n // Right side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.7, y: 0.6 },\n });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n\n // Auth & wallet from wallet-connector\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n\n // Form state\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n\n // Get the outcome mint address (accounts are keyed by collateral mint, e.g. USDC)\n const outcomeMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, outcome),\n [market.accounts, outcome],\n );\n\n // Determine input/output mints based on side\n const { inputMint, outputMint } = useMemo(() => {\n if (side === \"buy\") {\n // Buying outcome tokens: USDC -> Outcome Mint\n return { inputMint: USDC_MINT, outputMint: outcomeMint };\n }\n // Selling outcome tokens: Outcome Mint -> USDC\n return { inputMint: outcomeMint, outputMint: USDC_MINT };\n }, [side, outcomeMint]);\n\n // Quote query (enabled only when we have valid mints and quantity)\n const quoteEnabled =\n Boolean(inputMint) && Boolean(outputMint) && quantity > 0;\n\n // Current price per share (0–1, in dollars)\n const pricePerShare = useMemo(() => {\n if (outcome === \"yes\") {\n return Number(market.yesAsk ?? 0.5);\n }\n return Number(market.noAsk ?? 0.5);\n }, [outcome, market.yesAsk, market.noAsk]);\n\n // For buy: quantity = dollar amount → convert to shares\n // For sell: quantity = number of shares\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return pricePerShare > 0 ? quantity / pricePerShare : 0;\n }\n return quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit (6 decimals) for the inputMint\n // Buy: inputMint = USDC → amount = dollar amount × 10^6\n // Sell: inputMint = outcome token → amount = shares × 10^6\n const amount = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return Math.round(quantity * 1_000_000);\n }, [quantity]);\n\n // Order query – returns quote data + base64 transaction when userPublicKey is provided\n const {\n data: order,\n isLoading: isQuoteLoading,\n error: quoteError,\n refetch: refetchOrder,\n } = useOrderQuery(\n {\n userPublicKey: userPublicKey ?? undefined,\n inputMint: inputMint ?? \"\",\n outputMint: outputMint ?? \"\",\n amount,\n slippageBps: 100, // 1% slippage\n },\n {\n enabled: quoteEnabled,\n },\n );\n\n // Wallet balance query – poll every 10s when authenticated\n const {\n data: walletPortfolios,\n isLoading: isBalanceLoading,\n refetch: refetchBalance,\n } = useWalletPortfoliosQuery(\n {\n chain: Chain.SOLANA,\n address: userPublicKey ?? \"\",\n },\n {\n enabled: isAuthenticated && Boolean(userPublicKey),\n refetchInterval: 10_000,\n },\n );\n\n // USDC balance in dollars (amount string from portfolio)\n const usdcBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios) return null;\n const usdcPortfolio = walletPortfolios.portfolios.find(\n (p) => p.address === USDC_MINT,\n );\n return usdcPortfolio ? parseFloat(usdcPortfolio.amount) : 0;\n }, [walletPortfolios]);\n\n // Outcome token balance (shares the user holds for selected outcome)\n const outcomeTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !outcomeMint) return null;\n const outcomePortfolio = walletPortfolios.portfolios.find(\n (p) => p.address === outcomeMint,\n );\n return outcomePortfolio ? parseFloat(outcomePortfolio.amount) : 0;\n }, [walletPortfolios, outcomeMint]);\n\n // Yes / No token balances (for displaying under each button on sell side)\n const yesMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"yes\"),\n [market.accounts],\n );\n const noMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"no\"),\n [market.accounts],\n );\n\n const yesTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !yesMint) return null;\n const p = walletPortfolios.portfolios.find((t) => t.address === yesMint);\n return p ? parseFloat(p.amount) : 0;\n }, [walletPortfolios, yesMint]);\n\n const noTokenBalance = useMemo(() => {\n if (!walletPortfolios?.portfolios || !noMint) return null;\n const p = walletPortfolios.portfolios.find((t) => t.address === noMint);\n return p ? parseFloat(p.amount) : 0;\n }, [walletPortfolios, noMint]);\n\n // Order book query for best bid/ask\n const { data: orderBook } = useOrderBookQuery(market.ticker, {\n refetchInterval: 5000,\n });\n\n // Best bid/ask from order book\n const bestBid = useMemo(() => {\n const bids = outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n return bids?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n const bestAsk = useMemo(() => {\n const asks = outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n return asks?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n // Price impact from order\n const priceImpact = useMemo(() => {\n if (!order?.priceImpactPct) return null;\n return parseFloat(order.priceImpactPct);\n }, [order]);\n\n // Cost calculation (in dollars)\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (order) {\n // Order inAmount is in lamports (6 decimals), convert to dollars\n return parseInt(order.inAmount) / 1_000_000;\n }\n // Fallback estimate\n if (side === \"buy\") {\n // Buy: user inputs dollar amount, that IS the cost\n return quantity;\n }\n // Sell: shares × bid price\n const bidPrice =\n outcome === \"yes\"\n ? Number(market.yesBid ?? 0)\n : Number(market.noBid ?? 0);\n return quantity * bidPrice;\n }, [order, side, outcome, quantity, market.yesBid, market.noBid]);\n\n // Potential payout (in dollars) if prediction is correct\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n // Each share pays $1 if correct; shares = amount / pricePerShare\n return shares * 1; // shares × $1\n }\n // Selling: receive the premium upfront (estimatedCost is what you get)\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n // Profit = payout - cost (in dollars)\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter – clears quantity on switch\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n // Quantity setter – allows NaN (empty input)\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n // Buy side: keep up to 2 decimal places (dollar amount)\n // Sell side: integer only (contracts)\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Refetch order when quantity changes\n useEffect(() => {\n if (quoteEnabled) {\n refetchOrder();\n }\n }, [quantity, outcome, side, quoteEnabled, refetchOrder]);\n\n // Validation – form-level checks including balance, auth is handled by useAuthCallback\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n\n if (market.status !== \"active\") {\n errors.push(\"Market is not active\");\n }\n\n // Balance check: buy side requires enough USDC\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n\n // Balance check: sell side requires enough shares\n if (\n side === \"sell\" &&\n outcomeTokenBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > outcomeTokenBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n\n return { isValid: errors.length === 0, errors };\n }, [quantity, market.status, side, usdcBalance, outcomeTokenBalance]);\n\n // Transaction hash after successful send\n const [txHash, setTxHash] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Submit: get order (with transaction) → sign → send\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet ||\n isBalanceLoading\n ) {\n console.warn(\"[TradeForm] submit blocked by guard:\", {\n validationFailed: !validation.isValid,\n notAuthenticated: !isAuthenticated,\n noPublicKey: !userPublicKey,\n noWallet: !solanaWallet,\n balanceLoading: isBalanceLoading,\n });\n return;\n }\n\n setTxHash(null);\n setIsSubmitting(true);\n\n try {\n // Use cached order or fetch a fresh one\n let currentOrder = order;\n if (!currentOrder?.transaction) {\n console.warn(\"[TradeForm] no cached order with tx, refetching…\");\n const result = await refetchOrder();\n currentOrder = result.data;\n }\n\n if (!currentOrder?.transaction) {\n console.error(\n \"[TradeForm] unable to obtain order transaction, aborting\",\n );\n return;\n }\n\n // Decode the base64-encoded transaction\n const txBytes = Uint8Array.from(atob(currentOrder.transaction), (c) =>\n c.charCodeAt(0),\n );\n\n // Sign and send the transaction via wallet adapter\n const hash = await solanaWallet.sendTransaction(txBytes);\n console.warn(\"[TradeForm] transaction sent:\", hash);\n setTxHash(hash);\n\n // 🎉 Success feedback\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n\n // Reset quantity input\n setQuantityRaw(NaN);\n\n // Refresh wallet balance after successful transaction\n refetchBalance();\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n } finally {\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n order,\n isBalanceLoading,\n refetchOrder,\n refetchBalance,\n t,\n ]);\n\n // Reset\n const reset = useCallback(() => {\n setOutcome(initialOutcome);\n setSideRaw(initialSide);\n setQuantityRaw(NaN);\n setTxHash(null);\n }, [initialOutcome, initialSide]);\n\n return {\n outcome,\n side,\n quantity,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n isAuthenticated,\n bestBid,\n bestAsk,\n order: order ?? null,\n priceImpact,\n usdcBalance,\n outcomeTokenBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isQuoteLoading,\n isSubmitting,\n quoteError: quoteError ?? null,\n txHash,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n reset,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Tabs, Tab, StyledNumberInput } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n /** Event data */\n event?: StandardEvent;\n /** Market data */\n market: StandardMarket;\n /** Current outcome */\n outcome: TradeOutcome;\n /** Current side */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n /** Estimated cost in cents */\n estimatedCost: number;\n /** Potential payout in cents */\n potentialPayout: number;\n /** Potential profit in cents */\n potentialProfit: number;\n /** Whether swap is being submitted */\n isSubmitting: boolean;\n /** USDC balance in dollars (null if not loaded) */\n usdcBalance: number | null;\n /** Yes token balance (shares held, for sell side) */\n yesTokenBalance: number | null;\n /** No token balance (shares held, for sell side) */\n noTokenBalance: number | null;\n /** Whether balance is loading */\n isBalanceLoading: boolean;\n /** Whether the form is valid */\n isValid: boolean;\n /** Validation error messages */\n validationErrors: string[];\n /** Set outcome */\n onOutcomeChange: (outcome: TradeOutcome) => void;\n /** Set side */\n onSideChange: (side: TradeSide) => void;\n /** Set quantity */\n onQuantityChange: (quantity: number) => void;\n /** Submit swap */\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n outcome,\n side,\n quantity,\n potentialProfit,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n onOutcomeChange,\n onSideChange,\n onQuantityChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n\n // Button label\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n return `${sideLabel} ${outcomeLabel}`;\n }, [isSubmitting, side, outcome, t]);\n\n // Button color\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4\">\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"}\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {outcome === \"yes\" ? market.yesSubTitle : market.noSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Side tabs: Buy / Sell */}\n <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs>\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance = o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {Math.round(Number(price) * 100)}¢\n </span>\n ) : null;\n })()}\n </button>\n {/* Holdings display (sell side, selected outcome only) */}\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* USDC balance (buy side only) */}\n {side === \"buy\" && (\n <div className=\"flex items-center justify-end gap-x-1 text-xs text-default-500\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-4 w-4 rounded-full object-cover\"\n />\n <span>{t(\"predict.trade.balance\")}:</span>\n <span className=\"font-medium text-foreground\">\n {isBalanceLoading\n ? \"–\"\n : usdcBalance != null\n ? `$${usdcBalance.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n )}\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.amount\")\n : t(\"predict.trade.contracts\")}\n </span>\n <StyledNumberInput\n key={side}\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\n }\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Quick amount buttons */}\n <div className=\"flex gap-x-2 justify-end\">\n {side === \"buy\" ? (\n <>\n {[1, 5, 10, 100].map((amt) => (\n <button\n key={amt}\n type=\"button\"\n onClick={() =>\n onQuantityChange(\n Math.round(\n ((isNaN(quantity) ? 0 : quantity) + amt) * 100,\n ) / 100,\n )\n }\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n +{amt}$\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max balance */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n ) : (\n <>\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n /* TODO: set to pct% of holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Payout / Receive display */}\n {!isNaN(quantity) && quantity > 0 && (\n <div className=\"flex flex-col items-end gap-y-0.5\">\n <span className=\"text-sm text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.potentialWin\")\n : t(\"predict.trade.estimatedReceive\")}\n </span>\n <span className=\"text-xl font-semibold text-bullish\">\n ${(side === \"buy\" ? potentialProfit : estimatedCost).toFixed(2)}\n </span>\n </div>\n )}\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!isValid || isSubmitting}\n isLoading={isSubmitting}\n onPress={onSubmit}\n >\n {submitLabel}\n </Button>\n </div>\n );\n}\n","import { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n useTradeForm,\n type TradeSide,\n type TradeOutcome,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n /** Event data */\n event?: StandardEvent;\n /** Market to trade */\n market: StandardMarket;\n /** Initial trade side */\n initialSide?: TradeSide;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Chain network (default: 'solana') */\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n // Wrap submit with auth check — triggers sign-in if not authenticated\n const authenticatedSubmit = useAuthCallback(submit);\n\n return (\n <TradeFormUI\n event={event}\n market={market}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n/** Repeatable skeleton row for market list */\nfunction MarketRow() {\n return (\n <div className=\"flex items-center gap-x-3 px-2 py-3 lg:gap-x-4\">\n <Skeleton className=\"h-4 flex-1 rounded-md\" />\n <Skeleton className=\"h-5 w-10 shrink-0 rounded-md\" />\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </div>\n );\n}\n\nexport interface EventDetailSkeletonProps {\n /** Number of market rows */\n marketCount?: number;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n}: EventDetailSkeletonProps) {\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl animate-pulse\">\n {/* Header: avatar + title */}\n <div className=\"flex items-center gap-x-3 lg:gap-x-4\">\n <Skeleton className=\"h-14 w-14 shrink-0 rounded-lg lg:h-18 lg:w-18\" />\n <div className=\"flex flex-col gap-y-1.5 min-w-0 flex-1\">\n <Skeleton className=\"h-3 w-24 rounded-md lg:w-32\" />\n <Skeleton className=\"h-5 w-48 rounded-md lg:h-6 lg:w-72\" />\n </div>\n </div>\n\n {/* Chart placeholder */}\n <Skeleton className=\"h-[200px] w-full rounded-xl lg:h-[280px]\" />\n\n {/* Volume + range bar */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n <div className=\"flex gap-x-1\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-10 rounded-md\" />\n ))}\n </div>\n </div>\n\n {/* Market rows */}\n <div className=\"flex flex-col divide-y divide-default-200\">\n {Array.from({ length: marketCount }).map((_, i) => (\n <MarketRow key={i} />\n ))}\n </div>\n </div>\n );\n}\n\n/** Compact skeleton for the sidebar trade form area */\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4 animate-pulse\">\n {/* Header */}\n <div className=\"flex items-center gap-x-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-col gap-y-1 flex-1\">\n <Skeleton className=\"h-3 w-28 rounded-md\" />\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n </div>\n </div>\n {/* Tabs */}\n <div className=\"flex gap-x-4\">\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n {/* Outcome buttons */}\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n </div>\n {/* Input */}\n <Skeleton className=\"h-14 w-full rounded-lg\" />\n {/* Submit */}\n <Skeleton className=\"h-12 w-full rounded-lg\" />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useSeriesByTickerQuery } from \"../../hooks/useSeriesQuery\";\nimport type { CandlesticksResponse } from \"../../types\";\n\nexport interface UseEventDetailParams {\n eventId: string;\n /** Market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n candlestickMarketTickers?: string[];\n /** Chart time range (1d / 1w / 1m / all). Determines both the query window and candlestick granularity. */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const { candlestickMarketTickers, chartRange = DEFAULT_CHART_RANGE } = params;\n\n // Derive candlestick granularity and query time window from chart range\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs so it doesn't change on every render; recompute when range changes\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n [chartRange],\n );\n\n const client = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventByIdQuery({ id: params.eventId, withNestedMarkets: true });\n\n // For ALL range, start from the earliest market openTime; otherwise use duration offset\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n // Find the earliest openTime across all markets\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => m.openTime));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const {\n data: series,\n isLoading: isSeriesLoading,\n error: seriesError,\n } = useSeriesByTickerQuery(event?.seriesTicker ?? \"\", {\n enabled: !!event?.seriesTicker,\n });\n\n // Build a list of market tickers to fetch candlesticks for\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketTickers && candlestickMarketTickers.length > 0\n ? candlestickMarketTickers\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((ticker) => event.markets!.find((m) => m.ticker === ticker))\n .filter((m) => m !== undefined)\n : [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.ticker);\n }, [candlestickMarketTickers, event?.markets]);\n\n // Query candlesticks for each market in parallel\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((ticker) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(client, {\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((ticker, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) {\n errors.set(ticker, error);\n }\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n // Build a map of ticker -> candlesticks\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((ticker, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) {\n map.set(ticker, data);\n }\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n seriesError,\n /** Derived candlestick granularity (for chart formatting) */\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n","import { useMemo } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { StandardMarket } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHolding {\n /** Number of Yes outcome shares held */\n yesShares: number;\n /** Number of No outcome shares held */\n noShares: number;\n}\n\n/** Map of market ticker → holdings */\nexport type MarketsHoldingsMap = Map<string, MarketHolding>;\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/**\n * Fetches wallet portfolio and computes Yes / No token holdings\n * for each market. React Query deduplicates the wallet query\n * automatically.\n */\nexport function useMarketsHoldings(markets: StandardMarket[]): {\n holdings: MarketsHoldingsMap;\n isLoading: boolean;\n} {\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = status === \"authenticated\";\n const address = solanaWallet?.address;\n\n const { data: walletPortfolios, isLoading } = useWalletPortfoliosQuery(\n { chain: Chain.SOLANA, address: address ?? \"\" },\n {\n enabled: isAuthenticated && Boolean(address),\n refetchInterval: 10_000,\n },\n );\n\n const holdings = useMemo<MarketsHoldingsMap>(() => {\n const map = new Map<string, MarketHolding>();\n if (!walletPortfolios?.portfolios || markets.length === 0) return map;\n\n // Build a lookup: mint address → token amount\n const balanceByMint = new Map<string, number>();\n for (const p of walletPortfolios.portfolios) {\n balanceByMint.set(p.address, parseFloat(p.amount));\n }\n\n for (const market of markets) {\n const accountInfo = market.accounts[USDC_MINT];\n if (!accountInfo) continue;\n\n const yesShares = balanceByMint.get(accountInfo.yesMint) ?? 0;\n const noShares = balanceByMint.get(accountInfo.noMint) ?? 0;\n\n if (yesShares > 0 || noShares > 0) {\n map.set(market.ticker, { yesShares, noShares });\n }\n }\n\n return map;\n }, [walletPortfolios, markets]);\n\n return { holdings, isLoading };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n CHART_RANGE_SAMPLE_INTERVAL,\n ChartRange,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket, CandlesticksResponse } from \"../../types\";\n\n// Breathing dot rendered at the last data point of each line\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n {/* Pulsing outer ring */}\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n {/* Solid inner dot */}\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\n// Chart colors for different markets\nconst CHART_COLORS = [\n { stroke: \"hsl(var(--heroui-primary))\", id: \"colorMarket0\" },\n { stroke: \"hsl(var(--heroui-secondary))\", id: \"colorMarket1\" },\n { stroke: \"hsl(var(--heroui-success))\", id: \"colorMarket2\" },\n { stroke: \"hsl(var(--heroui-warning))\", id: \"colorMarket3\" },\n];\n\n// Format timestamp based on chart range\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n // Show time: \"14:30\"\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n // Show date with time: \"Jan 5 14:00\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ALL:\n default:\n // Show date only: \"Jan 5\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nexport type MarketDataPoint = {\n date: string;\n timestamp: number;\n [key: string]: number | string; // Dynamic keys for market values\n};\n\nexport type CurrentMarketData = {\n timestamp: number;\n date: string;\n markets: Array<{\n id: string;\n label: string;\n value: number;\n color: string;\n }>;\n};\n\nexport interface EventCandlesticksProps {\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Markets to display (used for labels) */\n markets?: StandardMarket[];\n /** Loading state */\n isLoading?: boolean;\n /** Chart time range (determines X-axis formatting) */\n chartRange?: ChartRangeType;\n /** Callback when hovered data changes */\n onDataChange?: (data: CurrentMarketData | null) => void;\n}\n\n// Transform candlesticks into chart data with sampling\nfunction transformCandlesticks(\n candlesticks: Map<string, CandlesticksResponse>,\n marketTickers: string[],\n chartRange: ChartRangeType,\n): MarketDataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n\n // Build per-market timestamp → value maps (using end_period_ts directly)\n const perMarketMaps: Map<string, Map<number, number>> = new Map();\n\n candlesticks.forEach((response, marketTicker) => {\n const map = new Map<number, number>();\n const points = response.candlesticks ?? [];\n points.forEach((point) => {\n // Align to sample interval boundary, keep the last value per bucket\n const bucket =\n point.end_period_ts - (point.end_period_ts % sampleInterval);\n map.set(bucket, point.yes_ask.close);\n });\n perMarketMaps.set(marketTicker, map);\n });\n\n // Collect all unique sampled timestamps (union across all markets)\n const allTimestamps = new Set<number>();\n for (const map of perMarketMaps.values()) {\n for (const ts of map.keys()) {\n allTimestamps.add(ts);\n }\n }\n\n // Sort timestamps\n const sortedTimestamps = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Create data points for all timestamps, forward-filling missing values\n const lastValues = new Map<string, number>();\n\n return sortedTimestamps.map((timestamp) => {\n const date = new Date(timestamp * 1000);\n const dataPoint: MarketDataPoint = {\n date: date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n timestamp,\n };\n\n marketTickers.forEach((marketTicker) => {\n const value = perMarketMaps.get(marketTicker)?.get(timestamp);\n if (value !== undefined) {\n dataPoint[marketTicker] = Math.round(value * 100) / 100;\n lastValues.set(marketTicker, dataPoint[marketTicker] as number);\n } else {\n // Use the most recent previous value if available, otherwise leave empty\n const lastValue = lastValues.get(marketTicker);\n if (lastValue !== undefined) {\n dataPoint[marketTicker] = lastValue;\n }\n }\n });\n\n return dataPoint;\n });\n}\n\nexport function EventCandlesticks({\n candlesticks,\n markets = [],\n isLoading,\n chartRange = ChartRange.ALL,\n onDataChange,\n}: EventCandlesticksProps) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n // Use ref to store callback to avoid infinite loops\n const onDataChangeRef = useRef(onDataChange);\n useEffect(() => {\n onDataChangeRef.current = onDataChange;\n });\n\n // Get market tickers that have candlestick data\n const marketTickers = useMemo(() => {\n if (!candlesticks) return [];\n return Array.from(candlesticks.keys()).slice(0, 4); // Max 4 markets\n }, [candlesticks]);\n\n // Transform data for chart\n const chartData = useMemo(() => {\n if (!candlesticks || candlesticks.size === 0) return [];\n return transformCandlesticks(candlesticks, marketTickers, chartRange);\n }, [candlesticks, marketTickers, chartRange]);\n\n // Calculate Y-axis domain based on actual data values\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0 || marketTickers.length === 0) {\n return [0, 100] as [number, number];\n }\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n chartData.forEach((dataPoint) => {\n marketTickers.forEach((marketTicker) => {\n const value = dataPoint[marketTicker] as number;\n if (value !== undefined) {\n minValue = Math.min(minValue, value);\n maxValue = Math.max(maxValue, value);\n }\n });\n });\n\n // Handle edge cases\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n // Add padding (10% of range) to keep curves in the middle\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5); // At least 5% padding\n\n const domainMin = Math.max(0, Math.floor(minValue - padding));\n const domainMax = Math.min(100, Math.ceil(maxValue + padding));\n\n return [domainMin, domainMax] as [number, number];\n }, [chartData, marketTickers]);\n\n // Get data at specific index or latest\n const getDataAtIndex = useCallback(\n (index: number | null): CurrentMarketData | null => {\n if (chartData.length === 0) return null;\n\n const dataPoint =\n index !== null ? chartData[index] : chartData[chartData.length - 1];\n if (!dataPoint) return null;\n\n return {\n timestamp: dataPoint.timestamp,\n date: dataPoint.date,\n markets: marketTickers.map((marketTicker, idx) => {\n const market = markets.find((m) => m.ticker === marketTicker);\n return {\n id: marketTicker,\n label: market?.yesSubTitle || `Market ${idx + 1}`,\n value: (dataPoint[marketTicker] as number) ?? 0,\n color: CHART_COLORS[idx % CHART_COLORS.length].stroke,\n };\n }),\n };\n },\n [chartData, marketTickers, markets],\n );\n\n // Notify parent of initial data\n useEffect(() => {\n if (onDataChangeRef.current && chartData.length > 0) {\n onDataChangeRef.current(getDataAtIndex(null));\n }\n }, [chartData, getDataAtIndex]);\n\n // Update parent when active index changes\n useEffect(() => {\n if (onDataChangeRef.current) {\n onDataChangeRef.current(getDataAtIndex(activeIndex));\n }\n }, [activeIndex, getDataAtIndex]);\n\n const handleMouseMove = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state: any) => {\n if (typeof state?.activeTooltipIndex === \"number\") {\n setActiveIndex(state.activeTooltipIndex);\n }\n },\n [],\n );\n\n const handleMouseLeave = useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n // Show loading or empty state\n if (isLoading) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">Loading chart...</div>\n </div>\n );\n }\n\n if (chartData.length === 0) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">No price history data</div>\n </div>\n );\n }\n\n return (\n <div className=\"h-[200px] w-full lg:h-[300px]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n // Calculate sample interval: show ~5-8 labels max\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n // Always show first and last, sample the rest\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 0;\n\n if (!isFirst && !isLast && !isSampled) {\n return null;\n }\n\n return (\n <text\n x={x}\n y={y + 10}\n textAnchor=\"middle\"\n fill=\"hsl(var(--heroui-default-500))\"\n fontSize={10}\n >\n {formatTimestamp(payload.value, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{ fontSize: 10, fill: \"hsl(var(--heroui-default-500))\" }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n contentStyle={{\n backgroundColor: \"hsl(var(--heroui-content1))\",\n border: \"1px solid hsl(var(--heroui-default-200))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n }}\n labelFormatter={(value: number) =>\n formatTimestamp(value, chartRange)\n }\n formatter={(value: number, name: string) => {\n const market = markets.find((m) => m.ticker === name);\n const label = market?.yesSubTitle || name;\n return [`${value.toFixed(2)}%`, label];\n }}\n />\n {marketTickers.map((marketTicker, index) => (\n <Line\n key={marketTicker}\n type=\"monotone\"\n dataKey={marketTicker}\n stroke={CHART_COLORS[index % CHART_COLORS.length].stroke}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${marketTicker}-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// Export helper for getting latest data (for initial state)\nexport function getLatestEventData(): CurrentMarketData {\n return {\n timestamp: Date.now() / 1000,\n date: new Date().toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n markets: [],\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useMarketCandlesticksQuery } from \"../../hooks/usePriceHistoryQuery\";\n\nexport interface UseMarketCandlesticksParams {\n /** Market ticker */\n marketTicker: string;\n /** Market open time (unix timestamp), used as start for \"ALL\" range */\n openTime?: number;\n /** Selected chart range */\n chartRange?: ChartRangeType;\n}\n\nexport function useMarketCandlesticks({\n marketTicker,\n openTime,\n chartRange = DEFAULT_CHART_RANGE,\n}: UseMarketCandlesticksParams) {\n const periodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs per range change\n const endTs = useMemo(() => Math.floor(Date.now() / 1000), [chartRange]);\n\n const startTs = useMemo(() => {\n if (rangeDuration != null) return endTs - rangeDuration;\n // ALL: start from market open time\n return openTime ?? endTs;\n }, [endTs, rangeDuration, openTime]);\n\n const {\n data: candlesticks,\n isLoading,\n isFetching,\n error,\n } = useMarketCandlesticksQuery(\n {\n ticker: marketTicker,\n startTs,\n endTs,\n periodInterval,\n },\n { enabled: !!marketTicker },\n );\n\n return {\n candlesticks,\n /** true on initial load (no cached data) */\n isLoading,\n /** true whenever a request is in-flight (including range switches with stale data) */\n isFetching,\n error,\n periodInterval,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n ChartRange,\n CHART_RANGE_SAMPLE_INTERVAL,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CHART_COLOR = \"hsl(var(--heroui-primary))\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DataPoint {\n timestamp: number;\n date: string;\n value: number;\n volume: number;\n}\n\nexport interface EventMarketCandlesticksUIProps {\n /** Candlestick data for the market */\n candlesticks?: CandlesticksResponse;\n /** Whether data is loading */\n isLoading?: boolean;\n /** Current chart range */\n chartRange: ChartRangeType;\n /** Callback when range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Breathing dot at the last data point\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ALL:\n default:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nfunction formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(0);\n}\n\nfunction transformCandlesticks(\n candlesticks: CandlesticksResponse,\n chartRange: ChartRangeType,\n): DataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n const points = candlesticks.candlesticks ?? [];\n\n // Bucket by sample interval, keep last close & sum volume per bucket\n const bucketMap = new Map<number, { close: number; volume: number }>();\n for (const point of points) {\n const bucket = point.end_period_ts - (point.end_period_ts % sampleInterval);\n const existing = bucketMap.get(bucket);\n bucketMap.set(bucket, {\n close: point.yes_ask.close,\n volume: (existing?.volume ?? 0) + (point.volume ?? 0),\n });\n }\n\n // Sort by timestamp\n const sorted = Array.from(bucketMap.entries()).sort((a, b) => a[0] - b[0]);\n\n return sorted.map(([timestamp, { close, volume }]) => ({\n timestamp,\n date: new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n value: Math.round(close * 100) / 100,\n volume,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketCandlesticksUI({\n candlesticks,\n isLoading,\n chartRange,\n onRangeChange,\n}: EventMarketCandlesticksUIProps) {\n const chartData = useMemo(() => {\n if (!candlesticks) return [];\n return transformCandlesticks(candlesticks, chartRange);\n }, [candlesticks, chartRange]);\n\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0) return [0, 100] as [number, number];\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n for (const dp of chartData) {\n if (dp.value < minValue) minValue = dp.value;\n if (dp.value > maxValue) maxValue = dp.value;\n }\n\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5);\n\n const domainMin = Math.max(0, Math.floor(minValue - padding));\n const domainMax = Math.min(100, Math.ceil(maxValue + padding));\n\n return [domainMin, domainMax] as [number, number];\n }, [chartData]);\n\n // ---------- Loading ----------\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">Loading chart...</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Empty ----------\n if (chartData.length === 0) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">No price history data</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Chart ----------\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 0;\n\n if (!isFirst && !isLast && !isSampled) {\n return null;\n }\n\n return (\n <text\n x={x}\n y={y + 10}\n textAnchor=\"middle\"\n fill=\"hsl(var(--heroui-default-500))\"\n fontSize={10}\n >\n {formatTimestamp(payload.value, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{\n fontSize: 10,\n fill: \"hsl(var(--heroui-default-500))\",\n }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n cursor={{ stroke: \"hsl(var(--heroui-default-300))\" }}\n content={({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const dp = payload[0].payload as DataPoint;\n const cents = Math.round(dp.value);\n return (\n <div className=\"rounded-lg border border-default-200 bg-content1 px-3 py-2 shadow-md\">\n <div className=\"text-lg font-semibold text-primary\">\n Yes {cents}¢\n </div>\n <div className=\"text-sm text-neutral\">\n Vol {formatCompact(dp.volume)} ·{\" \"}\n {formatTimestamp(dp.timestamp, chartRange)}\n </div>\n </div>\n );\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"value\"\n stroke={CHART_COLOR}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Range selector\n// ---------------------------------------------------------------------------\n\nfunction RangeSelector({\n chartRange,\n onRangeChange,\n}: {\n chartRange: ChartRangeType;\n onRangeChange?: (range: ChartRangeType) => void;\n}) {\n return (\n <div className=\"flex items-center justify-end gap-x-1\">\n {RANGE_OPTIONS.map((opt) => {\n const isActive = chartRange === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n onClick={() => onRangeChange?.(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\nexport interface UseMarketOrderbookParams {\n /** Market ticker to fetch orderbook for */\n marketTicker: string;\n}\n\nexport interface ProcessedOrderbook {\n /** Yes side bids (sorted descending by price) */\n yesBids: OrderbookLevel[];\n /** Yes side asks (sorted ascending by price) */\n yesAsks: OrderbookLevel[];\n /** No side bids (sorted descending by price) */\n noBids: OrderbookLevel[];\n /** No side asks (sorted ascending by price) */\n noAsks: OrderbookLevel[];\n /** Best yes bid price */\n bestYesBid: number | null;\n /** Best yes ask price */\n bestYesAsk: number | null;\n /** Best no bid price */\n bestNoBid: number | null;\n /** Best no ask price */\n bestNoAsk: number | null;\n /** Orderbook sequence number */\n sequence: number | null;\n}\n\nexport function useMarketOrderbook({ marketTicker }: UseMarketOrderbookParams) {\n const {\n data: orderbook,\n isLoading: isOrderbookLoading,\n error: orderbookError,\n } = useOrderBookQuery(marketTicker, {\n enabled: !!marketTicker,\n });\n\n const processedOrderbook = useMemo<ProcessedOrderbook | null>(() => {\n if (!orderbook) return null;\n\n const { yesBids, yesAsks, noBids, noAsks } = orderbook;\n\n return {\n yesBids,\n yesAsks,\n noBids,\n noAsks,\n bestYesBid: yesBids.length > 0 ? yesBids[0].price : null,\n bestYesAsk: yesAsks.length > 0 ? yesAsks[0].price : null,\n bestNoBid: noBids.length > 0 ? noBids[0].price : null,\n bestNoAsk: noAsks.length > 0 ? noAsks[0].price : null,\n sequence: orderbook.sequence ?? null,\n };\n }, [orderbook]);\n\n return {\n orderbook: processedOrderbook,\n isOrderbookLoading,\n orderbookError,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketOrderbookUIProps {\n /** Bid levels (sorted descending by price) */\n bids: OrderbookLevel[];\n /** Ask levels (sorted ascending by price) */\n asks: OrderbookLevel[];\n /** Whether data is loading */\n isLoading?: boolean;\n /** Max number of levels per side to display */\n maxLevels?: number;\n /** Callback when a price level row is clicked */\n onPriceClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}\n\ninterface OrderbookRow extends OrderbookLevel {\n /** Cumulative quantity up to this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the max cumulative across both sides */\n depth: number;\n /** Total value = price × quantity */\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[],\n maxLevels: number,\n): OrderbookRow[] {\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n return sliced.map((level) => {\n cumulative += level.quantity;\n return {\n ...level,\n cumulative,\n depth: 0,\n total: level.price * level.quantity,\n };\n });\n}\n\nfunction applyDepth(rows: OrderbookRow[], maxCum: number) {\n for (const row of rows) {\n row.depth = maxCum > 0 ? row.cumulative / maxCum : 0;\n }\n}\n\n/** Format price as percentage (0.94 → \"94¢\") */\nfunction formatPrice(price: number): string {\n const cents = Math.round(price * 100);\n return `${cents}¢`;\n}\n\n/** Format quantity with compact notation */\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/** Format total value (price × quantity, as USD-like value) */\nfunction formatTotal(total: number): string {\n if (total >= 1_000_000) return `$${(total / 1_000_000).toFixed(2)}M`;\n if (total >= 1_000) return `$${(total / 1_000).toFixed(2)}K`;\n if (total >= 1) return `$${total.toFixed(2)}`;\n return `$${total.toFixed(4)}`;\n}\n\nfunction RowItem({\n row,\n side,\n showType = false,\n onClick,\n}: {\n row: OrderbookRow;\n side: \"bid\" | \"ask\";\n /** Only show the type label on designated rows */\n showType?: boolean;\n onClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}) {\n const { t } = useTranslation();\n const isAsk = side === \"ask\";\n const barColor = isAsk ? \"bg-bullish/10\" : \"bg-bearish/10\";\n const typeColor = isAsk ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <button\n type=\"button\"\n className=\"relative grid w-full grid-cols-4 px-2 py-2.5 text-xs cursor-pointer hover:bg-default-100 transition-colors\"\n onClick={() => onClick?.(row.price, side)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${barColor} transition-[width] duration-200`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Type – only shown on the row nearest the spread */}\n <span\n className={`relative z-10 font-mono font-medium ${typeColor} text-left`}\n >\n {showType\n ? isAsk\n ? t(\"predict.trade.bestAsk\")\n : t(\"predict.trade.bestBid\")\n : \"\"}\n </span>\n {/* Price */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatPrice(row.price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatQty(row.quantity)}\n </span>\n {/* Total */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatTotal(row.total)}\n </span>\n </button>\n );\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n // Stagger widths for a more natural look\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\", \"50%\", \"70%\", \"40%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col\">\n {/* Header skeleton */}\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n </div>\n {/* Ask rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`ask-${i}`} index={i} />\n ))}\n {/* Spread */}\n <div className=\"flex justify-center border-y border-default-200 px-2 py-2.5\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-default-100\" />\n </div>\n {/* Bid rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`bid-${i}`} index={i + 3} />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_LEVELS = 8;\n\nexport function EventMarketOrderbookUI({\n bids,\n asks,\n isLoading = false,\n maxLevels = DEFAULT_MAX_LEVELS,\n onPriceClick,\n}: EventMarketOrderbookUIProps) {\n const { t } = useTranslation();\n\n const { bidRows, askRows, spread, spreadPercent } = useMemo(() => {\n const bidRows = buildRows(bids, maxLevels);\n const askRows = buildRows(asks, maxLevels);\n\n // Use the same max cumulative across both sides for comparable depth bars\n const maxCum = Math.max(\n bidRows[bidRows.length - 1]?.cumulative ?? 0,\n askRows[askRows.length - 1]?.cumulative ?? 0,\n );\n applyDepth(bidRows, maxCum);\n applyDepth(askRows, maxCum);\n\n const bestBid = bidRows[0]?.price ?? null;\n const bestAsk = askRows[0]?.price ?? null;\n\n let spread: number | null = null;\n let spreadPercent: number | null = null;\n if (bestBid != null && bestAsk != null) {\n spread = bestAsk - bestBid;\n const mid = (bestBid + bestAsk) / 2;\n if (mid > 0) {\n spreadPercent = Math.round((spread / mid) * 10000) / 100;\n }\n }\n\n return { bidRows, askRows, spread, spreadPercent };\n }, [bids, asks, maxLevels]);\n\n if (isLoading) {\n return <Skeleton />;\n }\n\n const isEmpty = bidRows.length === 0 && askRows.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Column headers */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span />\n <span className=\"text-right\">{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest price is nearest the spread) */}\n <div className=\"flex flex-col-reverse\">\n {askRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"ask\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread != null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 px-2 py-2.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {formatPrice(spread)}\n </span>\n {spreadPercent != null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bidRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"bid\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Tabs, Tab } from \"@liberfi.io/ui\";\nimport { DEFAULT_CHART_RANGE, type ChartRangeType } from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { useMarketCandlesticks } from \"./event-market-candlesticks.script\";\nimport { EventMarketCandlesticksUI } from \"./event-market-candlesticks.ui\";\nimport { useMarketOrderbook } from \"./event-market-orderbook.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\n\ntype MarketDetailTab = \"trade-yes\" | \"trade-no\" | \"graph\";\n\nexport interface EventMarketDetailWidgetProps {\n market: StandardMarket;\n /** Callback when an orderbook row is clicked – propagates market, outcome & side */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventMarketDetailWidget({\n market,\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n const { orderbook, isOrderbookLoading } = useMarketOrderbook({\n marketTicker: market.ticker,\n });\n\n const { candlesticks, isFetching: isCandlesticksLoading } =\n useMarketCandlesticks({\n marketTicker: market.ticker,\n openTime: market.openTime,\n chartRange,\n });\n\n // Map orderbook price click → trade action\n // ask row click → user wants to buy; bid row click → user wants to sell\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"graph\" title={t(\"predict.market.graph\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.yesBids ?? []}\n asks={orderbook?.yesAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.noBids ?? []}\n asks={orderbook?.noAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"graph\" && (\n <EventMarketCandlesticksUI\n candlesticks={candlesticks}\n isLoading={isCandlesticksLoading}\n chartRange={chartRange}\n onRangeChange={setChartRange}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Chip, ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\nimport type { MarketsHoldingsMap } from \"../../hooks/useMarketsHoldings\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\n\nconst DEFAULT_VISIBLE_COUNT = 4;\n\nexport interface EventMarketsUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Render expanded detail content for a market */\n renderMarketDetail?: (market: StandardMarket) => ReactNode;\n /** Callback when a market Yes/No button is clicked */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n /** Per-market token holdings for the current user */\n marketHoldings?: MarketsHoldingsMap;\n}\n\n/** Parse ask price in dollars (0–1) → cents (0–100), null if absent */\nfunction getMarketPrices(market: StandardMarket) {\n const yesCents = market.yesAsk\n ? Math.round(parseFloat(market.yesAsk) * 100)\n : null;\n const noCents = market.noAsk\n ? Math.round(parseFloat(market.noAsk) * 100)\n : null;\n return { yesCents, noCents };\n}\n\nexport function EventMarketsUI({\n markets,\n renderMarketDetail,\n onTradeAction,\n marketHoldings,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedTicker, setExpandedTicker] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (ticker: string) => {\n setExpandedTicker((prev) => (prev === ticker ? null : ticker));\n };\n\n return (\n <div className=\"flex flex-col divide-y divide-default-200\">\n {visibleMarkets.map((market) => {\n const { yesCents, noCents } = getMarketPrices(market);\n const isExpanded = expandedTicker === market.ticker;\n\n return (\n <div key={market.ticker} className=\"flex flex-col\">\n <div\n className=\"flex items-center gap-x-3 px-2 py-3 transition-colors hover:bg-content2 lg:gap-x-4 cursor-pointer\"\n onClick={() => toggleExpand(market.ticker)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpand(market.ticker);\n }\n }}\n >\n {/* Col 1: Title + Holdings tags */}\n <div className=\"flex flex-col gap-y-1 min-w-0 flex-1\">\n <span className=\"text-sm font-medium truncate lg:text-base\">\n {market.yesSubTitle}\n </span>\n {(() => {\n const holding = marketHoldings?.get(market.ticker);\n if (!holding) return null;\n const { yesShares, noShares } = holding;\n if (yesShares <= 0 && noShares <= 0) return null;\n return (\n <div className=\"flex items-center gap-x-1.5\">\n {yesShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"primary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesYes\", {\n shares:\n yesShares % 1 === 0\n ? yesShares\n : yesShares.toFixed(2),\n })}\n </Chip>\n )}\n {noShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"secondary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesNo\", {\n shares:\n noShares % 1 === 0\n ? noShares\n : noShares.toFixed(2),\n })}\n </Chip>\n )}\n </div>\n );\n })()}\n </div>\n\n {/* Col 2: Yes Percentage */}\n {(() => {\n const hasYes = yesCents != null;\n const hasNo = noCents != null;\n\n if (hasYes && !hasNo && yesCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"< 1%\"}\n </span>\n );\n }\n if (hasNo && !hasYes && noCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"> 99%\"}\n </span>\n );\n }\n if (!hasYes && !hasNo) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n 0%\n </span>\n );\n }\n return (\n <span className=\"text-lg font-bold shrink-0 text-center lg:text-xl\">\n {`${yesCents}%`}\n </span>\n );\n })()}\n\n {/* Col 3: Yes / No Buttons */}\n <div className=\"flex items-center gap-x-2 flex-1 justify-end\">\n <Button\n size=\"sm\"\n color=\"primary\"\n className=\"w-20 bg-primary-100 text-primary\"\n onPress={() => onTradeAction?.(market, \"yes\", \"buy\")}\n >\n {yesCents != null\n ? t(\"predict.market.action.yes\", { price: yesCents })\n : t(\"predict.market.yes\")}\n </Button>\n <Button\n size=\"sm\"\n color=\"secondary\"\n className=\"w-20 bg-secondary-100 text-secondary\"\n onPress={() => onTradeAction?.(market, \"no\", \"buy\")}\n >\n {noCents != null\n ? t(\"predict.market.action.no\", { price: noCents })\n : t(\"predict.market.no\")}\n </Button>\n </div>\n\n {/* Expand/Collapse indicator */}\n {isExpanded ? (\n <ChevronUpIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n )}\n </div>\n\n {/* Expanded detail content */}\n {isExpanded && renderMarketDetail && (\n <div className=\"max-h-100 overflow-y-auto px-2 pb-3\">\n {renderMarketDetail(market)}\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex items-center justify-center gap-x-1.5 px-2 py-2.5 text-sm text-default-500 transition-colors cursor-pointer hover:text-primary\"\n >\n {showAll ? (\n <>\n <span>{t(\"predict.event.rules.collapse\")}</span>\n <ChevronUpIcon className=\"h-4 w-4\" />\n </>\n ) : (\n <>\n <span>\n {t(\"predict.event.moreMarkets\", {\n count: markets.length - DEFAULT_VISIBLE_COUNT,\n })}\n </span>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Select, SelectItem } from \"@liberfi.io/ui\";\nimport type {\n StandardEvent,\n StandardMarket,\n SeriesResponse,\n} from \"../../types\";\n\nexport interface EventRulesUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Event data */\n event: StandardEvent;\n /** Series data */\n series?: SeriesResponse;\n}\n\nconst CLOSED_STATUSES = new Set([\"closed\", \"determined\", \"finalized\"]);\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\ninterface TimelineItem {\n label: string;\n value: string;\n isActive: boolean;\n}\n\nfunction EventTimeline({ market }: { market: StandardMarket }) {\n const isClosed = CLOSED_STATUSES.has(market.status);\n\n const items: TimelineItem[] = useMemo(() => {\n const openItem: TimelineItem = {\n label: \"Market Open\",\n value: formatTimestamp(market.openTime),\n isActive: true,\n };\n\n const closeItem: TimelineItem = {\n label: \"Market Closes\",\n value: isClosed\n ? formatTimestamp(market.closeTime)\n : \"After the outcome occurs\",\n isActive: isClosed,\n };\n\n const payoutItem: TimelineItem = {\n label: \"Projected Payout\",\n value: \"30 minutes after closing\",\n isActive: market.status === \"finalized\",\n };\n\n return [openItem, closeItem, payoutItem];\n }, [market.openTime, market.closeTime, market.status, isClosed]);\n\n const closeDescription = useMemo(() => {\n if (isClosed) return null;\n\n if (market.canCloseEarly && market.earlyCloseCondition) {\n return `${market.earlyCloseCondition} Otherwise, it closes by ${formatTimestamp(market.expirationTime)}.`;\n }\n\n return `This market closes by ${formatTimestamp(market.expirationTime)}.`;\n }, [\n isClosed,\n market.canCloseEarly,\n market.earlyCloseCondition,\n market.expirationTime,\n ]);\n\n return (\n <div className=\"flex flex-col\">\n {items.map((item, index) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n {/* Timeline indicator */}\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-default-300 bg-transparent\"\n }`}\n />\n {index < items.length - 1 && (\n <div className=\"w-px flex-1 bg-default-200\" />\n )}\n </div>\n {/* Content */}\n <div\n className={`flex flex-col ${index < items.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-default-500 lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n {closeDescription && (\n <p className=\"text-xs text-default-500 mt-3 lg:text-sm\">\n {closeDescription}\n </p>\n )}\n </div>\n );\n}\n\nexport function EventRulesUI({ markets, event, series }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [selectedMarketTicker, setSelectedMarketTicker] = useState<\n string | null\n >(null);\n\n const marketsWithRules = markets.filter((m) => m.rulesPrimary);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.ticker === selectedMarketTicker) ??\n marketsWithRules[0];\n if (!selectedMarket?.rulesPrimary) return null;\n\n return (\n <div className=\"flex flex-col gap-y-2\">\n <span className=\"text-sm font-medium lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n {marketsWithRules.length > 1 && (\n <Select\n size=\"sm\"\n aria-label=\"Select market rules\"\n className=\"max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={new Set([selectedMarket.ticker])}\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length > 0) {\n setSelectedMarketTicker(selected[0]);\n }\n }}\n >\n {marketsWithRules.map((market) => (\n <SelectItem key={market.ticker} textValue={market.yesSubTitle}>\n <span className=\"text-xs truncate\">{market.yesSubTitle}</span>\n </SelectItem>\n ))}\n </Select>\n )}\n <div className=\"text-xs text-foreground lg:text-sm\">\n {selectedMarket.rulesPrimary}\n </div>\n\n {/* Timeline and payout */}\n <span className=\"text-xs font-medium text-default-500 mt-2 lg:text-sm\">\n Timeline and payout\n </span>\n <EventTimeline market={selectedMarket} />\n\n {/* Tickers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-default-400 mt-2 lg:text-xs\">\n {series?.ticker && (\n <span>\n <span className=\"text-default-500\">Series:</span>{\" \"}\n <span className=\"text-foreground\">{series.ticker}</span>\n </span>\n )}\n {event.ticker && (\n <span>\n <span className=\"text-default-500\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.ticker}</span>\n </span>\n )}\n <span>\n <span className=\"text-default-500\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.ticker}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Select, SelectItem, SelectSection } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n ChartRange,\n type ChartRangeType,\n type CandlestickPeriodType,\n} from \"../../consts\";\nimport { useMarketsHoldings } from \"../../hooks/useMarketsHoldings\";\nimport type {\n StandardEvent,\n StandardMarket,\n CandlesticksResponse,\n SeriesResponse,\n} from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventCandlesticks,\n getLatestEventData,\n type CurrentMarketData,\n} from \"./event-candlesticks.ui\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventMarketsUI } from \"./event-markets.ui\";\nimport { EventRulesUI } from \"./event-rules.ui\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n];\n\nexport interface EventDetailUIProps {\n event: StandardEvent;\n /** Series data for the event */\n series?: SeriesResponse;\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Currently selected chart range */\n chartRange?: ChartRangeType;\n /** Derived candlestick period interval (for chart formatting) */\n periodInterval?: CandlestickPeriodType;\n /** Whether candlesticks are loading */\n isCandlesticksLoading?: boolean;\n /** Map of market ticker to candlestick error */\n candlestickErrors?: Map<string, Error>;\n /** Callback when chart range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n /** Selected market tickers for candlestick chart */\n selectedMarketTickers?: string[];\n /** Callback when selected markets change */\n onMarketSelectionChange?: (marketTickers: string[]) => void;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailUI({\n event,\n series,\n candlesticks,\n chartRange = ChartRange.ONE_DAY,\n periodInterval,\n isCandlesticksLoading,\n onRangeChange,\n selectedMarketTickers,\n onMarketSelectionChange,\n onTradeAction,\n}: EventDetailUIProps) {\n const { t } = useTranslation();\n const [currentData, setCurrentData] = useState<CurrentMarketData | null>(\n getLatestEventData(),\n );\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n // Hysteresis: require scrolling 20px past sentinel to enter compact,\n // but exit compact as soon as sentinel is back in viewport.\n // This breaks the feedback loop where header height change\n // could toggle the sentinel's visibility back and forth.\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n // Use capture to also detect scroll events from non-window scroll containers\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event.markets],\n );\n\n // Fetch per-market yes/no token holdings for the connected wallet\n const { holdings: marketHoldings } = useMarketsHoldings(markets);\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n const formattedEndDate = useMemo(() => {\n if (!event.strikeDate) return null;\n const date = new Date(event.strikeDate * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n return `${month} ${day}, ${year}`;\n }, [event.strikeDate]);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel element to detect scroll */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Event header - sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0\">\n {!isCompact &&\n (series?.category || (series?.tags && series.tags.length > 0)) && (\n <span className=\"text-xs text-default-500 lg:text-sm truncate\">\n {series.category}\n {series.category && series.tags?.length > 0 && \" · \"}\n {series.tags?.join(\", \")}\n </span>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Chart section */}\n <div className=\"flex flex-col gap-y-4\">\n <div className=\"flex flex-col\">\n {/* Market legend */}\n {currentData && currentData.markets.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs lg:text-sm\">\n {currentData.markets.map((market) => (\n <div key={market.id} className=\"flex items-center gap-x-2\">\n <div\n className=\"h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: market.color }}\n />\n <span className=\"text-default-600\">{market.label}</span>\n </div>\n ))}\n </div>\n )}\n\n <EventCandlesticks\n candlesticks={candlesticks}\n chartRange={chartRange}\n markets={markets}\n isLoading={isCandlesticksLoading}\n onDataChange={(data) => setCurrentData(data)}\n />\n\n {/* Volume, period selector and market selector */}\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 mt-2\">\n <div className=\"flex items-center gap-x-3 text-xs text-default-500 lg:text-sm\">\n <span>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n {formattedEndDate && (\n <>\n <span className=\"text-default-300\">·</span>\n <span>\n {t(\"predict.event.endDate\", { date: formattedEndDate })}\n </span>\n </>\n )}\n </div>\n\n <div className=\"flex items-center gap-x-1\">\n {RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onRangeChange?.(option.value)}\n className={`px-2 lg:px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n chartRange === option.value\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n {markets.length > 1 && (\n <Select\n size=\"sm\"\n selectionMode=\"multiple\"\n placeholder=\"Markets\"\n aria-label=\"Select markets\"\n className=\"min-w-28 max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={\n selectedMarketTickers\n ? new Set(selectedMarketTickers)\n : undefined\n }\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length <= MAX_PRICE_HISTORY_MARKETS) {\n onMarketSelectionChange?.(selected);\n }\n }}\n >\n <SelectSection\n title={`Pick up to ${MAX_PRICE_HISTORY_MARKETS} markets`}\n classNames={{\n heading: \"text-xs text-default-400 px-2 py-1\",\n }}\n >\n {markets.map((market) => (\n <SelectItem\n key={market.ticker}\n textValue={market.yesSubTitle}\n >\n <span className=\"text-xs truncate\">\n {market.yesSubTitle}\n </span>\n </SelectItem>\n ))}\n </SelectSection>\n </Select>\n )}\n </div>\n </div>\n </div>\n\n {/* Markets */}\n <EventMarketsUI\n markets={markets}\n onTradeAction={onTradeAction}\n marketHoldings={marketHoldings}\n renderMarketDetail={(market) => (\n <EventMarketDetailWidget\n market={market}\n onTradeAction={onTradeAction}\n />\n )}\n />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} series={series} />\n </div>\n );\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\";\nimport {\n DEFAULT_CHART_RANGE,\n ChartRange,\n MAX_PRICE_HISTORY_MARKETS,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { useEventDetail } from \"./event-detail.scripts\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ------------------------------------------------------------\nexport interface EventDetailWidgetProps {\n eventId: string;\n /** Initial market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n initialMarketTickers?: string[];\n /** Initial chart range. Default is \"1d\" (1 day). */\n initialChartRange?: ChartRangeType;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailWidget({\n eventId,\n initialMarketTickers,\n initialChartRange = DEFAULT_CHART_RANGE,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(initialChartRange);\n const [selectedMarketTickers, setSelectedMarketTickers] = useState<\n string[] | undefined\n >(initialMarketTickers);\n\n const {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n periodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n } = useEventDetail({\n eventId,\n candlestickMarketTickers: selectedMarketTickers,\n chartRange,\n });\n\n // Set default selected markets once when event first loads\n const marketsInitializedRef = useRef(!!initialMarketTickers);\n useEffect(() => {\n if (event?.markets && !marketsInitializedRef.current) {\n marketsInitializedRef.current = true;\n const defaultMarketTickers = [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((m) => m.ticker);\n setSelectedMarketTickers(defaultMarketTickers);\n }\n }, [event?.markets]);\n\n // Memoize handlers\n const handleRangeChange = useMemo(\n () => (newRange: ChartRangeType) => {\n setChartRange(newRange);\n },\n [],\n );\n\n const handleMarketSelectionChange = useMemo(\n () => (marketTickers: string[]) => {\n setSelectedMarketTickers(marketTickers);\n },\n [],\n );\n\n if (isEventLoading || isSeriesLoading) {\n return <EventDetailSkeleton />;\n }\n\n if (eventError || !event) {\n return (\n <div className=\"flex w-full items-center justify-center py-20 text-danger\">\n {eventError?.message || \"Event not found\"}\n </div>\n );\n }\n\n return (\n <EventDetailUI\n event={event}\n series={series}\n candlesticks={candlesticks}\n chartRange={chartRange}\n periodInterval={periodInterval}\n isCandlesticksLoading={isCandlesticksLoading}\n candlestickErrors={candlestickErrors}\n onRangeChange={handleRangeChange}\n selectedMarketTickers={selectedMarketTickers}\n onMarketSelectionChange={handleMarketSelectionChange}\n onTradeAction={onTradeAction}\n />\n );\n}\n\n// Re-export for convenience\nexport { ChartRange, type ChartRangeType };\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport type { StandardMarket } from \"../../types\";\nimport {\n type TradeOutcome,\n type TradeSide,\n} from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport {\n EventDetailWidget,\n type EventDetailWidgetProps,\n} from \"./event-detail.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventDetailPageProps\n extends Omit<EventDetailWidgetProps, \"eventId\" | \"onTradeAction\"> {\n /** Event ticker ID */\n eventId: string;\n /** Chain network for trading (default: 'solana') */\n chain?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventId,\n chain,\n ...widgetProps\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n // Fetch event to get the list of markets (react-query deduplicates with EventDetailWidget)\n const { data: event, isLoading: isEventLoading } = useEventByIdQuery({\n id: eventId,\n withNestedMarkets: true,\n });\n\n // Sort markets by yesAsk descending (same order as EventDetailUI)\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event?.markets],\n );\n\n // Trade action state – tracks which market / outcome / side were selected\n const [tradeSelection, setTradeSelection] = useState<{\n market: StandardMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n /** Monotonic counter so we can key-remount the form on each action */\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: StandardMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n // On mobile, also open the trade drawer\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n // Selected market for the trade form — prefer trade-action selection, fallback to top market\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -------------------------------------------------------------------------\n // Loading skeleton\n // -------------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n // -------------------------------------------------------------------------\n // Mobile layout: full-width detail + floating trade button + drawer\n // -------------------------------------------------------------------------\n // Common key to force TradeFormWidget remount when trade action changes\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.ticker}-${tradeSelection.version}`\n : (selectedMarket?.ticker ?? \"default\");\n\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Floating trade button */}\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n {/* Trade form drawer */}\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -------------------------------------------------------------------------\n // Desktop layout: detail on the left + trade form fixed on the right\n // -------------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Main content */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Sidebar – sticky trade form */}\n {selectedMarket && (\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4\">\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n </div>\n </aside>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderBookParams {\n /** Market ticker */\n marketTicker: string;\n /** Maximum number of levels to display per side */\n maxLevels?: number;\n /** Polling interval in milliseconds (0 to disable) */\n refetchInterval?: number;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport interface OrderBookRow extends OrderbookLevel {\n /** Cumulative quantity up to (and including) this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the maximum cumulative quantity */\n depth: number;\n}\n\nexport interface UseOrderBookResult {\n /** Bid rows sorted from highest to lowest price */\n bids: OrderBookRow[];\n /** Ask rows sorted from lowest to highest price */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread as percentage of midpoint */\n spreadPercent: number | null;\n /** Midpoint price in cents */\n midpoint: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[] | undefined,\n maxLevels: number,\n): OrderBookRow[] {\n if (!levels) return [];\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n const rows: OrderBookRow[] = sliced.map((level) => {\n cumulative += level.quantity;\n return { ...level, cumulative, depth: 0 };\n });\n\n // Calculate depth ratio\n const maxCum = rows[rows.length - 1]?.cumulative ?? 1;\n for (const row of rows) {\n row.depth = row.cumulative / maxCum;\n }\n\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useOrderBook({\n marketTicker,\n maxLevels = 10,\n refetchInterval = 5000,\n outcome = \"yes\",\n}: UseOrderBookParams): UseOrderBookResult {\n const {\n data: orderBook,\n isLoading,\n isFetching,\n } = useOrderBookQuery(marketTicker, {\n refetchInterval: refetchInterval || undefined,\n });\n\n // Select bids and asks based on outcome\n const rawBids = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n }, [orderBook, outcome]);\n\n const rawAsks = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n }, [orderBook, outcome]);\n\n const bids = useMemo(\n () => buildRows(rawBids, maxLevels),\n [rawBids, maxLevels],\n );\n\n const asks = useMemo(\n () => buildRows(rawAsks, maxLevels),\n [rawAsks, maxLevels],\n );\n\n // Calculate spread\n const spread = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return asks[0].price - bids[0].price;\n }, [bids, asks]);\n\n const midpoint = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return (bids[0].price + asks[0].price) / 2;\n }, [bids, asks]);\n\n const spreadPercent = useMemo(() => {\n if (spread === null || midpoint === null || midpoint === 0) return null;\n return Math.round((spread / midpoint) * 10000) / 100;\n }, [spread, midpoint]);\n\n return {\n bids,\n asks,\n spread,\n spreadPercent,\n midpoint,\n isLoading,\n isFetching,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderBookRow } from \"./order-book.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OrderBookUIProps {\n /** Bid rows (highest to lowest) */\n bids: OrderBookRow[];\n /** Ask rows (lowest to highest) */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread percentage */\n spreadPercent: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction OrderBookRowItem({\n row,\n side,\n onClick,\n}: {\n row: OrderBookRow;\n side: \"bid\" | \"ask\";\n onClick?: (price: number) => void;\n}) {\n const isBid = side === \"bid\";\n const barColor = isBid ? \"bg-primary/10\" : \"bg-danger/10\";\n const textColor = isBid ? \"text-primary\" : \"text-danger\";\n\n return (\n <button\n type=\"button\"\n className=\"relative flex w-full items-center justify-between px-3 py-1 text-xs hover:bg-default-100 cursor-pointer\"\n onClick={() => onClick?.(row.price)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 ${isBid ? \"right-0\" : \"left-0\"} ${barColor}`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Content */}\n <span className={`relative z-10 font-medium ${textColor}`}>\n {row.price}¢\n </span>\n <span className=\"relative z-10 text-default-600\">{row.quantity}</span>\n <span className=\"relative z-10 text-default-400\">{row.cumulative}</span>\n </button>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col gap-y-1 py-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className=\"mx-3 h-4 animate-pulse rounded bg-default-100\"\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercent,\n isLoading,\n onPriceClick,\n}: OrderBookUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </div>\n <Skeleton />\n <Skeleton />\n </div>\n );\n }\n\n const isEmpty = bids.length === 0 && asks.length === 0;\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </span>\n </div>\n\n {isEmpty ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.orderBook.empty\")}\n </div>\n ) : (\n <>\n {/* Column headers */}\n <div className=\"flex items-center justify-between px-3 py-1 text-xxs text-default-400\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span>{t(\"predict.orderBook.qty\")}</span>\n <span>{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest is at bottom, near spread) */}\n <div className=\"flex flex-col-reverse\">\n {asks.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"ask\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread !== null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 py-1.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {spread}¢\n </span>\n {spreadPercent !== null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bids.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"bid\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { useOrderBook } from \"./order-book.script\";\nimport { OrderBookUI } from \"./order-book.ui\";\n\nexport interface OrderBookWidgetProps {\n /** Market ticker */\n marketTicker: string;\n /** Maximum levels per side (default 10) */\n maxLevels?: number;\n /** Polling interval in ms (default 5000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport function OrderBookWidget({\n marketTicker,\n maxLevels,\n refetchInterval,\n onPriceClick,\n outcome,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercent, isLoading } = useOrderBook({\n marketTicker,\n maxLevels,\n refetchInterval,\n outcome,\n });\n\n return (\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercent={spreadPercent}\n isLoading={isLoading}\n onPriceClick={onPriceClick}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. There are no \"open orders\" in the\n * traditional sense.\n *\n * For tracking swap/order status, use `useOrderStatusQuery` with the order signature\n * returned from `useCreateSwapMutation`.\n */\nimport { useState, useCallback } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOpenOrdersParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Order type - new API uses swap model\n */\nexport interface Order {\n id: string;\n marketId: string;\n side: \"buy\" | \"sell\";\n outcome: \"yes\" | \"no\";\n type: \"limit\" | \"market\";\n price: number;\n quantity: number;\n filledQuantity: number;\n status: \"open\" | \"partial\" | \"filled\" | \"cancelled\";\n createdAt: string;\n}\n\nexport interface UseOpenOrdersResult {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** ID of the order currently being cancelled (null if none) */\n cancellingOrderId: string | null;\n /** Cancel an order by id */\n cancelOrder: (orderId: string) => void;\n /** Error from the most recent cancel attempt */\n cancelError: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API uses a swap-based model.\n * Use `useOrderStatusQuery` to track swap status instead.\n */\nexport function useOpenOrders(\n _params: UseOpenOrdersParams = {},\n): UseOpenOrdersResult {\n const [cancellingOrderId, setCancellingOrderId] = useState<string | null>(\n null,\n );\n const [cancelError] = useState<Error | null>(null);\n\n // No-op cancel function - API no longer supports this\n const cancelOrder = useCallback((_orderId: string) => {\n console.warn(\n \"useOpenOrders.cancelOrder is deprecated. Use swap-based order model instead.\",\n );\n setCancellingOrderId(null);\n }, []);\n\n return {\n orders: [],\n isLoading: false,\n isFetching: false,\n cancellingOrderId,\n cancelOrder,\n cancelError,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport type { Order } from \"./open-orders.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OpenOrdersUIProps {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** ID of the order currently being cancelled */\n cancellingOrderId: string | null;\n /** Cancel an order */\n onCancel: (orderId: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OpenOrdersUI({\n orders,\n isLoading,\n cancellingOrderId,\n onCancel,\n}: OpenOrdersUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n orders.map((order) => ({\n key: order.id,\n side: order.side,\n outcome: order.outcome,\n type: order.type,\n price: order.price,\n filled: `${order.filledQuantity}/${order.quantity}`,\n status: order.status,\n createdAt: formatDate(order.createdAt),\n isCancelling: order.id === cancellingOrderId,\n id: order.id,\n })),\n [orders, cancellingOrderId],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n {orders.length > 0 && (\n <span className=\"ml-1 text-default-400\">({orders.length})</span>\n )}\n </div>\n\n {orders.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.openOrders.empty\")}\n </div>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Open orders\"\n className=\"min-w-[600px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.openOrders.side\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.openOrders.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Type\" width={60}>\n {t(\"predict.openOrders.type\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.openOrders.price\")}\n </TableColumn>\n <TableColumn textValue=\"Filled\" width={80}>\n {t(\"predict.openOrders.filled\")}\n </TableColumn>\n <TableColumn textValue=\"Status\" width={70}>\n {t(\"predict.openOrders.status\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.openOrders.time\")}\n </TableColumn>\n <TableColumn textValue=\"Action\" width={80} align=\"end\">\n {\" \"}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.side === \"buy\" ? \"text-primary\" : \"text-danger\"\n }`}\n >\n {row.side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.type}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.filled}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.status}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"danger\"\n isLoading={row.isCancelling}\n onPress={() => onCancel(row.id)}\n >\n {t(\"predict.openOrders.cancel\")}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. See open-orders.script.tsx for alternatives.\n */\nimport { useOpenOrders } from \"./open-orders.script\";\nimport { OpenOrdersUI } from \"./open-orders.ui\";\n\nexport interface OpenOrdersWidgetProps {\n /** Polling interval in ms (default 10000, 0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated This widget is deprecated. Use swap-based order model instead.\n */\nexport function OpenOrdersWidget({\n refetchInterval,\n}: OpenOrdersWidgetProps = {}) {\n const { orders, isLoading, cancellingOrderId, cancelOrder } = useOpenOrders({\n refetchInterval,\n });\n\n return (\n <OpenOrdersUI\n orders={orders}\n isLoading={isLoading}\n cancellingOrderId={cancellingOrderId}\n onCancel={cancelOrder}\n />\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type {\n SingleTradeResponse,\n TradesQueryParams,\n MultiTradeResponse,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeHistoryParams {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size */\n pageSize?: number;\n}\n\nexport interface UseTradeHistoryResult {\n /** Current page of trades */\n trades: SingleTradeResponse[];\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Page size */\n pageSize: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Navigate to a specific page */\n goToPage: (page: number) => void;\n /** Go to the next page */\n nextPage: () => void;\n /** Go to the previous page */\n prevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeHistory({\n ticker,\n pageSize = DEFAULT_PAGE_SIZE,\n}: UseTradeHistoryParams = {}): UseTradeHistoryResult {\n const [page, setPage] = useState(1);\n const [cursors, setCursors] = useState<(string | undefined)[]>([undefined]);\n\n const currentCursor = cursors[page - 1];\n\n const queryParams = useMemo<TradesQueryParams>(\n () => ({\n ...(ticker ? { ticker } : {}),\n limit: pageSize,\n ...(currentCursor ? { cursor: currentCursor } : {}),\n }),\n [ticker, pageSize, currentCursor],\n );\n\n const { data, isLoading, isFetching } = useTradesQuery(queryParams);\n\n const response = data as MultiTradeResponse | undefined;\n\n const trades = response?.trades ?? [];\n const hasNextPage = !!response?.cursor;\n const hasPrevPage = page > 1;\n\n const goToPage = useCallback(\n (p: number) => {\n if (p >= 1 && p <= cursors.length) setPage(p);\n },\n [cursors.length],\n );\n\n const nextPage = useCallback(() => {\n if (hasNextPage && response?.cursor) {\n setCursors((prev) => {\n const newCursors = [...prev];\n if (newCursors.length === page) {\n newCursors.push(response.cursor!);\n }\n return newCursors;\n });\n setPage((prev) => prev + 1);\n }\n }, [hasNextPage, response?.cursor, page]);\n\n const prevPage = useCallback(() => {\n if (hasPrevPage) setPage((prev) => prev - 1);\n }, [hasPrevPage]);\n\n return {\n trades,\n isLoading,\n isFetching,\n page,\n pageSize,\n hasNextPage,\n hasPrevPage,\n goToPage,\n nextPage,\n prevPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"@liberfi.io/ui\";\nimport type { SingleTradeResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeHistoryUIProps {\n /** List of trades for current page */\n trades: SingleTradeResponse[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Go to next page */\n onNextPage: () => void;\n /** Go to previous page */\n onPrevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(timestamp: number): string {\n const d = new Date(timestamp * 1000);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeHistoryUI({\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n onNextPage,\n onPrevPage,\n}: TradeHistoryUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n trades.map((trade) => ({\n key: trade.tradeId,\n ticker: trade.ticker,\n takerSide: trade.takerSide,\n price: trade.price,\n yesPrice: trade.yesPrice,\n noPrice: trade.noPrice,\n count: trade.count,\n createdAt: formatDate(trade.createdTime),\n })),\n [trades],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n ) : (\n <>\n <div\n className={`w-full overflow-x-auto ${isFetching ? \"opacity-60\" : \"\"}`}\n >\n <StyledTable\n radius=\"none\"\n aria-label=\"Trade history\"\n className=\"min-w-[480px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.tradeHistory.side\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={80}>\n {t(\"predict.tradeHistory.price\")}\n </TableColumn>\n <TableColumn textValue=\"Yes\" width={60}>\n {t(\"predict.trade.yes\")}\n </TableColumn>\n <TableColumn textValue=\"No\" width={60}>\n {t(\"predict.trade.no\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={60}>\n {t(\"predict.tradeHistory.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.tradeHistory.time\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.takerSide === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.takerSide === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-primary\">\n {row.yesPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-secondary\">\n {row.noPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.count}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Pagination */}\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasPrevPage}\n onPress={onPrevPage}\n startContent={<ChevronLeftIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.prev\")}\n </Button>\n <span className=\"text-xs text-default-500\">\n {t(\"predict.pagination.page\", { page })}\n </span>\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasNextPage}\n onPress={onNextPage}\n endContent={<ChevronRightIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.next\")}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useTradeHistory } from \"./trade-history.script\";\nimport { TradeHistoryUI } from \"./trade-history.ui\";\n\nexport interface TradeHistoryWidgetProps {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n pageSize?: number;\n}\n\nexport function TradeHistoryWidget({\n ticker,\n pageSize,\n}: TradeHistoryWidgetProps = {}) {\n const {\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n nextPage,\n prevPage,\n } = useTradeHistory({ ticker, pageSize });\n\n return (\n <TradeHistoryUI\n trades={trades}\n isLoading={isLoading}\n isFetching={isFetching}\n page={page}\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onNextPage={nextPage}\n onPrevPage={prevPage}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. To track positions, you need to query user's token\n * balances for outcome mint addresses and calculate positions manually.\n *\n * Use `useOutcomeMintsQuery` and `useMarketsBatchQuery` to build positions\n * from on-chain data.\n */\nimport { useMemo } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePositionsParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Position type - not provided by new API\n */\nexport interface Position {\n id: string;\n marketId: string;\n marketTitle: string;\n outcome: \"yes\" | \"no\";\n quantity: number;\n avgPrice: number;\n avgCostBasis: number;\n currentPrice: number;\n unrealizedPnl: number;\n realizedPnl: number;\n}\n\nexport interface PositionsSummary {\n /** Total market value in cents */\n totalValue: number;\n /** Total unrealised PnL in cents */\n totalUnrealizedPnl: number;\n /** Total realised PnL in cents */\n totalRealizedPnl: number;\n /** Number of positions */\n count: number;\n}\n\nexport interface UsePositionsResult {\n /** Positions list */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Aggregated summary across all positions */\n summary: PositionsSummary;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API does not provide\n * positions data. Use on-chain token balance queries instead.\n */\nexport function usePositions(\n _params: UsePositionsParams = {},\n): UsePositionsResult {\n // Return empty positions - API no longer supports this\n const summary = useMemo<PositionsSummary>(\n () => ({\n totalValue: 0,\n totalUnrealizedPnl: 0,\n totalRealizedPnl: 0,\n count: 0,\n }),\n [],\n );\n\n return {\n positions: [],\n isLoading: false,\n isFetching: false,\n summary,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { Position, PositionsSummary } from \"./positions.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PositionsUIProps {\n /** List of positions */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Aggregated summary */\n summary: PositionsSummary;\n /** Callback when a position's sell button is clicked */\n onSell?: (position: Position) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst fmtCents = (cents: number) => formatAmountUSDCompact(cents / 100);\n\nfunction PnlText({ value }: { value: number }) {\n if (value === 0) {\n return <span className=\"text-default-500\">{fmtCents(0)}</span>;\n }\n const isPositive = value > 0;\n return (\n <span className={isPositive ? \"text-success\" : \"text-danger\"}>\n {isPositive ? \"+\" : \"\"}\n {fmtCents(value)}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PositionsUI({\n positions,\n isLoading,\n summary,\n onSell,\n}: PositionsUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n positions.map((pos) => ({\n key: `${pos.marketId}-${pos.outcome}`,\n marketTitle: pos.marketTitle,\n outcome: pos.outcome,\n quantity: pos.quantity,\n avgCost: pos.avgCostBasis,\n currentPrice: pos.currentPrice,\n value: pos.currentPrice * pos.quantity,\n unrealizedPnl: pos.unrealizedPnl,\n position: pos,\n })),\n [positions],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.positions.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.positions.title\")}\n {positions.length > 0 && (\n <span className=\"ml-1 text-default-400\">({positions.length})</span>\n )}\n </span>\n </div>\n\n {positions.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.positions.empty\")}\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Positions\"\n className=\"min-w-[640px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Market\" width={200}>\n {t(\"predict.positions.market\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.positions.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={50}>\n {t(\"predict.positions.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Avg Cost\" width={70}>\n {t(\"predict.positions.avgCost\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.positions.currentPrice\")}\n </TableColumn>\n <TableColumn textValue=\"Value\" width={80}>\n {t(\"predict.positions.value\")}\n </TableColumn>\n <TableColumn textValue=\"PnL\" width={80}>\n {t(\"predict.positions.pnl\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow\n key={row.key}\n className={\n onSell ? \"cursor-pointer hover:bg-default-50\" : \"\"\n }\n onClick={() => onSell?.(row.position)}\n >\n <TableCell>\n <span className=\"text-xs font-medium line-clamp-1\">\n {row.marketTitle}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.quantity}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.avgCost}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.currentPrice}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{fmtCents(row.value)}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">\n <PnlText value={row.unrealizedPnl} />\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Summary footer */}\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2 text-xs\">\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.totalValue\")}:{\" \"}\n <span className=\"font-medium text-foreground\">\n {fmtCents(summary.totalValue)}\n </span>\n </span>\n </div>\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.unrealizedPnl\")}:{\" \"}\n <PnlText value={summary.totalUnrealizedPnl} />\n </span>\n <span className=\"text-default-500\">\n {t(\"predict.positions.realizedPnl\")}:{\" \"}\n <PnlText value={summary.totalRealizedPnl} />\n </span>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. See positions.script.tsx for alternatives.\n */\nimport { usePositions, type Position } from \"./positions.script\";\nimport { PositionsUI } from \"./positions.ui\";\n\nexport interface PositionsWidgetProps {\n /** Polling interval in ms (default 15000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a position's sell action is triggered */\n onSell?: (position: Position) => void;\n}\n\n/**\n * @deprecated This widget is deprecated. Use on-chain token balance queries instead.\n */\nexport function PositionsWidget({\n refetchInterval,\n onSell,\n}: PositionsWidgetProps = {}) {\n const { positions, isLoading, summary } = usePositions({ refetchInterval });\n\n return (\n <PositionsUI\n positions={positions}\n isLoading={isLoading}\n summary={summary}\n onSell={onSell}\n />\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { PredictContext } from \"../contexts\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /** The predict API client instance */\n client: IPredictClient;\n /** WebSocket client instance (optional, enables WebSocket features) */\n wsClient?: IPredictWsClient | null;\n}>;\n\nexport function PredictProvider({\n client,\n wsClient = null,\n children,\n}: PredictProviderProps) {\n const value = useMemo(\n () => ({\n client,\n wsClient,\n }),\n [client, wsClient],\n );\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n"]}
|